/ Hex Artifact Content
Login

Artifact 2401eee14a4309a7cfe2aeb2f30ad517a1d9c299:


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 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1950: 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f   clang_sanitize_
1960: 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a 2a 20 52  address .**.** R
1970: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
1980: 68 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 63  he program was c
1990: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 63 6c  ompiled using cl
19a0: 61 6e 67 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ang with the .**
19b0: 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61 64 64 72   -fsanitize=addr
19c0: 65 73 73 20 73 77 69 74 63 68 20 6f 6e 20 74 68  ess switch on th
19d0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  e command line. 
19e0: 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
19f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a00: 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64  lang_sanitize_ad
1a10: 64 72 65 73 73 28 0a 20 20 76 6f 69 64 20 2a 4e  dress(.  void *N
1a20: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
1a30: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1a40: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1a50: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1a60: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1a70: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1aa0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
1ab0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
1ac0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1ad0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1ae0: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 23    int res = 0;.#
1af0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68 61 73  if defined(__has
1b00: 5f 66 65 61 74 75 72 65 29 0a 23 20 69 66 20 5f  _feature).# if _
1b10: 5f 68 61 73 5f 66 65 61 74 75 72 65 28 61 64 64  _has_feature(add
1b20: 72 65 73 73 5f 73 61 6e 69 74 69 7a 65 72 29 0a  ress_sanitizer).
1b30: 20 20 72 65 73 20 3d 20 31 3b 0a 23 20 65 6e 64    res = 1;.# end
1b40: 69 66 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  if.#endif.  Tcl_
1b50: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1b60: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1b70: 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75  bj(res));.  retu
1b80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a  rn TCL_OK;.}.  .
1b90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1ba0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1bb0: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
1bc0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  TRING.**.** Invo
1bd0: 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ke the sqlite3_e
1be0: 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e 74  xec_printf() int
1bf0: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
1c00: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
1c10: 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69  * DB.  The SQL i
1c20: 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52  s the string FOR
1c30: 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74  MAT.  The format
1c40: 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63   string should c
1c50: 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73  ontain.** one %s
1c60: 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20   or %q.  STRING 
1c70: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73  is the value ins
1c80: 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72  erted into %s or
1c90: 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   %q..*/.static i
1ca0: 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72 69  nt test_exec_pri
1cb0: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
1cc0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1cd0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1ce0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1cf0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1d00: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1d10: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1d40: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1d50: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1d60: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1d70: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1d80: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
1d90: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
1da0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1db0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
1dc0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1dd0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
1de0: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
1df0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e20: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e30: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52  .       " DB FOR
1e40: 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b  MAT STRING", 0);
1e50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e70: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e80: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1e90: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1ea0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
1eb0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
1ec0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1ed0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
1ee0: 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72  ], argv[3]);.  r
1ef0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f00: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f  (db, zSql, exec_
1f10: 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c  printf_cb, &str,
1f20: 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74   &zErr);.  sqlit
1f30: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1f40: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1f50: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
1f60: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1f70: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54  terp, zBuf);.  T
1f80: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
1f90: 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c  (interp, rc==SQL
1fa0: 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74  ITE_OK ? Tcl_DSt
1fb0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20  ringValue(&str) 
1fc0: 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44  : zErr);.  Tcl_D
1fd0: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
1fe0: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
1ff0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2000: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2010: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
2020: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
2030: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2040: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2060: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68    sqlite3_exec_h
2070: 65 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a  ex  DB  HEX.**.*
2080: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
2090: 69 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61  ite3_exec() on a
20a0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
20b0: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e  obtained by tran
20c0: 73 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69  slating.** HEX i
20d0: 6e 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74  nto ASCII.  Most
20e0: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
20f0: 74 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73  translated as is
2100: 2e 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a  .  %HH becomes.*
2110: 2a 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65  * a hex characte
2120: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2130: 20 74 65 73 74 5f 65 78 65 63 5f 68 65 78 28 0a   test_exec_hex(.
2140: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2150: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2160: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2170: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2180: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2190: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21a0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
21b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21d0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
21e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
21f0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2200: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2210: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2220: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2230: 20 72 63 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61   rc, i, j;.  cha
2240: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
2250: 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61  har *zHex;.  cha
2260: 72 20 7a 53 71 6c 5b 35 30 30 5d 3b 0a 20 20 63  r zSql[500];.  c
2270: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2280: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2290: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22b0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22c0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
22d0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
22e0: 48 45 58 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  HEX", 0);.    re
22f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2300: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2310: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2320: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2340: 0a 20 20 7a 48 65 78 20 3d 20 61 72 67 76 5b 32  .  zHex = argv[2
2350: 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  ];.  for(i=j=0; 
2360: 69 3c 73 69 7a 65 6f 66 28 7a 53 71 6c 29 20 26  i<sizeof(zSql) &
2370: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2380: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
2390: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
23a0: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
23b0: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
23c0: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
23d0: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
23e0: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
23f0: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
2400: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
2410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
2420: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
2430: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
2440: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
2450: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2460: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
2470: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2480: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
2490: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
24a0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
24b0: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
24c0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
24d0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
24e0: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
24f0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
2500: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
2510: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
2520: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
2530: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
2540: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
2550: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2560: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
2570: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
2580: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
2590: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25a0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
25c0: 3a 20 20 64 62 5f 65 6e 74 65 72 20 44 42 0a 2a  :  db_enter DB.*
25d0: 2a 20 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  *         db_lea
25e0: 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20 45 6e 74 65  ve DB.**.** Ente
25f0: 72 20 6f 72 20 6c 65 61 76 65 20 74 68 65 20 6d  r or leave the m
2600: 75 74 65 78 20 6f 6e 20 61 20 64 61 74 61 62 61  utex on a databa
2610: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
2620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
2630: 65 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e  enter(.  void *N
2640: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2650: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2660: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2670: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2680: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2690: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26c0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
26d0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
26e0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
26f0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2700: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2710: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
2720: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2730: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
2740: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
2750: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
2760: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
2770: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2790: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
27a0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
27b0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
27c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
27e0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
27f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2800: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  .}.static int db
2810: 5f 6c 65 61 76 65 28 0a 20 20 76 6f 69 64 20 2a  _leave(.  void *
2820: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
2830: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2840: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2850: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2860: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2870: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
2880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2890: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
28a0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
28b0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
28c0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
28d0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
28e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
28f0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
2900: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2910: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2920: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2930: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2940: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2950: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
2960: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2970: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2980: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
2990: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
29a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
29c0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
29d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
29f0: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  :  sqlite3_exec 
2a00: 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49   DB  SQL.**.** I
2a10: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
2a20: 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65  3_exec interface
2a30: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
2a40: 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f 0a 73  database DB.*/.s
2a50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
2a60: 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  xec(.  void *Not
2a70: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2a80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2a90: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2aa0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2ab0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2ac0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ae0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2af0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2b00: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2b10: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2b20: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2b30: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2b40: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2b50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2b60: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
2b70: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
2b80: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75  i, j;.  char zBu
2b90: 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67  f[30];.  if( arg
2ba0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2bb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2bc0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2bd0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2be0: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
2bf0: 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
2c00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2c10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2c20: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2c30: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2c40: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
2c60: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
2c70: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2c80: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
2c90: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f  , argv[2]);.  fo
2ca0: 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b 69 5d  r(i=j=0; zSql[i]
2cb0: 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  ;){.    if( zSql
2cc0: 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [i]=='%' ){.    
2cd0: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 28 74    zSql[j++] = (t
2ce0: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2cf0: 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73  [i+1])<<4) + tes
2d00: 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69  tHexToInt(zSql[i
2d10: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  +2]);.      i +=
2d20: 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
2d30: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
2d40: 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20 20 20   zSql[i++];.    
2d50: 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a 5d 20  }.  }.  zSql[j] 
2d60: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
2d70: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2d80: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2d90: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2da0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2db0: 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66  zSql);.  sprintf
2dc0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29  (zBuf, "%d", rc)
2dd0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2de0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
2df0: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
2e00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2e10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
2e20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
2e30: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
2e40: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2e50: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
2e60: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
2e70: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
2e80: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2e90: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2ea0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2eb0: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2ec0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2ed0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2ee0: 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53  3_exec_nr  DB  S
2ef0: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
2f00: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
2f10: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
2f20: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2f30: 73 65 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a  se DB.  Discard.
2f40: 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a  ** all results.*
2f50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2f60: 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69  t_exec_nr(.  voi
2f70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2f80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2f90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2fa0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2fb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2fc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2fd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2fe0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2ff0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3000: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3010: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3020: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3030: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3040: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
3050: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
3060: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
3070: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3080: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
3090: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
30a0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
30b0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
30c0: 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
30d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
30e0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
30f0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
3100: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
3110: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3120: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3130: 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
3140: 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  ], 0, 0, &zErr);
3150: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
3160: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
3170: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
3180: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3190: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
31a0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
31b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
31c0: 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54 4f  z_test  SEPARATO
31d0: 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e  R  ARG0  ARG1 ..
31e0: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ..**.** Test the
31f0: 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71   %z format of sq
3200: 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20  lite_mprintf(). 
3210: 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70   Use multiple mp
3220: 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f  rintf() calls to
3230: 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65   .** concatenate
3240: 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61 72   arg0 through ar
3250: 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  gn using separat
3260: 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72 61  or as the separa
3270: 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  tor..** Return t
3280: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
3290: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70  atic int test_mp
32a0: 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20  rintf_z(.  void 
32b0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
32c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
32d0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
32e0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
32f0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3300: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3310: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3320: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3330: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3340: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3350: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3360: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3370: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  {.  char *zResul
3380: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
3390: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72  .  for(i=2; i<ar
33a0: 67 63 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a  gc && (i==2 || z
33b0: 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  Result); i++){. 
33c0: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c     zResult = sql
33d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
33e0: 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20  %s%s", zResult, 
33f0: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d  argv[1], argv[i]
3400: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
3410: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3420: 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  , zResult, 0);. 
3430: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
3440: 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
3450: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3460: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
3470: 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
3480: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54    STRING.**.** T
3490: 65 73 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61  est the %n forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74  ntf().  Return t
34c0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
34d0: 0a 2a 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67  .** input string
34e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34f0: 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a  test_mprintf_n(.
3500: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3510: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3520: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3530: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3540: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3550: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3560: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3580: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3590: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
35a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
35b0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
35c0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
35d0: 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d  *zStr;.  int n =
35e0: 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c   0;.  zStr = sql
35f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
3600: 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  %n", argv[1], &n
3610: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3620: 65 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53  e(zStr);.  Tcl_S
3630: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3640: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
3650: 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(n));.  return 
3660: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
3670: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3680: 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53  _snprintf_int  S
3690: 49 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a  IZE FORMAT  INT.
36a0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f  **.** Test the o
36b0: 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  f sqlite3_snprin
36c0: 74 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  tf() routine.  S
36d0: 49 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65 20  IZE is the size 
36e0: 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
36f0: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
3700: 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  .  The maximum s
3710: 69 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52  ize is 100.  FOR
3720: 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f  MAT is the.** fo
3730: 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e  rmat string.  IN
3740: 54 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  T is a single in
3750: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
3760: 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73   The FORMAT.** s
3770: 74 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69  tring must requi
3780: 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  re no more than 
3790: 74 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72  this one integer
37a0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a   argument.  If.*
37b0: 2a 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20  * You pass in a 
37c0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68  format string th
37d0: 61 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65  at requires more
37e0: 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65   than one argume
37f0: 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67  nt,.** bad thing
3800: 73 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a  s will happen..*
3810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3820: 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a  t_snprintf_int(.
3830: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3840: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3850: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3860: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3870: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3880: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3890: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
38a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
38c0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
38d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
38e0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
38f0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
3900: 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74  zStr[100];.  int
3910: 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31   n = atoi(argv[1
3920: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
3930: 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76   *zFormat = argv
3940: 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20  [2];.  int a1 = 
3950: 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20  atoi(argv[3]);. 
3960: 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53   if( n>sizeof(zS
3970: 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66  tr) ) n = sizeof
3980: 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zStr);.  sqlite
3990: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
39a0: 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22  f(zStr), zStr, "
39b0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
39c0: 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20  qrstuvwxyz");.  
39d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
39e0: 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61  (n, zStr, zForma
39f0: 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70  t, a1);.  Tcl_Ap
3a00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3a10: 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72  p, zStr, 0);.  r
3a20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3a30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a40: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a  OMIT_GET_TABLE..
3a50: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3a60: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
3a70: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
3a80: 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e  AT  STRING  ?--n
3a90: 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20  o-counts?.**.** 
3aa0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
3ab0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
3ac0: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
3ad0: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
3ae0: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
3af0: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
3b00: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
3b10: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
3b20: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
3b30: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
3b40: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
3b50: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
3b60: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
3b70: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3b80: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b90: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
3ba0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3bb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3bc0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3bd0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3be0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3bf0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3c10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3c20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3c30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3c40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3c50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
3c60: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c  lite3 *db;.  Tcl
3c70: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3c80: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3c90: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
3ca0: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
3cb0: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
3cc0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
3cd0: 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[30];.  char *
3ce0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43  zSql;.  int resC
3cf0: 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ount = -1;.  if(
3d00: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
3d10: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
3d20: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
3d30: 26 72 65 73 43 6f 75 6e 74 29 20 29 20 72 65 74  &resCount) ) ret
3d40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3d50: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34   }.  if( argc!=4
3d60: 20 26 26 20 61 72 67 63 21 3d 35 20 29 7b 0a 20   && argc!=5 ){. 
3d70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3d80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
3d90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
3da0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3db0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
3dc0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 20 3f 43  FORMAT STRING ?C
3dd0: 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20  OUNT?", 0);.    
3de0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3df0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3e00: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3e10: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3e30: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
3e40: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
3e50: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
3e60: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67  intf(argv[2],arg
3e70: 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 61 72 67  v[3]);.  if( arg
3e80: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==5 ){.    rc =
3e90: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
3ea0: 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52  le(db, zSql, &aR
3eb0: 65 73 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45  esult, 0, 0, &zE
3ec0: 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
3ed0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
3ee0: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
3ef0: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  l, &aResult, &nR
3f00: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72  ow, &nCol, &zErr
3f10: 29 3b 0a 20 20 20 20 72 65 73 43 6f 75 6e 74 20  );.    resCount 
3f20: 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b  = (nRow+1)*nCol;
3f30: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
3f40: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
3f50: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3f60: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
3f70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3f80: 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
3f90: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3fa0: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20      if( argc==4 
3fb0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
3fc0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f  (zBuf, "%d", nRo
3fd0: 77 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  w);.      Tcl_Ap
3fe0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ff0: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  rp, zBuf);.     
4000: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
4010: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
4020: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
4030: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
4040: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4050: 28 69 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74  (i=0; i<resCount
4060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
4070: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4080: 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c 74 5b  interp, aResult[
4090: 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20  i] ? aResult[i] 
40a0: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  : "NULL");.    }
40b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
40c0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
40d0: 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20  interp, zErr);. 
40e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
40f0: 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c 74 29  e_table(aResult)
4100: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
4110: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
4120: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
4130: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
4140: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
4150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4160: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4170: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
4180: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
4190: 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55  BLE */.../*.** U
41a0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c  sage:  sqlite3_l
41b0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
41c0: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
41d0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f  s the integer RO
41e0: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
41f0: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a  recent insert..*
4200: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4210: 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20  t_last_rowid(.  
4220: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4230: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4240: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4250: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4260: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4270: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4280: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
42b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
42c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
42d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
42e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
42f0: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
4300: 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[30];..  if( ar
4310: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4320: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4330: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4340: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4350: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
4360: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
4370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4380: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
4390: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
43a0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
43b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
43c0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
43d0: 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33   "%lld", sqlite3
43e0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
43f0: 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  id(db));.  Tcl_A
4400: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4410: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
4420: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4440: 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44  :  sqlite3_key D
4450: 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20  B KEY.**.** Set 
4460: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4480: 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  t_key(.  void *N
4490: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
44a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
44b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
44c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
44d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
44e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4500: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4510: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4520: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4530: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
4540: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4550: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
4560: 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65  S_CODEC.  sqlite
4570: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
4580: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
4590: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
45a0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
45b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
45c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
45d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
45e0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
45f0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4600: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4620: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
4630: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
4640: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
4650: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
4660: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
4670: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
4680: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Key);.  sqlite3_
4690: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
46a0: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
46b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
46c0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
46d0: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
46e0: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
46f0: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4700: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4710: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
4720: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4730: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4740: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4750: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4760: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4770: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4780: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4790: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
47a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
47b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
47c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
47d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
47e0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
47f0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
4800: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4810: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4820: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4830: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4840: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4850: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4860: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4870: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4880: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4890: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
48a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
48b0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
48c0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
48d0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
48e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
48f0: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
4900: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4910: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
4920: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
4930: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4950: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4960: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
4970: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
4980: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
4990: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
49a0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
49b0: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
49c0: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
49d0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
49e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
49f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4a00: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4a10: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4a20: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a40: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4a50: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4a60: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4a70: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4a80: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4a90: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4aa0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4ab0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4ac0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4ad0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4ae0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4af0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4b00: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4b10: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4b20: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4b30: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4b40: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4b50: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4b60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4b70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4b80: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
4b90: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
4ba0: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
4bb0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
4bc0: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
4bd0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4be0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4bf0: 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a 0a 2a  close_v2 DB.**.*
4c00: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4c10: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4c20: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4c30: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4c40: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32  te_test_close_v2
4c50: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4c60: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4c70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4c80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4c90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4ca0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4cb0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4cd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4ce0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d00: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4d10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4d20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
4d30: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
4d40: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4d60: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4d70: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4d80: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4d90: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4da0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4db0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4dc0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4dd0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4de0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4df0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
4e00: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4e10: 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  2(db);.  Tcl_Set
4e20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
4e30: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
4e40: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
4e50: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
4e60: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
4e70: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4e80: 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28   the x_coalesce(
4e90: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52  ) function..** R
4ea0: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
4eb0: 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c  argument non-NUL
4ec0: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  L argument..*/.s
4ed0: 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66  tatic void t1_if
4ee0: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
4ef0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4f00: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4f10: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4f20: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
4f30: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4f40: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
4f50: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4f60: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
4f70: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
4f80: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
4f90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4fa0: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
4fb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4fc0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
4fd0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
4fe0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
4ff0: 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  i]),.          n
5000: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5010: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
5020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5030: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
5040: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  est functions.  
5050: 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72    hex8() interpr
5060: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
5070: 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20   as.** UTF8 and 
5080: 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e  returns a hex en
5090: 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65  coding.  hex16le
50a0: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
50b0: 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73  s argument.** as
50c0: 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74   UTF16le and ret
50d0: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
50e0: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
50f0: 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c  oid hex8Func(sql
5100: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5110: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5120: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5130: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5140: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
5150: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
5160: 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [200];.  z = sql
5170: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5180: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
5190: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
51a0: 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69  uf)/2 - 2 && z[i
51b0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72  ]; i++){.    spr
51c0: 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d 2c  intf(&zBuf[i*2],
51d0: 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30 78   "%02x", z[i]&0x
51e0: 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ff);.  }.  zBuf[
51f0: 69 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  i*2] = 0;.  sqli
5200: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5210: 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20  p, (char*)zBuf, 
5220: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
5230: 49 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  IENT);.}.#ifndef
5240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
5250: 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  16.static void h
5260: 65 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65 33  ex16Func(sqlite3
5270: 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  _context *p, int
5280: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5290: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
52a0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 73  const unsigned s
52b0: 68 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69  hort int *z;.  i
52c0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75  nt i;.  char zBu
52d0: 66 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71  f[400];.  z = sq
52e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
52f0: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66  16(argv[0]);.  f
5300: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5310: 28 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26 20  (zBuf)/4 - 4 && 
5320: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
5330: 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a  sprintf(&zBuf[i*
5340: 34 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69 5d  4], "%04x", z[i]
5350: 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42  &0xff);.  }.  zB
5360: 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73  uf[i*4] = 0;.  s
5370: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5380: 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75  xt(p, (char*)zBu
5390: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
53a0: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64  ANSIENT);.}.#end
53b0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  if../*.** A stru
53c0: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
53d0: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
53e0: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
53f0: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
5400: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
5410: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
5420: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
5430: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
5440: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
5450: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
5460: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
5470: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
5480: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
5490: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
54a0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
54b0: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
54c0: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
54d0: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
54e0: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
54f0: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
5500: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
5510: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
5520: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
5530: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
5540: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5550: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
5560: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
5570: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
5580: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29  lite3_free(p->z)
5590: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
55a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
55b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
55c0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
55d0: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
55e0: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
55f0: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
5600: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
5610: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
5620: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
5630: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
5640: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
5650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5660: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
5670: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
5680: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
5690: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
56a0: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
56b0: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
56c0: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
56d0: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
56e0: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
56f0: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
5700: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
5710: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
5720: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5730: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
5740: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
5750: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
5760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5770: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
5780: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
5790: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
57a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
57b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
57c0: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
57d0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
57e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
57f0: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
5800: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
5810: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
5820: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
5830: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
5840: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
5850: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
5860: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
5870: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
5880: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
5890: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
58a0: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
58b0: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
58c0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
58d0: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
58e0: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
58f0: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5900: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5910: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5920: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
5930: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
5940: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
5950: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
5960: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
5970: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
5980: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
5990: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
59a0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
59b0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
59c0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
59d0: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
59e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
59f0: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5a00: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5a10: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5a20: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5a30: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
5a40: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5a50: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5a60: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
5a70: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
5a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5a90: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5aa0: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5ab0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5ac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5ad0: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
5ae0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5af0: 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29  of tkt2213func()
5b00: 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  , a scalar funct
5b10: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65  ion that takes e
5b20: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72  xactly.** one ar
5b30: 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74  gument. It has t
5b40: 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  wo interesting f
5b50: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a  eatures:.**.** *
5b60: 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   It calls sqlite
5b70: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33  3_value_text() 3
5b80: 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72   times on the ar
5b90: 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  gument sqlite3_v
5ba0: 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74  alue*..**   If t
5bb0: 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72  he three pointer
5bc0: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e  s returned are n
5bd0: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53  ot the same an S
5be0: 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  QL error is rais
5bf0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65  ed..**.** * Othe
5c00: 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73  rwise it returns
5c10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
5c20: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
5c30: 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20  on of its .**   
5c40: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
5c50: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
5c60: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
5c70: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
5c80: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
5c90: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
5ca0: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5cb0: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5cc0: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5cd0: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5ce0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5cf0: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5d00: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5d10: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5d20: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5d30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5d40: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
5d50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5d60: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5d70: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
5d80: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5d90: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
5da0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5db0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
5dc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5dd0: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
5de0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
5df0: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
5e00: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
5e10: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
5e20: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
5e30: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5e40: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
5e50: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
5e60: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5e70: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
5e80: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5e90: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
5ea0: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
5eb0: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
5ec0: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
5ed0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5ee0: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
5ef0: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
5f00: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
5f10: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
5f20: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5f30: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
5f40: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
5f50: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
5f60: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
5f70: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5f80: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
5f90: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
5fa0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5fb0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
5fc0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
5fd0: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
5fe0: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
5ff0: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
6000: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
6010: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
6020: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
6030: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
6040: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
6050: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
6060: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6070: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
6080: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6090: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
60a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
60b0: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
60c0: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
60d0: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
60e0: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
60f0: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
6100: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
6110: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
6120: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6130: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
6140: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
6150: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
6160: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
6170: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
6180: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
6190: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
61a0: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
61b0: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
61c0: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
61d0: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
61e0: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
61f0: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
6200: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
6210: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
6220: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
6230: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
6240: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6250: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
6260: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
6270: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
6280: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
6290: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
62a0: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
62b0: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
62c0: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
62d0: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
62e0: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
62f0: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
6300: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6310: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
6320: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
6330: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6340: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
6350: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
6360: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
6370: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
6380: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
6390: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
63a0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
63b0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
63c0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
63d0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
63e0: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
63f0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
6400: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
6410: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6420: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6430: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
6440: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6450: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
6460: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6470: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6480: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6490: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
64a0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
64b0: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
64c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
64d0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
64e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
64f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
6500: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
6510: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
6520: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6530: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6540: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
6550: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6560: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6570: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
6580: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6590: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
65a0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
65b0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
65c0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65d0: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
65e0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
65f0: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6600: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
6610: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6620: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
6630: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
6640: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
6650: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6660: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6670: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6680: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6690: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
66a0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
66b0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
66c0: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
66d0: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
66e0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
66f0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6700: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
6710: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6720: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6730: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
6740: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
6750: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6760: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6770: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6780: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6790: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
67a0: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
67b0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
67c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
67d0: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
67e0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
67f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6800: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6810: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
6820: 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66  /*.** This SQL f
6830: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6840: 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77  a different answ
6850: 65 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  er each time it 
6860: 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65 6e 20  is called, even 
6870: 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  if.** the argume
6880: 6e 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  nts are the same
6890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68a0: 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69   nondeterministi
68b0: 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  cFunction(.  sql
68c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
68d0: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
68e0: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
68f0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6900: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
6910: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6920: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6930: 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f  xt, cnt++);.}../
6940: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
6950: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6960: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
6970: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
6980: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
6990: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
69a0: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
69b0: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
69c0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
69d0: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
69e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
69f0: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6a00: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6a10: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6a20: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6a30: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6a40: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6a50: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6a60: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6a70: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
6a80: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
6a90: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
6aa0: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
6ab0: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
6ac0: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
6ad0: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6ae0: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6af0: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6b00: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6b10: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6b20: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6b30: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6b40: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6b50: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6b60: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6b70: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
6b80: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
6b90: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
6ba0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
6bb0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
6bc0: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
6bd0: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6be0: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6bf0: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6c00: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6c10: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6c20: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6c30: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6c40: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6c50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6c60: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6c70: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6c80: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6c90: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6ca0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6cb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6cc0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6cd0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6ce0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6cf0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6d00: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6d10: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6d20: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6d30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6d40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6d50: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
6d60: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
6d70: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
6d80: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
6d90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6da0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
6db0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
6dc0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
6dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6de0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
6df0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
6e00: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
6e10: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6e20: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
6e30: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
6e40: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
6e50: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6e60: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6e70: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
6e80: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
6e90: 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
6ea0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
6eb0: 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78 38           0, hex8
6ec0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
6ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6ee0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
6ef0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6f00: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6f10: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6f20: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
6f30: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  1, SQLITE_UTF16 
6f40: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
6f50: 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20 20  NISTIC,.        
6f60: 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c 20    0, hex16Func, 
6f70: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
6f80: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
6f90: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6fa0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6fb0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
6fc0: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
6fd0: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
6fe0: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
6ff0: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
7000: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7010: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7020: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7030: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7040: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
7050: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
7060: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7070: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
7080: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
7090: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f 75  /* Functions cou
70a0: 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75 6e  nter1() and coun
70b0: 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65 20  ter2() have the 
70c0: 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  same implementat
70d0: 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a 20  ion - they.  ** 
70e0: 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20 61  both return an a
70f0: 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65 72  scending integer
7100: 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 2e   with each call.
7110: 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28 29    But counter1()
7120: 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a 20   is marked.  ** 
7130: 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  as non-determini
7140: 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65 72  stic and counter
7150: 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61 73  2() is marked as
7160: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a   deterministic..
7170: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
7180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7190: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
71a0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
71b0: 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31 2c   "counter1", -1,
71c0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
71d0: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
71e0: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
71f0: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7200: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7210: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7220: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7230: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
7240: 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c 49  nter2", -1, SQLI
7250: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
7260: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20  ETERMINISTIC,.  
7270: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7280: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7290: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
72a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72b0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
72c0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
72d0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
72e0: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
72f0: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
7300: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
7310: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
7320: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
7330: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
7340: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7350: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7360: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
7370: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
7380: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7390: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
73a0: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
73b0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
73c0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
73d0: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
73e0: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
73f0: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
7400: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7410: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
7420: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
7430: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
7440: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
7450: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7460: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
7470: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7490: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
74a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
74b0: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
74d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
74e0: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
74f0: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
7500: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
7510: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
7520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7530: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7540: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
7550: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7560: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7570: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7580: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
7590: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
75a0: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
75b0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
75c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
75d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
75e0: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
75f0: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
7600: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
7610: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
7620: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
7630: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
7640: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
7650: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7660: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
7670: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
7680: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
7690: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
76a0: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
76b0: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
76c0: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
76d0: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
76e0: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
76f0: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
7700: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
7710: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
7720: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
7730: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
7740: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
7750: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7760: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
7770: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
7780: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
7790: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
77a0: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
77b0: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
77c0: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
77d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
77e0: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
77f0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7800: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7810: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7820: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7830: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7840: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7850: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7860: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7870: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7880: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7890: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
78a0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
78b0: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
78c0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
78d0: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
78e0: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
78f0: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7900: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7920: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7930: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
7940: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
7950: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
7960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7970: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
7980: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
7990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
79a0: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
79b0: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
79c0: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
79d0: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
79e0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
79f0: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
7a00: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
7a10: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
7a20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7a30: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
7a40: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
7a50: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7a60: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7a70: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7a80: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7a90: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7aa0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7ab0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7ac0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
7ad0: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
7ae0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7af0: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
7b00: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
7b10: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
7b20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7b30: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7b40: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7b50: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7b60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7b70: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
7b80: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7b90: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
7ba0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7bb0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7bc0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7bd0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7be0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
7bf0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7c00: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
7c10: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7c20: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
7c30: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
7c40: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
7c50: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
7c60: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
7c70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
7c80: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
7c90: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
7ca0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7cb0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7cc0: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7cd0: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7ce0: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7cf0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7d00: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7d10: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7d20: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7d30: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
7d40: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
7d50: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
7d60: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
7d70: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
7d80: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7d90: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
7da0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
7db0: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
7dc0: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
7dd0: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
7de0: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
7df0: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
7e00: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
7e10: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
7e20: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
7e30: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
7e40: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
7e50: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
7e60: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
7e70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7e80: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
7e90: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
7ea0: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
7eb0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
7ec0: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
7ed0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
7ee0: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
7ef0: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
7f00: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
7f10: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
7f20: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
7f30: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
7f40: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
7f50: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
7f60: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
7f70: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
7f80: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
7f90: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
7fa0: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
7fb0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
7fc0: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
7fd0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
7fe0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7ff0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
8000: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
8010: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
8020: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
8030: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8040: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8050: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8060: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8070: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8080: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8090: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
80a0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
80b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
80c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
80d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
80e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
80f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8100: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
8110: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
8120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8130: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
8140: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
8150: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8160: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8170: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8180: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8190: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
81a0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
81b0: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
81c0: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
81d0: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
81e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
81f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8200: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8210: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
8220: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8230: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
8240: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
8250: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8260: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8270: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8280: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8290: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
82a0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
82b0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
82c0: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
82d0: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
82e0: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
82f0: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
8300: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
8310: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8320: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
8330: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
8340: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
8350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8360: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8370: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8380: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8390: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
83a0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
83b0: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
83c0: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
83d0: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
83e0: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
83f0: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
8400: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
8410: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
8420: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
8430: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
8440: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
8450: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8460: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8470: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8480: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8490: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
84a0: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
84b0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
84c0: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
84d0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
84e0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
84f0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8500: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8510: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8520: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8530: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8540: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8550: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8560: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8580: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8590: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
85a0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
85b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
85c0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
85d0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
85e0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
85f0: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
8600: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8610: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8620: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
8630: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
8640: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
8650: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8660: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8670: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8680: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8690: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
86a0: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
86b0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
86c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
86d0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
86e0: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
86f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8700: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
8710: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8720: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8730: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8740: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8760: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8770: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8780: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8790: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
87a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
87b0: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
87c0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
87d0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
87e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
87f0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8800: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8810: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8820: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8830: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8850: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8860: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8870: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8880: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8890: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
88a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
88b0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
88c0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
88d0: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
88e0: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
88f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8900: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8910: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8920: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8930: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8940: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8950: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
8960: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8970: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8980: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8990: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
89a0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
89b0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
89c0: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
89d0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
89e0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
89f0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8a00: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8a10: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8a20: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8a30: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8a40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8a50: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8a60: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8a80: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8a90: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
8aa0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
8ab0: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
8ac0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8ad0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8ae0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8af0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8b00: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8b10: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8b20: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
8b30: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8b40: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8b50: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
8b60: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
8b70: 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ( sqlite3Atoi64(
8b80: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8b90: 2c 20 31 30 30 30 30 30 30 2c 20 53 51 4c 49 54  , 1000000, SQLIT
8ba0: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20  E_UTF8) ){.     
8bb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8bc0: 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d  t(interp, "argum
8bd0: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  ent is not a val
8be0: 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  id 64-bit intege
8bf0: 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  r", 0);.      re
8c00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8c10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20      }.  }.  z = 
8c20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8c30: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
8c40: 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63  [1], a[2]);.  Tc
8c50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8c60: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
8c70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
8c80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
8ca0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
8cb0: 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49  tf_long FORMAT I
8cc0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
8cd0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
8ce0: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
8cf0: 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65  hree long intege
8d00: 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54  r arguments.   T
8d10: 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 68 65  his might be the
8d20: 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69  .** same as sqli
8d30: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
8d40: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  or sqlite3_mprin
8d50: 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64  tf_int64, depend
8d60: 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f  ing on.** platfo
8d70: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
8d80: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8d90: 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20 2a  f_long(.  void *
8da0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8db0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8dc0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8dd0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8de0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8df0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8e10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8e20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8e30: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8e40: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8e50: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8e60: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67  .  int i;.  long
8e70: 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e 74   int a[3];.  int
8e80: 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   b[3];.  char *z
8e90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
8ea0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8eb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8ec0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8ed0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8ee0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8ef0: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8f00: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8f10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8f20: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8f30: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8f40: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8f50: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8f60: 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  b[i-2]) ) return
8f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8f80: 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20 69  a[i-2] = (long i
8f90: 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20 61  nt)b[i-2];.    a
8fa0: 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34 29  [i-2] &= (((u64)
8fb0: 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74 29  1)<<(sizeof(int)
8fc0: 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20  *8))-1;.  }.  z 
8fd0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8fe0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8ff0: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
9000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9010: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9020: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9030: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
9040: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9050: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9060: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
9070: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
9080: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
9090: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
90a0: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
90b0: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
90c0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
90d0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
90e0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a  e3_mprintf_str(.
90f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9100: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9110: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9120: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9130: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9140: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9150: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9170: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9180: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
91a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
91b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
91c0: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
91d0: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20  z;.  if( argc<4 
91e0: 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20  || argc>5 ){.   
91f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9200: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9210: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9220: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9230: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9240: 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47   INT INT ?STRING
9250: 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ?\"", 0);.    re
9260: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9270: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9280: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
9290: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
92a0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
92b0: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
92c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
92d0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
92e0: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
92f0: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
9300: 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c   ? argv[4] : NUL
9310: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
9320: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
9330: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
9340: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
9350: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
9360: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
9370: 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
9380: 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49  INTEGER FORMAT I
9390: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53  NTEGER INTEGER S
93a0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
93b0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
93c0: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
93d0: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69  nts and one stri
93e0: 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  ng argument.*/.s
93f0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9400: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a  3_snprintf_str(.
9410: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9420: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9430: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9440: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9450: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9460: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9470: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9480: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9490: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
94a0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
94b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
94c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
94d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
94e0: 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b  [3], i;.  int n;
94f0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9500: 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63  ( argc<5 || argc
9510: 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >6 ){.    Tcl_Ap
9520: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9530: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9540: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9550: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9560: 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e   " INT FORMAT IN
9570: 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22  T INT ?STRING?\"
9580: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9590: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
95a0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
95b0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
95c0: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
95d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
95e0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f   n<0 ){.    Tcl_
95f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9600: 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20  erp, "N must be 
9610: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30  non-negative", 0
9620: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9630: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9640: 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=3; i<5; i++
9650: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9660: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9670: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20  gv[i], &a[i-3]) 
9680: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9690: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
96a0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b  lite3_malloc( n+
96b0: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  1 );.  sqlite3_s
96c0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72  nprintf(n, z, ar
96d0: 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[2], a[0], a[1
96e0: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
96f0: 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [5] : NULL);.  T
9700: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9710: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9720: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9730: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9740: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9750: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9760: 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41  ntf_double FORMA
9770: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
9780: 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  R DOUBLE.**.** C
9790: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
97a0: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
97b0: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64  uments and one d
97c0: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a  ouble argument.*
97d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
97e0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
97f0: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ble(.  void *Not
9800: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
9810: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9820: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9830: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9840: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9850: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
9860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9870: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9880: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
9890: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
98a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
98b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
98c0: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64  int a[3], i;.  d
98d0: 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20  ouble r;.  char 
98e0: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
98f0: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9900: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9910: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9920: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9930: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9940: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
9950: 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a   DOUBLE\"", 0);.
9960: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9970: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
9980: 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=2; i<4; i++){.
9990: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
99a0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
99b0: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
99c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
99d0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
99e0: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
99f0: 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20   argv[4], &r) ) 
9a00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9a10: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
9a20: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
9a30: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b   a[0], a[1], r);
9a40: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
9a50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
9a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9a70: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
9a80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9a90: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
9aa0: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46  mprintf_scaled F
9ab0: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
9ac0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9ad0: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
9ae0: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
9af0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
9b00: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
9b10: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
9b20: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
9b30: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
9b40: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
9b50: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
9b60: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
9b70: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
9b80: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
9b90: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
9ba0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
9bb0: 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69  tf_scaled(.  voi
9bc0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9bd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9be0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9bf0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9c00: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9c10: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9c20: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9c30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9c40: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9c50: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9c60: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9c70: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9c80: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64  .){.  int i;.  d
9c90: 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68  ouble r[2];.  ch
9ca0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9cb0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
9cc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9cd0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9ce0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9cf0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9d00: 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42     " FORMAT DOUB
9d10: 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29  LE DOUBLE\"", 0)
9d20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9d30: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9d40: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
9d50: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
9d60: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20  tDouble(interp, 
9d70: 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d  argv[i], &r[i-2]
9d80: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9d90: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9da0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9db0: 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b  argv[1], r[0]*r[
9dc0: 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
9dd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9de0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9df0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9e00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9e10: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9e20: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
9e30: 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e  nly FORMAT STRIN
9e40: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9e50: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
9e60: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
9e70: 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
9e80: 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a  product of the.*
9e90: 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  * two arguments 
9ea0: 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68  given above.  Th
9eb0: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  is is used to ge
9ec0: 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20  nerate overflow 
9ed0: 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a  and underflow.**
9ee0: 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74   doubles to test
9ef0: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
9f00: 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c  onverted properl
9f10: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
9f20: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f30: 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  _stronly(.  void
9f40: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9f60: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9f70: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9f80: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9f90: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9fa0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9fc0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
9fd0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
9fe0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9ff0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a000: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
a010: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
a020: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a030: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
a040: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
a050: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
a060: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
a070: 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  AT STRING\"", 0)
a080: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a090: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
a0a0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a0b0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b  f(argv[1], argv[
a0c0: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
a0d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a0e0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a0f0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a100: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a110: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a120: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
a130: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58  ouble FORMAT HEX
a140: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
a150: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
a160: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
a170: 74 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76  t which is deriv
a180: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68  ed from the.** h
a190: 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64  exadecimal encod
a1a0: 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64  ing of an IEEE d
a1b0: 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
a1c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
a1d0: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a1e0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a1f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a200: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a210: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a220: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a230: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a240: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a250: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a260: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a270: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a290: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a2a0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a2b0: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a2c0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a2d0: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a2e0: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a2f0: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a300: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a310: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a320: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a330: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a340: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a350: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a360: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a370: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a380: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a390: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a3a0: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a3b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a3c0: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a3d0: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a3e0: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a3f0: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a400: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a410: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a420: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a430: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a440: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a450: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a460: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a470: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a480: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a490: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a4a0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a4b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a4c0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a4d0: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a4e0: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a4f0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a500: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a510: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a520: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
a530: 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65  e_shared(.  Clie
a540: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a550: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a560: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a570: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a580: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a590: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a5a0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a5b0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a5c0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a5d0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a5e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a5f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a600: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a610: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a620: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a630: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a640: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e  int enable;.  in
a650: 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  t ret = 0;..  if
a660: 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
a670: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
a680: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a690: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
a6a0: 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20  BOOLEAN?");.    
a6b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a6c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71  ;.  }.  ret = sq
a6d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a6e0: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
a6f0: 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  bled;..  if( obj
a700: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
a710: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
a720: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a730: 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20  jv[1], &enable) 
a740: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a750: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a760: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a770: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
a780: 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20  cache(enable);. 
a790: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a7a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
a7b0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
a7c0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
a7d0: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54  te3ErrStr(rc), T
a7e0: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
a7f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a800: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
a810: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a820: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
a830: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29  BooleanObj(ret))
a840: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a850: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  K;.}.#endif..../
a860: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a870: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
a880: 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20  ult_codes   DB  
a890: 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a    BOOLEAN.**.*/.
a8a0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a8b0: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
a8c0: 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  codes(.  ClientD
a8d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
a8e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
a8f0: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
a900: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
a910: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a920: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a930: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a940: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a950: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a960: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
a970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a980: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
a990: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
a9a0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
a9b0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
a9c0: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
a9d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
a9e0: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
a9f0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
aa00: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
aa10: 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
aa20: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
aa30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
aa40: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
aa50: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
aa60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
aa70: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
aa80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
aa90: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
aaa0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
aab0: 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[2], &enable)
aac0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
aad0: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ROR;.  sqlite3_e
aae0: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
aaf0: 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29  odes(db, enable)
ab00: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
ab10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
ab20: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  e: sqlite3_libve
ab30: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a  rsion_number.**.
ab40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ab50: 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
ab60: 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  mber(.  ClientDa
ab70: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
ab80: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
ab90: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
aba0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
abb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
abc0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
abd0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
abe0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
abf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
ac00: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
ac10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ac20: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
ac30: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ac40: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
ac50: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
ac60: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
ac70: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
ac80: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
ac90: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
aca0: 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  er()));.  return
acb0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
acc0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
acd0: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
ace0: 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65  tadata DB dbname
acf0: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
ad00: 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .**.*/.#ifdef SQ
ad10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ad20: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61 74  MN_METADATA.stat
ad30: 69 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62 6c  ic int test_tabl
ad40: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ad50: 61 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  a(.  ClientData 
ad60: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ad70: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
ad80: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
ad90: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
ada0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
adb0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adc0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
add0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ade0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
adf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae10: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae20: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae30: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae40: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
ae50: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
ae60: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
ae70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
ae80: 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
ae90: 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zCol;.  int rc;
aea0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
aeb0: 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
aec0: 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f  *zDatatype;.  co
aed0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73  nst char *zColls
aee0: 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c  eq;.  int notnul
aef0: 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  l;.  int primary
af00: 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  key;.  int autoi
af10: 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28  ncrement;..  if(
af20: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
af30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
af40: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
af50: 2c 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c  , "DB dbname tbl
af60: 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a  name colname");.
af70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
af80: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
af90: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
afa0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
afb0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
afc0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
afd0: 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63  RROR;.  zDb = Tc
afe0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
aff0: 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54  [2]);.  zTbl = T
b000: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b010: 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  v[3]);.  zCol = 
b020: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b030: 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73  jv[4]);..  if( s
b040: 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20  trlen(zDb)==0 ) 
b050: 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  zDb = 0;..  rc =
b060: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
b070: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64  olumn_metadata(d
b080: 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43  b, zDb, zTbl, zC
b090: 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74  ol, .      &zDat
b0a0: 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71  atype, &zCollseq
b0b0: 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69  , &notnull, &pri
b0c0: 6d 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e  marykey, &autoin
b0d0: 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28  crement);..  if(
b0e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b0f0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
b100: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
b110: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
b120: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
b130: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b140: 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ..  pRet = Tcl_N
b150: 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c  ewObj();.  Tcl_L
b160: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b170: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b180: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
b190: 61 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20  atatype, -1));. 
b1a0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b1b0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b1c0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b1d0: 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31  Obj(zCollseq, -1
b1e0: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
b1f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b200: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
b210: 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b  ntObj(notnull));
b220: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
b230: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
b240: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
b250: 62 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29 3b  bj(primarykey));
b260: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
b270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
b280: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
b290: 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  bj(autoincrement
b2a0: 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
b2b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
b2c0: 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
b2d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
b2e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b2f0: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a  _OMIT_INCRBLOB..
b300: 73 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48  static int blobH
b310: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20  andleFromObj(.  
b320: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b330: 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  rp, .  Tcl_Obj *
b340: 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f  pObj,.  sqlite3_
b350: 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b  blob **ppBlob.){
b360: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
b370: 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f  t n;..  z = Tcl_
b380: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
b390: 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66  (pObj, &n);.  if
b3a0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ( n==0 ){.    *p
b3b0: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c  pBlob = 0;.  }el
b3c0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  se{.    int notU
b3d0: 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  sed;.    Tcl_Cha
b3e0: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20  nnel channel;.  
b3f0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
b400: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a  tanceData;.    .
b410: 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63      channel = Tc
b420: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
b430: 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64  erp, z, &notUsed
b440: 29 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e  );.    if( !chan
b450: 6e 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c  nel ) return TCL
b460: 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c  _ERROR;..    Tcl
b470: 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b  _Flush(channel);
b480: 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68  .    Tcl_Seek(ch
b490: 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53  annel, 0, SEEK_S
b4a0: 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e  ET);..    instan
b4b0: 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74  ceData = Tcl_Get
b4c0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
b4d0: 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20  ata(channel);.  
b4e0: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73    *ppBlob = *((s
b4f0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69  qlite3_blob **)i
b500: 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20  nstanceData);.  
b510: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
b520: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  OK;.}../*.** sql
b530: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 20  ite3_blob_bytes 
b540: 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74   CHANNEL.*/.stat
b550: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
b560: 5f 62 79 74 65 73 28 0a 20 20 43 6c 69 65 6e 74  _bytes(.  Client
b570: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
b580: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
b590: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b5a0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
b5b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
b5c0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
b5d0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
b5e0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
b5f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b600: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
b610: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b620: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
b630: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
b640: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  .){.  sqlite3_bl
b650: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
b660: 20 6e 42 79 74 65 3b 0a 20 20 0a 20 20 69 66 28   nByte;.  .  if(
b670: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
b680: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b690: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b6a0: 2c 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20  , "CHANNEL");.  
b6b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b6c0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
b6d0: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
b6e0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
b6f0: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
b700: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b710: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
b720: 62 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62  blob_bytes(pBlob
b730: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
b740: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
b750: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74  l_NewIntObj(nByt
b760: 65 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  e));..  return T
b770: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b780: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
b790: 73 65 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73  se  CHANNEL.*/.s
b7a0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
b7b0: 6c 6f 62 5f 63 6c 6f 73 65 28 0a 20 20 43 6c 69  lob_close(.  Cli
b7c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b7d0: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
b7e0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
b7f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
b800: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
b810: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
b820: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
b830: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
b840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b850: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b860: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b870: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b880: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b890: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b8a0: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
b8b0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
b8c0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
b8d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b8e0: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
b8f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b900: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b910: 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46   if( blobHandleF
b920: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b930: 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20  bjv[1], &pBlob) 
b940: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b950: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  OR;.  sqlite3_bl
b960: 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
b970: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b980: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  K;.}../*.** sqli
b990: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43  te3_blob_read  C
b9a0: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a  HANNEL OFFSET N.
b9b0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d  **.**   This com
b9c0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
b9d0: 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  test the sqlite3
b9e0: 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20  _blob_read() in 
b9f0: 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74  ways that.**   t
ba00: 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69  he Tcl channel i
ba10: 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f  nterface does no
ba20: 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
ba30: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  ument should.** 
ba40: 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66    be the name of
ba50: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c   a valid channel
ba60: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
ba70: 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f  [incrblob] metho
ba80: 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61  d.**   of a data
ba90: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
baa0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
bab0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
bac0: 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61  ad().**   to rea
bad0: 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  d N bytes from o
bae0: 66 66 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f  ffset OFFSET fro
baf0: 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
bb00: 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f   SQLite.**   blo
bb10: 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20  b handle..**.** 
bb20: 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20    On success, a 
bb30: 62 79 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63  byte-array objec
bb40: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
bb50: 20 72 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a   read data is .*
bb60: 2a 20 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e  *   returned. On
bb70: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
bb80: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
bb90: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
bba0: 2a 20 20 20 74 65 78 74 20 72 65 70 72 65 73 65  *   text represe
bbb0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
bbc0: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
bbd0: 64 65 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45  de (i.e. "SQLITE
bbe0: 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e  _NOMEM").**   an
bbf0: 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  d a Tcl exceptio
bc00: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a  n is thrown..*/.
bc10: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bc20: 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69  blob_read(.  Cli
bc30: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
bc40: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
bc50: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
bc60: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
bc70: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
bc80: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
bc90: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
bca0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
bcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bcc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bcd0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
bce0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
bcf0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
bd00: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
bd10: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bd20: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
bd30: 20 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69   iOffset;.  unsi
bd40: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 20  gned char *zBuf 
bd50: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
bd60: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
bd70: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
bd80: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
bd90: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
bda0: 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20  L OFFSET N");.  
bdb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bdc0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
bdd0: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
bde0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
bdf0: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
be00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
be10: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
be20: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
be30: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
be40: 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54  iOffset).   || T
be50: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
be60: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
be70: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65   objv[3], &nByte
be80: 29 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ).  ){ .    retu
be90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bea0: 7d 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 30  }..  if( nByte>0
beb0: 20 29 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 28   ){.    zBuf = (
bec0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
bed0: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
bee0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bef0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
bf00: 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74  Blob, zBuf, nByt
bf10: 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
bf20: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bf30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
bf40: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
bf50: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
bf60: 79 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65  yObj(zBuf, nByte
bf70: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
bf80: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
bf90: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
bfa0: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
bfb0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
bfc0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
bfd0: 28 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a  ((char *)zBuf);.
bfe0: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
bff0: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f  QLITE_OK ? TCL_O
c000: 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  K : TCL_ERROR);.
c010: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
c020: 5f 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e  _blob_write CHAN
c030: 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20  NEL OFFSET DATA 
c040: 3f 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20  ?NDATA?.**.**   
c050: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
c060: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
c070: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
c080: 69 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68  ite() in ways th
c090: 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20  at.**   the Tcl 
c0a0: 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63  channel interfac
c0b0: 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20  e does not. The 
c0c0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
c0d0: 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68  hould.**   be th
c0e0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
c0f0: 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65  d channel create
c100: 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c  d by the [incrbl
c110: 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20  ob] method.**   
c120: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61  of a database ha
c130: 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ndle. This funct
c140: 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
c150: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a  3_blob_write().*
c160: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65  *   to write the
c170: 20 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79   DATA byte-array
c180: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
c190: 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68  ng SQLite blob h
c1a0: 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f  andle..**   at o
c1b0: 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a  ffset OFFSET..**
c1c0: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
c1d0: 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  , an empty strin
c1e0: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  g is returned. O
c1f0: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69  n failure, the i
c200: 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20  nterpreter.**   
c210: 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f  result is set to
c220: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
c230: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c240: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63  returned error c
c250: 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ode .**   (i.e. 
c260: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20  "SQLITE_NOMEM") 
c270: 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74  and a Tcl except
c280: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a  ion is thrown..*
c290: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c2a0: 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20  t_blob_write(.  
c2b0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c2c0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
c2d0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
c2e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
c2f0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
c300: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
c310: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
c320: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
c330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c340: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c350: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c360: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
c370: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c380: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
c390: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
c3a0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
c3b0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73    int rc;..  uns
c3c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
c3d0: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
c3e0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
c3f0: 26 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  & objc!=5 ){.   
c400: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c410: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c420: 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53  v, "CHANNEL OFFS
c430: 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22  ET DATA ?NDATA?"
c440: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c460: 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  if( blobHandleFr
c470: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c480: 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29  jv[1], &pBlob) )
c490: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c4a0: 52 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  R;.  if( TCL_OK!
c4b0: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
c4c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c4d0: 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29 7b  2], &iOffset) ){
c4e0: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
c4f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
c500: 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Buf = Tcl_GetByt
c510: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
c520: 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20  jv[3], &nBuf);. 
c530: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
c540: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c550: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
c560: 5d 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20  ], &nBuf) ){.   
c570: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c580: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
c590: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
c5a0: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
c5b0: 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  uf, iOffset);.  
c5c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c5d0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
c5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
c5f0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
c600: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
c610: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20  OLATILE);.  }.. 
c620: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
c630: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
c640: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
c650: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c660: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20  _blob_reopen(.  
c670: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c680: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
c690: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
c6a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
c6b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
c6c0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
c6d0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
c6e0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c700: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c710: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c720: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
c730: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c740: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
c750: 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a  WideInt iRowid;.
c760: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c770: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
c780: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
c790: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
c7a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c7b0: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
c7c0: 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72  L ROWID");.    r
c7d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c7e0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
c7f0: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
c800: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
c810: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
c820: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
c830: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
c840: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
c850: 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29  bjv[2], &iRowid)
c860: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c870: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
c880: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
c890: 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b  (pBlob, iRowid);
c8a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c8b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
c8c0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c8d0: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c8e0: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
c8f0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
c900: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
c910: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
c920: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
c930: 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
c940: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
c950: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c960: 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e  n_v2 DB-HANDLE N
c970: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c980: 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68  -PROC.**.**   Th
c990: 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75  is Tcl proc is u
c9a0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
c9b0: 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  the experimental
c9c0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72  .**   sqlite3_cr
c9d0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
c9e0: 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  2() interface..*
c9f0: 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c  /.struct TestCol
ca00: 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f  lationX {.  Tcl_
ca10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
ca20: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b    Tcl_Obj *pCmp;
ca30: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c  .  Tcl_Obj *pDel
ca40: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
ca50: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
ca60: 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  nX TestCollation
ca70: 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  X;.static void t
ca80: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
ca90: 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78  onDel(void *pCtx
caa0: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
cab0: 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f  onX *p = (TestCo
cac0: 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b  llationX *)pCtx;
cad0: 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c  ..  int rc = Tcl
cae0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
caf0: 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54  terp, p->pDel, T
cb00: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54  CL_EVAL_DIRECT|T
cb10: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
cb20: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
cb30: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  K ){.    Tcl_Bac
cb40: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
cb50: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
cb60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb70: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c  (p->pCmp);.  Tcl
cb80: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
cb90: 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >pDel);.  sqlite
cba0: 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70  3_free((void *)p
cbb0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
cbc0: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
cbd0: 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a  ionCmp(.  void *
cbe0: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66  pCtx,.  int nLef
cbf0: 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t,.  const void 
cc00: 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52  *zLeft,.  int nR
cc10: 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  ight,.  const vo
cc20: 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20  id *zRight.){.  
cc30: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cc40: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
cc50: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  onX *)pCtx;.  Tc
cc60: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
cc70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
cc80: 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e  j(p->pCmp);.  in
cc90: 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54  t iRes = 0;..  T
cca0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
ccb0: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
ccc0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
ccd0: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
cce0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
ccf0: 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c  j((char *)zLeft,
cd00: 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f   nLeft));.  Tcl_
cd10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
cd20: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
cd30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
cd40: 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74  j((char *)zRight
cd50: 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66  ,nRight));..  if
cd60: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76  ( TCL_OK!=Tcl_Ev
cd70: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
cd80: 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f  p, pScript, TCL_
cd90: 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f  EVAL_DIRECT|TCL_
cda0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20  EVAL_GLOBAL).   
cdb0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
cdc0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e  etIntFromObj(p->
cdd0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f  interp, Tcl_GetO
cde0: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
cdf0: 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b  rp), &iRes).  ){
ce00: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
ce10: 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65  undError(p->inte
ce20: 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  rp);.  }.  Tcl_D
ce30: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
ce40: 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ipt);..  return 
ce50: 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69  iRes;.}.static i
ce60: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63  nt test_create_c
ce70: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43  ollation_v2(.  C
ce80: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
ce90: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
cea0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
ceb0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
cec0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
ced0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
cee0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
cef0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
cf00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cf10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
cf20: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
cf30: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
cf40: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
cf50: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43  ts */.){.  TestC
cf60: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20  ollationX *p;.  
cf70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
cf80: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
cf90: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
cfa0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cfb0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
cfc0: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
cfd0: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
cfe0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
cff0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d000: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
d010: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d020: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
d030: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d040: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d  CL_ERROR;..  p =
d050: 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58   (TestCollationX
d060: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
d070: 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c  c(sizeof(TestCol
d080: 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e  lationX));.  p->
d090: 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  pCmp = objv[3];.
d0a0: 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76    p->pDel = objv
d0b0: 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  [4];.  p->interp
d0c0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c   = interp;.  Tcl
d0d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
d0e0: 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e  >pCmp);.  Tcl_In
d0f0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
d100: 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  el);..  rc = sql
d110: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d120: 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c  ation_v2(db, Tcl
d130: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d140: 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20 20  2]), 16, .      
d150: 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43  (void *)p, testC
d160: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
d170: 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  p, testCreateCol
d180: 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20  lationDel.  );. 
d190: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d1a0: 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54 63  MISUSE ){.    Tc
d1b0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d1c0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
d1d0: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f 76  create_collate_v
d1e0: 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64 65  2() failed to de
d1f0: 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61 6e  tect ".      "an
d200: 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69 6e   invalid encodin
d210: 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g", (char*)0);. 
d220: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d230: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
d240: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
d250: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20  ollation_v2(db, 
d260: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d270: 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55  jv[2]), SQLITE_U
d280: 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f 69  TF8, .      (voi
d290: 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74  d *)p, testCreat
d2a0: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74  eCollationCmp, t
d2b0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
d2c0: 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74  onDel.  );.  ret
d2d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d2e0: 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c 69  *.** USAGE: sqli
d2f0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
d300: 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20 4e  ion_v2 DB NAME N
d310: 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48 45  ARG ENC ?SWITCHE
d320: 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61 62  S?.**.** Availab
d330: 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65 3a  le switches are:
d340: 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20 20  .**.**   -func  
d350: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 73    SCRIPT.**   -s
d360: 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  tep    SCRIPT.**
d370: 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52 49     -final   SCRI
d380: 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f 79  PT.**   -destroy
d390: 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65 64   SCRIPT.*/.typed
d3a0: 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74 65  ef struct Create
d3b0: 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61 74  FunctionV2 Creat
d3c0: 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74 72  eFunctionV2;.str
d3d0: 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74 69  uct CreateFuncti
d3e0: 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  onV2 {.  Tcl_Int
d3f0: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
d400: 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20 20  cl_Obj *pFunc;  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d420: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75 6e  * Script for fun
d430: 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e  ction invocation
d440: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
d450: 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  Step;           
d460: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
d470: 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69 6e  for agg. step in
d480: 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  vocation */.  Tc
d490: 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20 20  l_Obj *pFinal;  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d4b0: 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e   Script for agg.
d4c0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69 6e   finalization in
d4d0: 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  vocation */.  Tc
d4e0: 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79 3b  l_Obj *pDestroy;
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d500: 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72 69   Destructor scri
d510: 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  pt */.};.static 
d520: 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71 6c  void cf2Func(sql
d530: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
d540: 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
d550: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72  ite3_value **aAr
d560: 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  g){.}.static voi
d570: 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74 65  d cf2Step(sqlite
d580: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
d590: 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
d5a0: 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b  3_value **aArg){
d5b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
d5c0: 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f  f2Final(sqlite3_
d5d0: 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 7d  context *ctx){.}
d5e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
d5f0: 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70 55  Destroy(void *pU
d600: 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46 75  ser){.  CreateFu
d610: 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28 43  nctionV2 *p = (C
d620: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d630: 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28 20  *)pUser;..  if( 
d640: 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d 3e  p->interp && p->
d650: 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  pDestroy ){.    
d660: 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  int rc = Tcl_Eva
d670: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
d680: 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20 30  , p->pDestroy, 0
d690: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54  );.    if( rc!=T
d6a0: 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63 6b  CL_OK ) Tcl_Back
d6b0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
d6c0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  nterp);.  }..  i
d6d0: 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63  f( p->pFunc ) Tc
d6e0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d6f0: 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28  ->pFunc); .  if(
d700: 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f   p->pStep ) Tcl_
d710: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
d720: 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70  pStep); .  if( p
d730: 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 44  ->pFinal ) Tcl_D
d740: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
d750: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
d760: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c  ->pDestroy ) Tcl
d770: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
d780: 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20 73  >pDestroy); .  s
d790: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d7a0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
d7b0: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
d7c0: 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  n_v2(.  ClientDa
d7d0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20  ta clientData,  
d7e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
d7f0: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
d800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d820: 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e 74  invoking TCL int
d830: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
d840: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d860: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d870: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d880: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
d8a0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
d8b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d8c0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
d8d0: 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *zFunc;.  int n
d8e0: 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b 0a  Arg;.  int enc;.
d8f0: 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e    CreateFunction
d900: 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  V2 *p;.  int i;.
d910: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74 72    int rc;..  str
d920: 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a 20  uct EncTable {. 
d930: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d940: 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e 63  Enc;.    int enc
d950: 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20 7b  ;.  } aEnc[] = {
d960: 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20 20  .    {"utf8",   
d970: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c 0a   SQLITE_UTF8 },.
d980: 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20 20      {"utf16",   
d990: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c 0a  SQLITE_UTF16 },.
d9a0: 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c 20      {"utf16le", 
d9b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7d  SQLITE_UTF16LE }
d9c0: 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65 22  ,.    {"utf16be"
d9d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
d9e0: 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c 20   },.    {"any", 
d9f0: 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20 7d      SQLITE_ANY }
da00: 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d 0a  ,.    {"0", 0 }.
da10: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
da20: 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d 3d  <5 || (objc%2)==
da30: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  0 ){.    Tcl_Wro
da40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
da50: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e  , 1, objv, "DB N
da60: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57 49  AME NARG ENC SWI
da70: 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20 20  TCHES...");.    
da80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
da90: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
daa0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
dab0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
dac0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
dad0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
dae0: 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63 6c  R;.  zFunc = Tcl
daf0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
db00: 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
db10: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
db20: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
db30: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
db40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
db50: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
db60: 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c  bjStruct(interp,
db70: 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c 20   objv[4], aEnc, 
db80: 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29 2c  sizeof(aEnc[0]),
db90: 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e 63   .          "enc
dba0: 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63 29  oding", 0, &enc)
dbb0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
dbc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dbd0: 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e 63    enc = aEnc[enc
dbe0: 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73 71  ].enc;..  p = sq
dbf0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
dc00: 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69  eof(CreateFuncti
dc10: 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72 74  onV2));.  assert
dc20: 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ( p );.  memset(
dc30: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72 65  p, 0, sizeof(Cre
dc40: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b  ateFunctionV2));
dc50: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
dc60: 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  nterp;..  for(i=
dc70: 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29  5; i<objc; i+=2)
dc80: 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74 63  {.    int iSwitc
dc90: 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  h;.    const cha
dca0: 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d 20  r *azSwitch[] = 
dcb0: 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65 70  {"-func", "-step
dcc0: 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d 64  ", "-final", "-d
dcd0: 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20 20  estroy", 0};.   
dce0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
dcf0: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
dd00: 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69 74   objv[i], azSwit
dd10: 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30 2c  ch, "switch", 0,
dd20: 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20 20   &iSwitch) ){.  
dd30: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
dd40: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
dd50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
dd60: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
dd70: 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 20  iSwitch ){.     
dd80: 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75 6e   case 0: p->pFun
dd90: 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  c = objv[i+1];  
dda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ddb0: 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74 65   case 1: p->pSte
ddc0: 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  p = objv[i+1];  
ddd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dde0: 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69 6e   case 2: p->pFin
ddf0: 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  al = objv[i+1]; 
de00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
de10: 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65 73   case 3: p->pDes
de20: 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  troy = objv[i+1]
de30: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ;   break;.    }
de40: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 46  .  }.  if( p->pF
de50: 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20 3d  unc ) p->pFunc =
de60: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
de70: 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20  j(p->pFunc); .  
de80: 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20 70  if( p->pStep ) p
de90: 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44 75  ->pStep = Tcl_Du
dea0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 53  plicateObj(p->pS
deb0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
dec0: 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69 6e  pFinal ) p->pFin
ded0: 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  al = Tcl_Duplica
dee0: 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c 29  teObj(p->pFinal)
def0: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
df00: 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74 72  troy ) p->pDestr
df10: 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  oy = Tcl_Duplica
df20: 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72 6f  teObj(p->pDestro
df30: 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y); ..  if( p->p
df40: 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72 52  Func ) Tcl_IncrR
df50: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63  efCount(p->pFunc
df60: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ); .  if( p->pSt
df70: 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  ep ) Tcl_IncrRef
df80: 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b  Count(p->pStep);
df90: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
dfa0: 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  l ) Tcl_IncrRefC
dfb0: 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b  ount(p->pFinal);
dfc0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74   .  if( p->pDest
dfd0: 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  roy ) Tcl_IncrRe
dfe0: 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72  fCount(p->pDestr
dff0: 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73 71  oy); ..  rc = sq
e000: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e010: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75  ction_v2(db, zFu
e020: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 28  nc, nArg, enc, (
e030: 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20 20  void *)p, .     
e040: 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66 32   (p->pFunc ? cf2
e050: 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20 20  Func : 0),.     
e060: 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66 32   (p->pStep ? cf2
e070: 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20 20  Step : 0),.     
e080: 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63 66   (p->pFinal ? cf
e090: 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20 20  2Final : 0),.   
e0a0: 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20 20     cf2Destroy.  
e0b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e0c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
e0d0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
e0e0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
e0f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e100: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
e110: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
e120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
e140: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e150: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
e160: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  oad_extension DB
e170: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
e180: 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OC?.*/.static in
e190: 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65  t test_load_exte
e1a0: 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44  nsion(.  ClientD
e1b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
e1c0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
e1d0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e1e0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e1f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e200: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e210: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e220: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
e230: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e240: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e250: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e260: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
e270: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
e280: 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
e290: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69   cmdInfo;.  sqli
e2a0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
e2b0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  c;.  char *zDb;.
e2c0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
e2d0: 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30   char *zProc = 0
e2e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
e2f0: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
e300: 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =4 && objc!=3 ){
e310: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
e320: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
e330: 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c   objv, "DB-HANDL
e340: 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b  E FILE ?PROC?");
e350: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e360: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
e370: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e380: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69  (objv[1]);.  zFi
e390: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
e3a0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
e3b0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
e3c0: 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65    zProc = Tcl_Ge
e3d0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
e3e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72  ;.  }..  /* Extr
e3f0: 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61  act the C databa
e400: 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  se handle from t
e410: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  he Tcl command n
e420: 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63  ame */.  if( !Tc
e430: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
e440: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
e450: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
e460: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e470: 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
e480: 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a   not found: ", z
e490: 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Db, (char*)0);. 
e4a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e4b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
e4c0: 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
e4d0: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
e4e0: 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
e4f0: 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20   assert(db);..  
e500: 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65  /* Call the unde
e510: 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f  rlying C functio
e520: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  n. If an error o
e530: 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f  ccurs, set rc to
e540: 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52   .  ** TCL_ERROR
e550: 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72   and load any er
e560: 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ror string into 
e570: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
e580: 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72   If no .  ** err
e590: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
e5a0: 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a  c to TCL_OK..  *
e5b0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e5c0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
e5d0: 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  ION.  rc = SQLIT
e5e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20  E_ERROR;.  zErr 
e5f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
e600: 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  f("this build om
e610: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
e620: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
e630: 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c  #else.  rc = sql
e640: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
e650: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
e660: 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65  Proc, &zErr);.#e
e670: 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
e680: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e690: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
e6a0: 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72  terp, zErr ? zEr
e6b0: 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41  r : "", TCL_VOLA
e6c0: 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20  TILE);.    rc = 
e6d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
e6e0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  se{.    rc = TCL
e6f0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
e700: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a  e3_free(zErr);..
e710: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e720: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
e730: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
e740: 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41  _extension DB-HA
e750: 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74  NDLE ONOFF.*/.st
e760: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e  atic int test_en
e770: 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69  able_load(.  Cli
e780: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
e790: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
e7a0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
e7b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e7c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e7d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e7e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e7f0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
e800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e810: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e820: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
e830: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
e840: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
e850: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
e860: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
e870: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
e880: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20  har *zDb;.  int 
e890: 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62  onoff;..  if( ob
e8a0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
e8b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e8c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e8d0: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22  DB-HANDLE ONOFF"
e8e0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e8f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
e900: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
e910: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  ng(objv[1]);..  
e920: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
e930: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e940: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
e950: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
e960: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
e970: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
e980: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
e990: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
e9a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e9b0: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
e9c0: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
e9d0: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
e9e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e9f0: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
ea00: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
ea10: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
ea20: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
ea30: 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
ea40: 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65  e onoff paramete
ea50: 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47  r */.  if( Tcl_G
ea60: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
ea70: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
ea80: 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
ea90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
eaa0: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  R;.  }..#ifdef S
eab0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
eac0: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f  EXTENSION.  Tcl_
ead0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
eae0: 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64  erp, "this build
eaf0: 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c   omits sqlite3_l
eb00: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22  oad_extension()"
eb10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
eb20: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
eb30: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
eb40: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c  ad_extension(db,
eb50: 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72   onoff);.  retur
eb60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66  n TCL_OK;.#endif
eb70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
eb80: 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a    sqlite_abort.*
eb90: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
eba0: 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69  e process immedi
ebb0: 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20  ately.  This is 
ebc0: 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74  not a clean shut
ebd0: 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  down..** This co
ebe0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
ebf0: 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65   test the recove
ec00: 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61  rability of a da
ec10: 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65  tabase in.** the
ec20: 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67   event of a prog
ec30: 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74  ram crash..*/.st
ec40: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
ec50: 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e  abort(.  void *N
ec60: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
ec70: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
ec80: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
ec90: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
eca0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
ecb0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ecd0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
ece0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
ecf0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
ed00: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
ed10: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
ed20: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
ed30: 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64 6f  _VER).  /* We do
ed40: 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73 65   this, otherwise
ed50: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 68   the test will h
ed60: 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75 70  alt with a popup
ed70: 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74 68   message.   * th
ed80: 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 6c  at we have to cl
ed90: 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65 20  ick away before 
eda0: 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63 6f  the test will co
edb0: 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20 20  ntinue..   */.  
edc0: 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61 76  _set_abort_behav
edd0: 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52 45  ior( 0, _CALL_RE
ede0: 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65 6e  PORTFAULT );.#en
edf0: 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29 3b  dif.  exit(255);
ee00: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72  .  assert( inter
ee10: 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  p==0 );   /* Thi
ee20: 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  s will always fa
ee30: 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  il */.  return T
ee40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ee50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
ee60: 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d  utine is a user-
ee70: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
ee80: 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f  tion whose purpo
ee90: 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74  se.** is to test
eea0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f   the sqlite_set_
eeb0: 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f  result() API..*/
eec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
eed0: 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  tFunc(sqlite3_co
eee0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
eef0: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
ef00: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
ef10: 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d  .  while( argc>=
ef20: 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
ef30: 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68  har *zArg0 = (ch
ef40: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
ef50: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
ef60: 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20 29  .    if( zArg0 )
ef70: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
ef80: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
ef90: 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20  rg0, "int") ){. 
efa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
efb0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
efc0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
efd0: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a  _int(argv[1]));.
efe0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eff0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f000: 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30  Arg0,"int64")==0
f010: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f020: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
f030: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
f040: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
f050: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
f060: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f070: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73  StrICmp(zArg0,"s
f080: 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20  tring")==0 ){.  
f090: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f0a0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
f0b0: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
f0c0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
f0d0: 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20  v[1]), -1,.     
f0e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
f0f0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
f100: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f110: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f120: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
f130: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f140: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
f150: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
f160: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
f170: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
f180: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f190: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
f1a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f1b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1c0: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
f1d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
f1e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
f1f0: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
f200: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f210: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
f220: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
f230: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
f240: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
f250: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f260: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
f270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f280: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
f290: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
f2a0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
f2b0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
f2c0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
f2d0: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
f2e0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
f2f0: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
f300: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
f310: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
f320: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
f330: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
f340: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
f350: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
f360: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
f370: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
f380: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
f390: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
f3a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
f3b0: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
f3c0: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
f3d0: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
f3e0: 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66   test_register_f
f3f0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
f400: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
f410: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
f420: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
f430: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
f440: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
f450: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
f460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f470: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
f480: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
f490: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
f4a0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
f4b0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
f4c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
f4d0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
f4e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f4f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f500: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f510: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f520: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
f530: 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f      " DB FUNCTIO
f540: 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20  N-NAME", 0);.   
f550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f560: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f570: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
f580: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
f590: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f5a0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
f5b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f5c0: 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
f5d0: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
f5e0: 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46   0, .      testF
f5f0: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
f600: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54  ( rc!=0 ){.    T
f610: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f620: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
f630: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
f640: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f650: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
f660: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
f670: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
f680: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f690: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
f6a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
f6b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f6c0: 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a  finalize  STMT .
f6d0: 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  **.** Finalize a
f6e0: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
f6f0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f700: 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a   test_finalize(.
f710: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f720: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f730: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f740: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f750: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f760: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f770: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
f780: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
f790: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
f7a0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
f7b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f7c0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f7d0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f7e0: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
f7f0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f800: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
f810: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
f820: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f830: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
f840: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f850: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f860: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f870: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f880: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70  _ERROR;..  if( p
f890: 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d  Stmt ){.    db =
f8a0: 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
f8b0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f8c0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
f8d0: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  tmt);.  Tcl_SetR
f8e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
f8f0: 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
f900: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
f910: 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20  C);.  if( db && 
f920: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
f930: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
f940: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
f950: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
f960: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f970: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f980: 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53 54  _stmt_status  ST
f990: 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54 46  MT  CODE  RESETF
f9a0: 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74 68  LAG.**.** Get th
f9b0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61  e value of a sta
f9c0: 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d  tus counter from
f9d0: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
f9e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f9f0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20 20  _stmt_status(.  
fa00: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fa10: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fa20: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fa30: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fa40: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fa50: 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20 20    int iValue;.  
fa60: 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65 74  int i, op, reset
fa70: 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Flag;.  const ch
fa80: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73  ar *zOpName;.  s
fa90: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
faa0: 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f  mt;..  static co
fab0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
fac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
fad0: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a  me;.    int op;.
fae0: 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20    } aOp[] = {.  
faf0: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fb00: 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
fb10: 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45 5f  STEP",   SQLITE_
fb20: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
fb30: 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20  CAN_STEP   },.  
fb40: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fb50: 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20 20  STATUS_SORT",   
fb60: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fb70: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
fb80: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
fb90: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fba0: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
fbb0: 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
fbc0: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
fbd0: 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20 20  NDEX       },.  
fbe0: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fbf0: 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 22 2c  STATUS_VM_STEP",
fc00: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fc10: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
fc20: 45 50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  EP         },.  
fc30: 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  };.  if( objc!=4
fc40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fc50: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fc60: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
fc70: 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54 46  PARAMETER RESETF
fc80: 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  LAG");.    retur
fc90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
fca0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
fcb0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
fcc0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fcd0: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
fce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fcf0: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63  ;.  zOpName = Tc
fd00: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fd10: 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
fd20: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f 70   i<ArraySize(aOp
fd30: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
fd40: 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a   strcmp(aOp[i].z
fd50: 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d  Name, zOpName)==
fd60: 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  0 ){.      op = 
fd70: 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20  aOp[i].op;.     
fd80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fd90: 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79  }.  if( i>=Array
fda0: 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20 20  Size(aOp) ){.   
fdb0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
fdc0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
fdd0: 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72  bjv[2], &op) ) r
fde0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fdf0: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
fe00: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
fe10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
fe20: 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29 20  , &resetFlag) ) 
fe30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe40: 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71 6c  ;.  iValue = sql
fe50: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
fe60: 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65  (pStmt, op, rese
fe70: 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65  tFlag);.  Tcl_Se
fe80: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
fe90: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
fea0: 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65 74  (iValue));.  ret
feb0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
fec0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fed0: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20  ite3_next_stmt  
fee0: 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  DB  STMT.**.** R
fef0: 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73  eturn the next s
ff00: 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65  tatment in seque
ff10: 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a  nce after STMT..
ff20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ff30: 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20  st_next_stmt(.  
ff40: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
ff50: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
ff60: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
ff70: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
ff80: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
ff90: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
ffa0: 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33  pStmt;.  sqlite3
ffb0: 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72   *db = 0;.  char
ffc0: 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66   zBuf[50];..  if
ffd0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
ffe0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
fff0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10000 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10010 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10020 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10030 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10040 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29  , " DB STMT", 0)
10050 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10060 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
10070 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
10080 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10090 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
100a0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
100b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
100c0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
100d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
100e0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
100f0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d  CL_ERROR;.  pStm
10110 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
10120 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29  _stmt(db, pStmt)
10130 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ;.  if( pStmt ){
10140 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10150 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
10160 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
10170 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
10180 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10190 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
101a0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
101b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
101c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
101d0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
101e0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20  _stmt_readonly  
101f0 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10200 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69  n true if STMT i
10210 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
10220 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
10230 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
10240 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
10250 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  ed to leave the 
10260 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66  database unmodif
10270 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
10280 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61  nt test_stmt_rea
10290 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
102a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
102b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
102c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
102d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
102e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
102f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10300 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
10310 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10320 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10330 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10340 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10350 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10360 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10370 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
10380 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
10390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
103a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
103b0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
103c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
103d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
103e0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
103f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
10400 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
10410 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
10420 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10430 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10440 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29  wBooleanObj(rc))
10450 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10460 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10470 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
10480 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  _busy  STMT.**.*
10490 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
104a0 20 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e   STMT is a non-N
104b0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  ULL pointer to a
104c0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68   statement.** th
104d0 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 65 70  at has been step
104e0 70 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63  ped but not to c
104f0 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ompletion..*/.st
10500 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
10510 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20  mt_busy(.  void 
10520 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10530 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10540 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10550 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10560 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
10570 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10580 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
10590 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
105a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
105b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
105c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
105d0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
105e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
105f0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10600 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
10610 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10620 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10630 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10640 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10650 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10660 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
10670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
10680 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
10690 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54  busy(pStmt);.  T
106a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
106b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
106c0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a  ooleanObj(rc));.
106d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
106e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
106f0 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72    uses_stmt_jour
10700 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  nal  STMT.**.** 
10710 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
10720 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74 65  TMT uses a state
10730 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
10740 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 73  .static int uses
10750 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20  _stmt_journal(. 
10760 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10770 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
10780 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
10790 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
107a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
107b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
107c0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
107d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
107e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
107f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10800 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10810 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10820 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10830 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10840 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
10850 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10860 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
10870 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
10880 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10890 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
108a0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
108b0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
108c0 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28  3_stmt_readonly(
108d0 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
108e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
108f0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
10900 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53  nObj(((Vdbe *)pS
10910 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  tmt)->usesStmtJo
10920 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  urnal));.  retur
10930 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
10940 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10950 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20  te3_reset  STMT 
10960 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  .**.** Reset a s
10970 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
10980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
10990 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
109a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
109b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
109c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
109d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
109e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
109f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10a00 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
10a10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10a20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10a30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10a40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10a50 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10a60 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10a70 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10a80 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
10a90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10aa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10ab0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10ac0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10ad0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10ae0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
10af0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b00 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10b10 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
10b20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
10b30 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
10b40 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
10b50 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
10b60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10b70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
10b80 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
10b90 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
10ba0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
10bb0 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
10bc0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
10bd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10be0 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
10bf0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10c00 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
10c10 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
10c20 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10c30 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
10c40 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10c50 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
10c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c70 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
10c80 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10c90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10ca0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10cb0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10cc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10ce0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
10cf0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10d00 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Stmt;.  if( objc
10d10 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10d20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10d30 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10d40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10d50 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10d60 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10d70 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
10d80 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
10d90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10da0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
10db0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10dc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10dd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10de0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10df0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10e00 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10e10 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10e20 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72  bj(sqlite3_expir
10e30 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e  ed(pStmt)));.#en
10e40 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
10e50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10e60 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72  age:  sqlite3_tr
10e70 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20  ansfer_bindings 
10e80 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a  FROMSTMT TOSTMT.
10e90 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61  **.** Transfer a
10ea0 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d  ll bindings from
10eb0 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74   FROMSTMT over t
10ec0 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74  o TOSTMT.*/.stat
10ed0 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e  ic int test_tran
10ee0 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69  sfer_bind(.  voi
10ef0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10f00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10f10 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10f20 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10f30 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
10f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10f50 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
10f60 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
10f70 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69  t1, *pStmt2;.  i
10f80 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10f90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10fa0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10fb0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10fc0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10fd0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10fe0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10ff0 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54  ), " FROM-STMT T
11000 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  O-STMT", 0);.   
11010 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11020 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
11030 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
11040 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
11050 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
11060 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt1)) return TCL
11070 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
11080 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11090 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
110a0 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
110b0 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43  tmt2)) return TC
110c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
110d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
110e0 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
110f0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11100 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
11110 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29  s(pStmt1,pStmt2)
11120 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
11130 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11140 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11150 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a  ite3_changes DB.
11160 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
11170 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
11180 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
11190 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c  atabase by the l
111a0 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75  ast SQL.** execu
111b0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
111c0 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73  int test_changes
111d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
111e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
111f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11200 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11210 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11220 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11230 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
11240 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11250 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11260 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
11270 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
11280 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
11290 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
112a0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
112b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
112c0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
112d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
112e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
112f0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
11300 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11310 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11320 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11330 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11340 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
11350 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11360 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
11370 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
11380 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
11390 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
113a0 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
113b0 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
113c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
113d0 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
113e0 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
113f0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11400 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
11410 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
11420 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
11430 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
11440 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
11450 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
11460 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
11470 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
11480 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65  DX-th occurrence
11490 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
114a0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
114b0 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
114c0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
114d0 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
114e0 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
114f0 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
11500 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11510 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
11520 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
11530 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
11540 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
11550 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
11560 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
11570 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
11580 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
11590 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
115a0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
115b0 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
115c0 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
115d0 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
115e0 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
115f0 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
11600 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
11610 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
11620 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
11630 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
11640 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11650 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11660 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
11670 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
11680 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
11690 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
116a0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
116b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
116c0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
116d0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
116e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
116f0 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
11700 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
11710 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11720 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11730 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
11740 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
11750 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11760 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11770 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11780 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
11790 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
117a0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
117b0 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
117c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
117d0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
117e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
117f0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
11800 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11810 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11820 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
11830 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
11840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11850 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
11860 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
11870 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
11880 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
11890 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
118a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
118b0 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
118c0 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
118d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
118e0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
118f0 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
11900 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
11910 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
11920 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
11930 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
11940 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11950 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
11960 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
11970 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
11980 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
11990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
119b0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
119c0 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
119d0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
119e0 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
119f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
11a00 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11a10 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
11a20 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
11a30 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11a40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11a50 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
11a60 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
11a70 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
11a80 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
11a90 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
11aa0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
11ab0 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
11ac0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11ad0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11ae0 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
11af0 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
11b00 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
11b10 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
11b20 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
11b30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11b40 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
11b50 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11b60 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
11b70 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
11b80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11b90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11ba0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
11bb0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
11bc0 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
11bd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11be0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
11bf0 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
11c00 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
11c10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
11c30 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
11c40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11c50 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
11c60 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
11c70 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
11c80 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
11c90 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
11ca0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
11cb0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
11cc0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
11cd0 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
11ce0 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
11cf0 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
11d00 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
11d10 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
11d20 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
11d30 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
11d40 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
11d50 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
11d60 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
11d70 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
11d80 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
11d90 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
11da0 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
11db0 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
11dc0 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
11dd0 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
11de0 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
11df0 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
11e00 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
11e10 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
11e20 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
11e30 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
11e40 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
11e50 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
11e60 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
11e70 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
11e80 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
11e90 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
11ea0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
11eb0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
11ec0 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
11ed0 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
11ef0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
11f00 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
11f10 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
11f20 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
11f30 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
11f40 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
11f50 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
11f60 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
11f70 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
11f80 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
11f90 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
11fa0 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
11fb0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
11fc0 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
11fd0 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
11fe0 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
11ff0 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
12000 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
12010 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
12020 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
12030 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
12040 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
12050 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
12060 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
12070 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
12080 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
12090 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
120a0 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
120b0 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
120c0 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
120d0 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
120e0 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
120f0 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
12100 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
12110 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
12120 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
12130 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
12140 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
12150 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
12160 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
12170 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
12180 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
12190 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
121a0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
121b0 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51    int encin = SQ
121c0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
121d0 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73  pCtx);.  int res
121e0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
121f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
12200 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
12210 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
12220 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
12230 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
12240 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
12250 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
12260 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
12270 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
12280 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
12290 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
122a0 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
122b0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
122c0 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
122d0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
122e0 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
122f0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12300 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
12310 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12320 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
12330 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12340 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
12350 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
12360 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12370 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
12380 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
12390 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
123a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
123b0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
123c0 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ert(0);.  }..  s
123d0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
123e0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61  nMalloc();.  pVa
123f0 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12400 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56  New(0);.  if( pV
12410 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
12420 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12430 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
12440 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12450 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12460 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12470 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12480 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12490 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
124a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
124b0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
124c0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
124d0 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
124e0 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
124f0 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e  l, nB, zB, encin
12500 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12510 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12520 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12530 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12540 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12550 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12560 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12570 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
12580 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12590 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
125a0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
125b0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
125c0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
125d0 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ;..  Tcl_EvalObj
125e0 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20  Ex(i, pX, 0);.  
125f0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
12600 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49  (pX);.  Tcl_GetI
12610 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c  ntFromObj(i, Tcl
12620 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29  _GetObjResult(i)
12630 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72  , &res);.  retur
12640 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
12650 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
12660 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12670 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12680 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12690 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
126a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
126b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
126c0 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  b;.  int val;.  
126d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
126e0 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
126f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
12700 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12710 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12720 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
12730 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12740 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12750 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12760 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
12770 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
12780 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12790 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
127a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
127b0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
127c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
127d0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
127e0 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
127f0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12800 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
12810 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
12820 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74  LITE_UTF8, val?t
12830 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12840 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  :0);.  if( rc==S
12850 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12860 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
12870 31 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  16;.    if( TCL_
12880 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12890 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
128a0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
128b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
128c0 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ROR;.    rc = sq
128d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
128e0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
128f0 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
12900 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
12910 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
12920 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
12930 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
12940 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66  _func:0);.    if
12950 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
12960 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
12970 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
12980 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
12990 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20  TCL_ERROR;..#if 
129a0 30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  0.    if( sqlite
129b0 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20  3_iMallocFail>0 
129c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
129d0 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a  _iMallocFail++;.
129e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
129f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12a00 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12a10 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
12a20 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
12a30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12a40 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
12a50 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
12a60 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12a70 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12a80 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69     zUtf16 = sqli
12a90 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
12aa0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  l, SQLITE_UTF16N
12ab0 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
12ac0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12ad0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12ae0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
12b00 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12b10 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62  e_collation16(db
12b20 2c 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45  , zUtf16, SQLITE
12b30 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
12b40 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12b50 49 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c  ITE_UTF16BE, val
12b60 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
12b70 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nc:0);.    }.   
12b80 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12b90 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  e(pVal);.    sql
12ba0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12bb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
12bc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
12bd0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
12be0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
12bf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12c00 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
12c20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12c30 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
12c40 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
12c50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12c60 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12c70 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
12c80 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
12c90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12ca0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12cb0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
12cc0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12cd0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12ce0 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
12cf0 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
12d00 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
12d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12d20 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
12d30 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
12d40 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
12d50 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
12d60 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
12d70 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
12d80 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
12d90 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
12da0 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
12db0 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
12dc0 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
12dd0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
12de0 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
12df0 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
12e00 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
12e10 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
12e20 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
12e30 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
12e40 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
12e50 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
12e60 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
12e70 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
12e80 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12e90 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
12ea0 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
12eb0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
12ec0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
12ed0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
12ee0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
12ef0 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
12f00 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
12f10 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
12f20 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
12f30 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
12f40 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
12f50 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
12f60 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
12f70 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
12f80 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
12f90 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
12fa0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12fb0 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
12fc0 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
12fd0 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
12fe0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12ff0 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
13000 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
13010 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45   ENC(db), SQLITE
13020 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29  _INT_TO_PTR(enc)
13030 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
13040 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
13050 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
13060 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
13070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
13080 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13090 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
130a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
130b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
130c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
130d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
130e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
130f0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
13100 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
13110 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
13120 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
13130 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
13140 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
13150 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
13160 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
13170 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
13180 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
13190 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
131a0 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
131b0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
131c0 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
131d0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
131e0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
131f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13200 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
13210 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
13220 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
13230 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
13240 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
13250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13260 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
13270 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
13280 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
13290 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
132a0 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
132b0 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
132c0 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
132d0 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
132e0 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
132f0 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
13300 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
13310 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
13320 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
13330 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
13340 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
13350 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
13360 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
13370 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
13380 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
13390 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
133a0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
133b0 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
133c0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
133d0 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
133e0 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
133f0 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
13400 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
13410 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
13420 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
13430 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
13440 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
13450 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13460 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
13470 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
13480 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
13490 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
134a0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
134b0 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
134c0 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
134d0 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
134e0 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
134f0 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
13500 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
13510 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
13520 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
13530 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
13540 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
13550 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
13560 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
13570 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
13580 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
13590 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
135a0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
135b0 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
135c0 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
135d0 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
135e0 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
135f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13600 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
13610 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
13620 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
13630 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13640 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13650 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13660 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13670 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13680 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13690 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
136a0 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
136b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
136c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
136d0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
136e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
136f0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13700 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13710 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
13720 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
13730 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
13740 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
13750 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13760 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
13770 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
13780 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
13790 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
137a0 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
137b0 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
137c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
137d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
137e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
137f0 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
13800 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
13810 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
13820 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
13830 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
13840 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13850 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
13860 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
13870 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
13880 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
13890 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
138a0 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
138b0 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
138c0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
138d0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
138e0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
138f0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
13900 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
13910 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
13920 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
13930 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
13940 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
13950 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
13960 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
13970 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
13980 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
13990 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
139a0 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
139b0 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
139c0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
139d0 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
139e0 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
139f0 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
13a00 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
13a10 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
13a20 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
13a30 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
13a40 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
13a50 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
13a60 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
13a70 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
13a80 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
13a90 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
13aa0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
13ab0 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
13ac0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
13ad0 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
13ae0 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
13af0 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
13b00 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
13b10 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
13b20 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
13b30 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
13b40 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
13b50 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
13b60 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
13b70 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
13b80 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
13b90 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
13ba0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
13bb0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
13bc0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
13bd0 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
13be0 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
13bf0 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
13c00 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
13c10 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
13c20 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
13c30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13c40 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
13c50 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
13c60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13c70 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
13c80 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
13c90 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
13ca0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
13cb0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
13cc0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13cd0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
13ce0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
13cf0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
13d00 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
13d10 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
13d20 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
13d30 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13d40 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
13d50 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
13d60 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
13d70 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
13d80 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
13d90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13da0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13db0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13dc0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
13dd0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
13de0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13df0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
13e00 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13e10 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
13e20 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13e30 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
13e40 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
13e50 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
13e60 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
13e70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
13e80 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
13e90 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13ea0 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
13eb0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
13ec0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
13ed0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
13ee0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
13ef0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
13f00 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13f10 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
13f20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
13f30 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
13f40 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13f50 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
13f60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13f70 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
13f80 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
13f90 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
13fa0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
13fb0 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
13fc0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
13fd0 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
13fe0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
13ff0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
14000 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14010 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
14020 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
14030 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
14040 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14050 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
14060 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
14070 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
14080 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
14090 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
140a0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
140b0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
140c0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
140d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
140e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
140f0 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
14100 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
14110 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14120 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14130 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
14140 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14150 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14160 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14170 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
14180 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
14190 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
141a0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
141b0 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
141c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
141d0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
141e0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
141f0 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
14200 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14210 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
14220 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
14230 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
14240 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
14250 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
14260 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
14270 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
14280 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14290 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
142a0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
142b0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
142c0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
142d0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
142e0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
142f0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14300 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14310 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14320 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14330 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14340 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14350 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14360 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14370 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
14380 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
14390 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
143a0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
143b0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
143c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
143d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
143e0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
143f0 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
14400 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
14410 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14420 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
14430 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14440 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14450 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14460 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
14470 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
14480 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14490 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
144a0 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
144b0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
144c0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
144d0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
144e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
144f0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14500 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14510 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14520 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14530 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
14540 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14550 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
14560 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
14570 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14580 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14590 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
145a0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
145b0 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
145c0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
145d0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
145e0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
145f0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14600 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14610 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14620 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14630 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14640 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
14650 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14660 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
14670 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
14680 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
14690 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
146a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
146b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
146c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
146d0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
146e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
146f0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
14700 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
14710 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
14720 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
14730 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14740 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14750 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14760 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
14770 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
14780 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14790 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
147a0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
147b0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
147c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
147d0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
147e0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
147f0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14800 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14810 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
14820 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14830 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
14840 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14850 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14860 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14870 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
14880 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14890 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
148a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
148b0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
148c0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
148d0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
148e0 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
148f0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14900 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
14910 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
14920 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14930 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14940 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
14950 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14960 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14970 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14980 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14990 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
149a0 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
149b0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
149c0 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
149d0 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
149e0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
149f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
14a00 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
14a10 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14a20 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
14a30 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
14a40 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
14a50 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14a60 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
14a70 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
14a80 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
14a90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14aa0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
14ab0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14ac0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
14ad0 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ge:         sqli
14ae0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20  te3_test_errstr 
14af0 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
14b00 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
14b10 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
14b20 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
14b30 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
14b40 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
14b50 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
14b60 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
14b70 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
14b80 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
14b90 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
14ba0 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
14bb0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
14bc0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
14bd0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
14be0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
14bf0 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
14c00 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
14c10 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
14c20 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
14c30 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14c40 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14c50 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14c60 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14c70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14c80 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
14c90 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
14ca0 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
14cb0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14cc0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14cd0 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
14ce0 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
14cf0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14d00 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
14d10 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
14d20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
14d30 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
14d40 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
14d50 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
14d60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
14d70 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
14d80 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
14d90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14da0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
14db0 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
14dc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
14dd0 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
14de0 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
14df0 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
14e00 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
14e10 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
14e20 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
14e30 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
14e40 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
14e50 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
14e60 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
14e70 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
14e80 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
14e90 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
14ea0 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
14eb0 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
14ec0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14ed0 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
14ee0 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
14ef0 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
14f00 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
14f10 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
14f20 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
14f30 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
14f40 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
14f50 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
14f60 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
14f70 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
14f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14f90 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
14fa0 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
14fb0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14fc0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
14fd0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
14fe0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
14ff0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
15000 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
15010 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15020 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
15030 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
15040 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
15050 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
15060 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
15070 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
15080 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
15090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
150a0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
150b0 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
150c0 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
150d0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
150e0 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
150f0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
15100 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15110 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
15120 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15130 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15140 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15150 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15160 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
15170 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
15180 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
15190 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
151a0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
151b0 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
151c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
151d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
151e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
151f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15200 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15210 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15220 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
15230 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15240 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
15250 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15260 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
15270 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
15280 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15290 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
152a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
152b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
152c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
152d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
152e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
152f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15300 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15310 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
15320 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15330 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15340 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15350 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
15360 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15370 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15380 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
15390 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
153a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
153b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
153c0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
153d0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
153e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
153f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15400 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
15410 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
15420 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15430 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15440 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15450 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
15460 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
15470 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
15480 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
15490 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
154a0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
154b0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
154c0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
154d0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
154e0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
154f0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
15500 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
15510 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
15520 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
15530 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
15540 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15550 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15560 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15570 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15580 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15590 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
155a0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
155b0 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
155c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
155d0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
155e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
155f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15600 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15610 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
15620 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
15630 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
15640 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
15650 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
15660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15670 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15680 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15690 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
156a0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
156b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
156c0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
156d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
156e0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
156f0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15700 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15710 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15720 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
15730 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
15740 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
15750 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15760 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
15770 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
15780 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15790 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
157a0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
157b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
157c0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
157d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
157e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
157f0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15800 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
15810 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15820 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
15830 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
15840 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15850 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
15860 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15870 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15880 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15890 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
158a0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
158b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
158c0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
158d0 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
158e0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
158f0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
15900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15910 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
15920 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15930 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15940 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15950 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15960 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15970 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
15980 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15990 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  dx;.  Tcl_WideIn
159a0 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
159b0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
159c0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
159d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
159e0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
159f0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15a00 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
15a10 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15a20 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
15a30 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
15a40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15a50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15a60 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15a70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15a80 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15a90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15aa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15ab0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15ac0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15ad0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15ae0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15af0 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
15b00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15b10 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
15b20 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
15b30 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15b40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15b50 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
15b60 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
15b70 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15b80 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15b90 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15ba0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15bb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15bc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15bd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15be0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
15bf0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
15c00 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15c10 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
15c20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
15c30 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
15c40 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
15c50 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
15c60 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15c70 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
15c80 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15c90 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15ca0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15cb0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15cc0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
15cd0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
15ce0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
15cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15d00 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a  st_bind_double(.
15d10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15d20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15d30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15d40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15d50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15d60 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
15d70 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15d80 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c  dx;.  double val
15d90 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
15da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
15db0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
15dc0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
15dd0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
15de0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
15df0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
15e00 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
15e10 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
15e20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
15e30 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
15e40 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
15e50 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
15e60 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
15e70 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
15e80 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
15e90 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
15ea0 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
15eb0 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
15ec0 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
15ed0 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
15ee0 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
15ef0 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
15f00 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
15f10 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
15f20 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
15f30 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15f40 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
15f50 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
15f60 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
15f70 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
15f80 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
15f90 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
15fa0 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
15fb0 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
15fc0 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
15fd0 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
15fe0 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
15ff0 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
16000 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
16010 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
16020 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
16030 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
16040 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
16050 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
16060 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
16070 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16080 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16090 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
160a0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
160b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
160c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
160d0 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
160e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
160f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16100 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
16110 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16120 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16130 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16140 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16150 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16160 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16170 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16190 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
161a0 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
161b0 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
161c0 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
161d0 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
161e0 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
161f0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
16200 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
16210 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
16220 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
16230 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
16240 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
16250 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
16260 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
16270 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
16280 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16290 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
162a0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
162b0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
162c0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
162d0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
162e0 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
162f0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
16300 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
16310 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
16320 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
16330 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
16340 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
16350 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
16360 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
16370 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16380 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
16390 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
163a0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
163b0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
163c0 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
163d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
163e0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
163f0 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
16400 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
16410 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
16420 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
16430 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16440 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
16450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16460 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
16470 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
16480 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
16490 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
164a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
164b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
164c0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
164d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
164e0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
164f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16500 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16510 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16520 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16530 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16540 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
16550 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
16560 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
16570 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
16580 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16590 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
165a0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
165b0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
165c0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
165d0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
165e0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
165f0 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
16600 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
16610 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16620 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
16630 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16640 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16650 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16660 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16670 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16680 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16690 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
166a0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
166b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
166c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
166d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
166e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
166f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16700 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16710 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16720 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
16730 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16740 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16750 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16760 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16770 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16780 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16790 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
167a0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
167b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
167c0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
167d0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
167e0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
167f0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
16800 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16810 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16820 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16830 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16840 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16850 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16860 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16870 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16880 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16890 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
168a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
168b0 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
168c0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
168d0 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
168e0 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
168f0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16900 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16910 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16920 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16930 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16940 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16950 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16960 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
16970 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
16980 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
16990 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
169a0 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
169b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
169c0 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76  t_bind_text(.  v
169d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
169e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
169f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16a00 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16a10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16a20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16a30 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16a40 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
16a50 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
16a60 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
16a70 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
16a80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16a90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16aa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16ab0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16ac0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16ad0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16ae0 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
16af0 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
16b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16b10 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16b20 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
16b30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16b40 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
16b50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16b60 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
16b70 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16b80 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16b90 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16ba0 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
16bb0 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
16bc0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
16bd0 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73  (objv[3], &bytes
16be0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
16bf0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16c00 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
16c10 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
16c20 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16c30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16c40 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
16c50 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
16c60 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16c70 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16c80 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16c90 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
16ca0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16cb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16cd0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16ce0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
16cf0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
16d00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16d10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16d20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
16d40 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
16d50 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f  text16 ?-static?
16d60 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
16d70 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
16d80 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
16d90 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63  _text16 interfac
16da0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16db0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16dc0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16dd0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16de0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16df0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16e00 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16e10 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72  nds a UTF-16 str
16e20 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
16e30 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
16e40 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
16e50 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
16e60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
16e70 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a  st_bind_text16(.
16e80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16e90 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16ea0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16eb0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16ec0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16ed0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16ee0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
16ef0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16f00 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16f10 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
16f20 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
16f30 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44  rc;..  void (*xD
16f40 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62  el)(void*) = (ob
16f50 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41  jc==6?SQLITE_STA
16f60 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53  TIC:SQLITE_TRANS
16f70 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  IENT);.  Tcl_Obj
16f80 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a   *oStmt    = obj
16f90 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c  v[objc-4];.  Tcl
16fa0 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d  _Obj *oN       =
16fb0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20   objv[objc-3];. 
16fc0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e   Tcl_Obj *oStrin
16fd0 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  g  = objv[objc-2
16fe0 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42  ];.  Tcl_Obj *oB
16ff0 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  ytes   = objv[ob
17000 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  jc-1];..  if( ob
17010 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
17020 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
17030 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17040 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17050 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17060 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
17070 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
17080 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
17090 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
170a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
170b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
170c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
170d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
170e0 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c  etString(oStmt),
170f0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
17100 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
17110 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
17120 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c  mObj(interp, oN,
17130 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
17140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
17150 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
17160 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
17170 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b  Obj(oString, 0);
17180 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17190 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
171a0 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29   oBytes, &bytes)
171b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
171c0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
171d0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
171e0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
171f0 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
17200 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20  s, xDel);.  if( 
17210 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17220 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17230 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17240 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17250 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17270 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17280 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
17290 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
172a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
172b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
172c0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
172d0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
172e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
172f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17300 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f  ite3_bind_blob ?
17310 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20  -static? STMT N 
17320 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  DATA BYTES.**.**
17330 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
17340 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65  3_bind_blob inte
17350 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17360 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17370 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17380 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17390 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
173a0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
173b0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
173c0 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74  * binds a BLOB t
173d0 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
173e0 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54   The BLOB is BYT
173f0 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ES bytes in size
17400 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17410 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a  test_bind_blob(.
17420 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17430 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17440 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17450 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17460 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17470 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17480 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
17490 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
174a0 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
174b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
174c0 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74  te3_destructor_t
174d0 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20  ype xDestructor 
174e0 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  = SQLITE_TRANSIE
174f0 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  NT;..  if( objc!
17500 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b  =5 && objc!=6 ){
17510 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17520 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17530 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17540 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17550 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17560 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17570 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
17580 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
17590 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
175a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
175b0 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
175c0 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
175d0 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20  LITE_STATIC;.   
175e0 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   objv++;.  }..  
175f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17600 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17610 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17620 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17630 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17640 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17650 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17660 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17670 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17680 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
17690 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
176a0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
176b0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
176c0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
176d0 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
176e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
176f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17700 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
17710 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17720 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
17730 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17740 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17750 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17760 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17770 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
17780 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17790 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
177a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
177b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
177c0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
177d0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
177e0 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
177f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17800 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
17810 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
17820 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
17830 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17840 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17850 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
17860 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17870 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17880 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17890 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
178a0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
178b0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
178c0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
178d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
178e0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
178f0 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17900 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17910 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17920 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17930 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17940 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17950 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17960 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
17970 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
17980 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
17990 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
179a0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
179b0 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
179c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
179d0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
179e0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
179f0 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
17a00 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17a10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
17a20 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17a30 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
17a40 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
17a50 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
17a60 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
17a70 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
17a80 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
17a90 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
17aa0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17ab0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
17ac0 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
17ad0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17ae0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17af0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17b00 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17b10 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17b20 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17b30 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
17b40 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
17b50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17b60 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17b70 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
17b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17b90 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
17ba0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17bb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17bc0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
17bd0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17be0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
17bf0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17c00 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
17c10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17c20 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17c30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17c40 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
17c50 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
17c60 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
17c70 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
17c80 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
17c90 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17ca0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
17cb0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
17cc0 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
17cd0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17ce0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
17cf0 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
17d00 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
17d10 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
17d20 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
17d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17d40 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
17d50 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
17d60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17d70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17d80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17d90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17da0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17db0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17dc0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17dd0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
17de0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17df0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
17e00 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
17e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17e20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
17e30 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17e40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17e50 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
17e60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e70 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
17e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
17e90 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
17ea0 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
17eb0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17ec0 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
17ed0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17ee0 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
17ef0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17f10 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
17f20 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
17f30 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
17f40 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
17f50 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ings(.  void * c
17f60 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17f70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17f80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17f90 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17fa0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17fb0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
17fc0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17fd0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
17fe0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
17ff0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
18000 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18010 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18020 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18030 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18040 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18050 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18060 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
18070 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18080 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
18090 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
180a0 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
180b0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
180c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
180d0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
180e0 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e  sleep MILLISECON
180f0 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DS.*/.static int
18100 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
18110 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18120 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18130 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18140 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18150 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18160 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
18170 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18180 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18190 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
181a0 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
181b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
181c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
181d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
181e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
181f0 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
18200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18210 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
18220 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18230 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18240 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
18250 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18260 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18270 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
18280 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
18290 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
182a0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
182b0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
182c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
182d0 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
182e0 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
182f0 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18300 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18310 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  _ex_errcode(.  v
18320 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18330 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18340 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18350 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18360 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18370 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18380 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18390 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
183a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
183b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
183c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
183d0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
183e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
183f0 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18400 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18410 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18420 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18430 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18440 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18450 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18460 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18470 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
18480 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
18490 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
184a0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
184b0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
184c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
184d0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
184e0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
184f0 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
18500 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
18510 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
18520 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
18530 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
18540 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
18550 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
18560 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
18570 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
18580 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18590 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
185a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
185b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
185c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
185d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
185e0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
185f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18600 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18610 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18620 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18630 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18640 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18650 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18670 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18680 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18690 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
186a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
186b0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
186c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
186d0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
186e0 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
186f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18700 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18710 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18720 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18730 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18740 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
18750 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18760 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
18770 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18780 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
18790 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
187a0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
187b0 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
187c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
187d0 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
187e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
187f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18800 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18810 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18820 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18830 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18840 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
18850 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18860 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18870 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18880 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18890 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
188a0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
188b0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
188c0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
188d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
188e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
188f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18900 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18910 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18930 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
18940 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
18950 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18960 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
18970 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
18980 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18990 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
189a0 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
189b0 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
189c0 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
189d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
189e0 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
189f0 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
18a00 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
18a10 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18a20 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
18a30 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
18a40 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
18a50 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
18a60 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
18a70 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
18a80 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
18a90 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
18aa0 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
18ab0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
18ac0 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
18ad0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18ae0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18af0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18b00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18b10 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
18b20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
18b30 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
18b40 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
18b50 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20   *zErr;.  const 
18b60 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62  char *z;.  int b
18b70 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
18b80 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18b90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18ba0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18bb0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18bc0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18bd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18be0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18c00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18c10 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18c20 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18c30 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18c40 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
18c50 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
18c60 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
18c70 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
18c80 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45  rr ){.    z = zE
18c90 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65  rr;.    for(byte
18ca0 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c  s=0; z[bytes] ||
18cb0 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74   z[bytes+1]; byt
18cc0 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54  es+=2){}.  }.  T
18cd0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18ce0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
18cf0 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
18d00 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
18d10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18d20 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
18d30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18d40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18d50 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
18d60 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
18d70 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
18d80 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
18d90 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
18da0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
18db0 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
18dc0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
18dd0 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
18de0 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
18df0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
18e00 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
18e10 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
18e20 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
18e30 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
18e40 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
18e50 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
18e60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18e70 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
18e80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18e90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18ea0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18eb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18ec0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18ed0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18ee0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
18ef0 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
18f00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18f10 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
18f20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
18f30 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
18f40 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
18f50 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
18f60 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
18f70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18f80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18f90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18fa0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18fb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18fc0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
18fd0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
18fe0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18ff0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19000 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19010 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19020 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19030 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19040 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19050 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
19060 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
19070 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19080 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19090 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
190a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
190b0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
190c0 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
190d0 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
190e0 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
190f0 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
19100 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
19110 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
19120 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19130 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19140 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19150 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
19160 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
19170 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
19180 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
19190 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61  ytes - (int)(zTa
191a0 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
191b0 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72      if( (int)str
191c0 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
191d0 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
191e0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
191f0 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
19200 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
19210 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
19220 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
19230 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
19240 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
19250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
19270 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
19280 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
19290 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
192a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
192b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
192c0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
192d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
192e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
192f0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
19300 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
19310 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
19320 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
19330 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19340 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
19350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19360 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
19370 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
19380 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19390 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
193a0 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
193b0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
193c0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
193d0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
193e0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
193f0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
19400 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
19410 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
19420 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
19430 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19440 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19450 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19460 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19470 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19480 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
19490 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
194a0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
194b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
194c0 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
194d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
194e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
194f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19500 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19510 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19520 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
19530 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19540 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
19550 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19560 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
19570 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19580 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
19590 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
195a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
195b0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
195c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
195d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
195e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
195f0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19600 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19610 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
19620 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
19630 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19640 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19650 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19660 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19670 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19680 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
19690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
196a0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
196b0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
196c0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
196d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
196e0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
196f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19700 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19710 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
19720 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
19730 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
19740 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61  &zTail : 0);.  a
19750 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
19760 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
19770 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
19780 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
19790 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
197a0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
197b0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
197c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
197d0 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
197e0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
197f0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
19800 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
19810 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
19820 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
19830 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
19840 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
19850 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
19860 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
19870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19880 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19890 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
198a0 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
198b0 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
198c0 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
198d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
198e0 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
198f0 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
19900 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19910 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19920 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
19930 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
19940 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
19950 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
19960 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19970 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
19980 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19990 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
199a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
199b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
199c0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
199d0 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a  _tkt3134 DB.**.*
199e0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72 65  * Generate a pre
199f0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
19a00 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20  for a zero-byte 
19a10 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73 74  string as a test
19a20 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23  .** for ticket #
19a30 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e  3134.  The strin
19a40 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63  g should be prec
19a50 65 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  eeded by a zero 
19a60 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
19a70 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19a80 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
19a90 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19aa0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19ab0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19ac0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19ad0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19ae0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
19af0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
19b00 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
19b10 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
19b20 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19b30 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19b40 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19b50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19b60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19b70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19b80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19b90 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19ba0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19bb0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
19bc0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
19bd0 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
19be0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19bf0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19c00 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19c10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19c20 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19c40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19c50 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
19c60 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
19c70 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
19c80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
19c90 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
19ca0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19cb0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19cc0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
19cd0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
19ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19cf0 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
19d00 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
19d10 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
19d20 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
19d30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19d40 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
19d50 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
19d60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19d70 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19d80 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
19d90 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
19da0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
19db0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
19dc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19dd0 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
19de0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19df0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
19e00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19e20 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
19e30 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73  e16 DB sql bytes
19e40 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
19e50 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
19e60 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
19e70 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
19e80 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
19e90 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
19ea0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
19eb0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
19ec0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
19ed0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
19ee0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
19ef0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
19f00 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
19f10 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
19f20 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
19f30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
19f40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
19f50 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
19f60 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19f70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19f80 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19f90 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19fa0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19fb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
19fc0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
19fd0 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
19fe0 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
19ff0 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1a000 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1a010 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1a020 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1a030 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a040 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1a050 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1a060 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a070 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1a080 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1a090 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1a0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a0b0 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1a0c0 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1a0d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a0e0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a0f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a100 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a110 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a120 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a130 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a140 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a150 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1a160 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a170 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a180 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1a190 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1a1a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1a1b0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1a1c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1a1d0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1a1e0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1a1f0 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1a200 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a210 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a220 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1a230 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a240 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1a250 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
1a260 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1a270 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a280 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a290 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a2a0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a2b0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1a2c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a2d0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1a2e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a2f0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1a300 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1a310 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1a320 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1a330 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1a340 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1a350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1a360 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1a370 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1a380 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1a390 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1a3a0 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1a3b0 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1a3c0 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1a3d0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1a3e0 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1a3f0 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1a400 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1a410 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1a420 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1a430 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a440 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a450 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1a460 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a470 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1a480 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a490 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1a4a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1a4b0 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1a4c0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a4d0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a4e0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42  _prepare16_v2 DB
1a4f0 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1a500 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
1a510 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1a520 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1a530 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1a540 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1a550 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a560 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1a570 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1a580 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1a590 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1a5a0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1a5b0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1a5c0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1a5d0 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1a5e0 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1a5f0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1a600 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
1a610 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  16_v2(.  void * 
1a620 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a630 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a640 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1a650 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1a660 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1a670 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a680 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1a690 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a6a0 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  zSql;.  const vo
1a6b0 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  id *zTail = 0;. 
1a6c0 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20   Tcl_Obj *pTail 
1a6d0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1a6e0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1a6f0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1a700 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
1a710 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20  t bytes;        
1a720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1a730 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64  nteger specified
1a740 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69   as arg 3 */.  i
1a750 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20  nt objlen;      
1a760 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a770 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74  byte-array lengt
1a780 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20  h of arg 2 */.. 
1a790 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
1a7a0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
1a7b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a7c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a7d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a7e0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a7f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a800 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1a810 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c  ytes ?tailvar?",
1a820 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a830 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a840 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a850 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a860 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a870 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a880 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1a890 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
1a8a0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1a8b0 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
1a8c0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1a8d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1a8e0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1a8f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a900 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1a910 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1a920 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1a930 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1a940 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1a950 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a960 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a970 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1a980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a990 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1a9a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a9b0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
1a9c0 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
1a9d0 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
1a9e0 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
1a9f0 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c  int)((u8 *)zTail
1aa00 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20  -(u8 *)zSql);.  
1aa10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
1aa20 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  bjlen = 0;.    }
1aa30 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c  .    pTail = Tcl
1aa40 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1aa50 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
1aa60 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49  jlen);.    Tcl_I
1aa70 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
1aa80 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53  l);.    Tcl_ObjS
1aa90 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1aaa0 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
1aab0 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
1aac0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1aad0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  );.  }..  if( pS
1aae0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1aaf0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1ab00 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1ab10 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1ab20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ab30 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
1ab40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ab50 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1ab60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1ab70 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1ab80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1ab90 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1aba0 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65  e3_open filename
1abb0 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a   ?options-list?.
1abc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1abd0 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20  st_open(.  void 
1abe0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1abf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ac00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ac10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ac20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1ac30 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1ac40 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1ac50 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1ac60 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1ac70 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26  !=3 && objc!=2 &
1ac80 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
1ac90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1aca0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1acb0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1acc0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1acd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ace0 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
1acf0 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
1ad00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ad10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ad20 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f  .  zFilename = o
1ad30 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53  bjc>1 ? Tcl_GetS
1ad40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a  tring(objv[1]) :
1ad50 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70   0;.  sqlite3_op
1ad60 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
1ad70 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1ad80 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1ad90 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1ada0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1adb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1adc0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1add0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1ade0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1adf0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ae00 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  e: sqlite3_open_
1ae10 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  v2 FILENAME FLAG
1ae20 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20  S VFS.*/.static 
1ae30 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32  int test_open_v2
1ae40 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ae50 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ae60 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ae70 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1ae80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ae90 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1aea0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63   *zFilename;.  c
1aeb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
1aec0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1aed0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1aee0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1aef0 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1af00 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c  int nFlag;.  Tcl
1af10 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20  _Obj **apFlag;. 
1af20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1af30 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1af40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1af50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1af60 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20  "FILENAME FLAGS 
1af70 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  VFS");.    retur
1af80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1af90 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
1afa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1afb0 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20  v[1]);.  zVfs = 
1afc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1afd0 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56  jv[3]);.  if( zV
1afe0 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56  fs[0]==0x00 ) zV
1aff0 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  fs = 0;..  rc = 
1b000 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
1b010 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
1b020 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20  bjv[2], &nFlag, 
1b030 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20  &apFlag);.  if( 
1b040 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1b050 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  urn rc;.  for(i=
1b060 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29  0; i<nFlag; i++)
1b070 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b  {.    int iFlag;
1b080 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e  .    struct Open
1b090 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e  Flag {.      con
1b0a0 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a  st char *zFlag;.
1b0b0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a        int flag;.
1b0c0 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20      } aFlag[] = 
1b0d0 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  {.      { "SQLIT
1b0e0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22  E_OPEN_READONLY"
1b0f0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1b100 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
1b110 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1b120 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54  EADWRITE", SQLIT
1b130 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b140 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b150 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22  ITE_OPEN_CREATE"
1b160 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
1b170 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  EATE },.      { 
1b180 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  "SQLITE_OPEN_DEL
1b190 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c  ETEONCLOSE", SQL
1b1a0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1b1b0 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20  NCLOSE },.      
1b1c0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  { "SQLITE_OPEN_E
1b1d0 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54  XCLUSIVE", SQLIT
1b1e0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1b1f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b200 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1b210 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  XY", SQLITE_OPEN
1b220 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20  _AUTOPROXY },.  
1b230 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b240 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c  EN_MAIN_DB", SQL
1b250 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1b260 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b270 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1b280 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1b290 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  EMP_DB },.      
1b2a0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b2b0 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51  RANSIENT_DB", SQ
1b2c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1b2d0 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  ENT_DB },.      
1b2e0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1b2f0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  AIN_JOURNAL", SQ
1b300 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1b310 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b320 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b330 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  EMP_JOURNAL", SQ
1b340 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1b350 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b360 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b370 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  UBJOURNAL", SQLI
1b380 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1b390 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b3a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1b3b0 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  R_JOURNAL", SQLI
1b3c0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1b3d0 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b3e0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  { "SQLITE_OPEN_N
1b3f0 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  OMUTEX", SQLITE_
1b400 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a  OPEN_NOMUTEX },.
1b410 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b420 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c  OPEN_FULLMUTEX",
1b430 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
1b440 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  LMUTEX },.      
1b450 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b460 48 41 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c  HAREDCACHE", SQL
1b470 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1b480 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b490 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  "SQLITE_OPEN_PRI
1b4a0 56 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49  VATECACHE", SQLI
1b4b0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1b4c0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b4d0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  "SQLITE_OPEN_WAL
1b4e0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  ", SQLITE_OPEN_W
1b4f0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b500 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c  QLITE_OPEN_URI",
1b510 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
1b520 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   },.      { 0, 0
1b530 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63   }.    };.    rc
1b540 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
1b550 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
1b560 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20  erp, apFlag[i], 
1b570 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46  aFlag, sizeof(aF
1b580 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  lag[0]), .      
1b590 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46    "flag", 0, &iF
1b5a0 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  lag.    );.    i
1b5b0 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1b5c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66  return rc;.    f
1b5d0 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46  lags |= aFlag[iF
1b5e0 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a  lag].flag;.  }..
1b5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1b600 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65  pen_v2(zFilename
1b610 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  , &db, flags, zV
1b620 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  fs);.  if( sqlit
1b630 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1b640 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1b650 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
1b660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1b670 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b680 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1b690 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b6b0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20   sqlite3_open16 
1b6c0 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1b6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b6e0 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f  est_open16(.  vo
1b6f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b700 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b710 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b720 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b730 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1b740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b750 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20  T_UTF16.  const 
1b760 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  void *zFilename;
1b770 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1b780 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1b790 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1b7a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b7b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b7c0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b7d0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b7e0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b7f0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b800 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1b810 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1b820 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b830 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1b840 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
1b850 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1b860 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c  jv[1], 0);.  sql
1b870 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c  ite3_open16(zFil
1b880 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
1b890 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1b8a0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1b8b0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1b8c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b8d0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1b8e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b8f0 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1b900 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b910 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1b920 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b930 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b940 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55  e3_complete16 <U
1b950 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a  TF-16 string>.**
1b960 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1b970 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72 67  the supplied arg
1b980 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c  ument is a compl
1b990 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
1b9a0 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74  t, or zero.** ot
1b9b0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1b9c0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70  ic int test_comp
1b9d0 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  lete16(.  void *
1b9e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1b9f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ba00 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ba10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ba20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64  objv[].){.#if !d
1ba30 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ba40 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20  IT_COMPLETE) && 
1ba50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ba60 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68  OMIT_UTF16).  ch
1ba70 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28  ar *zBuf;..  if(
1ba80 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1ba90 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1baa0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1bab0 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22  , "<utf-16 sql>"
1bac0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bad0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1bae0 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63  zBuf = (char*)Tc
1baf0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1bb00 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1bb10 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1bb20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1bb30 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1bb40 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
1bb50 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f  Buf)));.#endif /
1bb60 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
1bb70 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45  MPLETE && SQLITE
1bb80 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1bb90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bba0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bbb0 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d  sqlite3_step STM
1bbc0 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  T.**.** Advance 
1bbd0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
1bbe0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
1bbf0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1bc00 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a  t_step(.  void *
1bc10 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bc20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bc30 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bc40 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bc50 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1bc60 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1bc70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1bc80 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bc90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bca0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bcb0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bcc0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bcd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bce0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c  jv[0]), " STMT",
1bcf0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1bd00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1bd10 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1bd20 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1bd30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bd40 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1bd50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bd70 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20  step(pStmt);..  
1bd80 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  /* if( rc!=SQLIT
1bd90 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51  E_DONE && rc!=SQ
1bda0 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72  LITE_ROW ) retur
1bdb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a  n TCL_ERROR; */.
1bdc0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1bdd0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1bde0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1bdf0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1be00 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1be10 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20 20  int test_sql(.  
1be20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1be30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1be40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1be50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1be60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1be70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1be80 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1be90 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1bea0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1beb0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1bec0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
1bed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bee0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1bef0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bf00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bf10 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1bf20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bf30 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
1bf40 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1bf50 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c 28  r *)sqlite3_sql(
1bf60 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41  pStmt), TCL_VOLA
1bf70 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
1bf80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1bf90 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1bfa0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
1bfb0 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
1bfc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1bfd0 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
1bfe0 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
1bff0 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
1c000 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c010 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
1c020 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c030 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c040 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c050 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c060 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c070 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c080 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1c090 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c0a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c0b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c0c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c0d0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c0e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c0f0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c100 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c110 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c120 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c130 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c140 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c150 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c170 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1c180 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c190 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1c1a0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
1c1b0 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
1c1c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c1d0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c1e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
1c1f0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1c200 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
1c210 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
1c220 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1c230 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1c240 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
1c250 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79  t test_column_ty
1c260 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1c270 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c280 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c290 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c2a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c2b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c2c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1c2d0 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70  nt col;.  int tp
1c2e0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c2f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c300 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c310 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c320 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c330 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c340 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c350 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1c360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c370 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c380 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c390 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c3a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c3b0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c3c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c3d0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1c3e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1c3f0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1c400 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c410 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65  ;..  tp = sqlite
1c420 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
1c430 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69  tmt, col);.  swi
1c440 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63  tch( tp ){.    c
1c450 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1c460 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  ER: .      Tcl_S
1c470 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c480 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f   "INTEGER", TCL_
1c490 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1c4a0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c4b0 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20  SQLITE_NULL:.   
1c4c0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1c4d0 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c  (interp, "NULL",
1c4e0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1c4f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c500 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
1c510 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
1c520 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c530 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54  FLOAT", TCL_STAT
1c540 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c550 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c560 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54  TE_TEXT:.      T
1c570 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c580 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c  erp, "TEXT", TCL
1c590 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1c5a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c5b0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
1c5c0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1c5d0 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22  t(interp, "BLOB"
1c5e0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1c5f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c600 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1c610 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
1c620 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c640 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c650 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d  int64 STMT colum
1c660 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1c670 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1c680 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1c690 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1c6a0 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65  st as an.** wide
1c6b0 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65   (64-bit) intege
1c6c0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1c6d0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
1c6e0 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
1c6f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c700 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c710 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c720 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c730 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c740 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1c750 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56  nt col;.  i64 iV
1c760 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1c770 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1c780 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c790 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c7a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c7b0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c7c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c7d0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c7e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c7f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c800 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c810 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c820 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c830 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c850 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1c860 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1c870 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1c880 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c890 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71  OR;..  iVal = sq
1c8a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1c8b0 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  64(pStmt, col);.
1c8c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1c8d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1c8e0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61  ewWideIntObj(iVa
1c8f0 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1c900 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c910 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c920 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63  lumn_blob STMT c
1c930 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
1c940 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1c950 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
1c960 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c970 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c980 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c990 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c9a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1c9b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1c9c0 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74   int col;..  int
1c9d0 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   len;.  const vo
1c9e0 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66  id *pBlob;..  if
1c9f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1ca00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ca10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ca20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ca30 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ca40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ca50 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1ca60 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1ca70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ca80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1ca90 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1caa0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cab0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1cac0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1cad0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1cae0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1caf0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cb00 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1cb10 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65  TCL_ERROR;..  le
1cb20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
1cb30 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
1cb40 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  col);.  pBlob = 
1cb50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1cb60 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  lob(pStmt, col);
1cb70 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1cb80 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1cb90 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1cba0 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20  pBlob, len));.  
1cbb0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1cbc0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1cbd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1cbe0 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  uble STMT column
1cbf0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cc00 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1cc10 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1cc20 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
1cc30 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  t as a double..*
1cc40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1cc50 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
1cc60 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1cc70 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1cc80 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1cc90 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1cca0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ccb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1ccc0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1ccd0 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
1cce0 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1ccf0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1cd00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cd10 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1cd20 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1cd30 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1cd40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1cd50 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1cd60 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1cd70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cd80 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1cd90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1cda0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cdb0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1cdc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cdd0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1cde0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1cdf0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1ce00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ce10 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
1ce20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1ce30 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
1ce40 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1ce50 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ce60 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
1ce70 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1ce80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ce90 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
1cea0 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
1ceb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cec0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1ced0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
1cee0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
1cef0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
1cf00 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  int test_data_co
1cf10 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1cf20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1cf30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cf40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1cf50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cf60 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1cf70 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1cf80 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1cf90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cfa0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cfb0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cfc0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1cfd0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cfe0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1cff0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d000 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d010 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d020 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d030 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d040 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d050 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d060 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1d070 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d080 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1d090 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
1d0a0 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
1d0b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1d0c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d0d0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d0e0 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1d0f0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1d100 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d110 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1d120 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d130 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d140 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1d150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d160 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20  est_stmt_utf8(. 
1d170 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d180 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ta,        /* Po
1d190 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1d1a0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1d1b0 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54  be invoke */.  T
1d1c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d1d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d1e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d1f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d200 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d210 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f  .  int col;.  co
1d220 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e  nst char *(*xFun
1d230 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1d240 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20  , int);.  const 
1d250 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78  char *zRet;..  x
1d260 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Func = (const ch
1d270 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f  ar *(*)(sqlite3_
1d280 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1d290 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1d2a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d2b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d2c0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d2d0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d2e0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d2f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d300 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d310 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d330 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d340 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d350 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d360 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d370 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d380 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1d390 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d3a0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1d3b0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1d3c0 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20  ERROR;.  zRet = 
1d3d0 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
1d3e0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
1d3f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1d400 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1d410 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d   *)zRet, 0);.  }
1d420 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d430 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1d440 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
1d450 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
1d460 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d470 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d480 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d490 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d4a0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1d4b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1d4c0 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a  CATED.  int rc;.
1d4d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
1d4e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d4f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d500 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
1d510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d520 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1d530 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
1d540 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
1d550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1d560 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1d570 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1d580 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
1d590 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d5a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d5b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d5c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d5d0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d5e0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1d5f0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1d600 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d610 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
1d620 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
1d630 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1d640 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
1d650 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1d660 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d670 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1d680 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1d690 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
1d6a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d6b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d6c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d6d0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1d6e0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1d6f0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1d700 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1d710 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
1d720 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
1d730 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
1d740 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
1d750 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1d760 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  );..  xFunc = (c
1d770 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73  onst void *(*)(s
1d780 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1d790 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1d7a0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1d7b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d7c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d7d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d7e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d7f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d800 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d810 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d820 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d830 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d840 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d850 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d860 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d870 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d880 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d890 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d8a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d8b0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1d8c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d8d0 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63   zName16 = xFunc
1d8e0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1d8f0 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20  if( zName16 ){. 
1d900 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f     int n;.    co
1d910 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e  nst char *z = zN
1d920 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e  ame16;.    for(n
1d930 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b  =0; z[n] || z[n+
1d940 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20  1]; n+=2){}.    
1d950 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pRet = Tcl_NewBy
1d960 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65  teArrayObj(zName
1d970 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63  16, n+2);.    Tc
1d980 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d990 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
1d9a0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1d9b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1d9c0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1d9d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d9e0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d9f0 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d  n_int STMT colum
1da00 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1da10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1da20 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  tes STMT column.
1da30 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1da40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1da50 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  s16 STMT column.
1da60 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1da70 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a   test_stmt_int(.
1da80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1da90 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ata,    /* Point
1daa0 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
1dab0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
1dac0 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
1dad0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1dae0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1daf0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1db00 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1db10 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1db20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1db30 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1db40 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20  _stmt*, int);.. 
1db50 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a   xFunc = (int (*
1db60 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1db70 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1db80 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1db90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1dba0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1dbb0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1dbc0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1dbd0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1dbe0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1dbf0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1dc00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1dc10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1dc20 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1dc30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1dc40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1dc50 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1dc60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dc70 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1dc80 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1dc90 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1dca0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1dcb0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1dcc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1dcd0 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63  _NewIntObj(xFunc
1dce0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a  (pStmt, col)));.
1dcf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1dd00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1dd10 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67    sqlite_set_mag
1dd20 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55  ic  DB  MAGIC-NU
1dd30 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  MBER.**.** Set t
1dd40 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c  he db->magic val
1dd50 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ue.  This is use
1dd60 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20  d to test error 
1dd70 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a  recovery logic..
1dd80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1dd90 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a  lite_set_magic(.
1dda0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ddb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ddc0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ddd0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1dde0 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1ddf0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1de00 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1de10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1de20 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1de30 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1de40 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
1de50 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22       " DB MAGIC"
1de60 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1de70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1de80 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1de90 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1dea0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1deb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1dec0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1ded0 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1dee0 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20  _OPEN")==0 ){.  
1def0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1df00 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
1df10 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1df20 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1df30 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1df40 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  D")==0 ){.    db
1df50 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1df60 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
1df70 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1df80 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1df90 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d  TE_MAGIC_BUSY")=
1dfa0 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1dfb0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1dfc0 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  IC_BUSY;.  }else
1dfd0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1dfe0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1dff0 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b  IC_ERROR")==0 ){
1e000 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e010 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
1e020 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
1e030 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
1e040 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e  rp, argv[2], (in
1e050 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29  t*)&db->magic) )
1e060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1e070 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1e080 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e090 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1e0a0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20  lite3_interrupt 
1e0b0 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67   DB .**.** Trigg
1e0c0 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  er an interrupt 
1e0d0 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  on DB.*/.static 
1e0e0 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75  int test_interru
1e0f0 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pt(.  void * cli
1e100 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e110 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e120 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1e130 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1e140 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1e150 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1e160 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e170 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e180 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e190 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e1a0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1e1b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e1c0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1e1d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e1e0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1e1f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e200 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  ;.  sqlite3_inte
1e210 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74  rrupt(db);.  ret
1e220 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1e230 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65  tatic u8 *sqlite
1e240 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1e250 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c   = 0;../*.** Fil
1e260 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68  l the stack with
1e270 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74   a known bitpatt
1e280 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ern..*/.static v
1e290 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f  oid prepStack(vo
1e2a0 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
1e2b0 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33 36  u32 bigBuf[65536
1e2c0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
1e2d0 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f 73  sizeof(bigBuf)/s
1e2e0 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d 29  izeof(bigBuf[0])
1e2f0 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d  ; i++) bigBuf[i]
1e300 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20   = 0xdeadbeef;. 
1e310 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62   sqlite3_stack_b
1e320 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26  aseline = (u8*)&
1e330 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d  bigBuf[65536];.}
1e340 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1e350 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65  current stack de
1e360 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64  pth.  Used for d
1e370 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
1e380 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61  /.u64 sqlite3Sta
1e390 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20  ckDepth(void){. 
1e3a0 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20   u8 x;.  return 
1e3b0 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74  (u64)(sqlite3_st
1e3c0 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26  ack_baseline - &
1e3d0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  x);.}../*.** Usa
1e3e0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ge:  sqlite3_sta
1e3f0 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a  ck_used DB SQL.*
1e400 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73  *.** Try to meas
1e410 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ure the amount o
1e420 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73  f stack space us
1e430 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
1e440 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a  sqlite3_exec.*/.
1e450 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e460 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f  stack_used(.  vo
1e470 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e480 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e490 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1e4a0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1e4b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1e4c0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1e4d0 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1e4e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e4f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e500 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e510 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e520 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53   .        " DB S
1e530 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
1e540 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e550 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1e560 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1e570 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1e580 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e590 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20    prepStack();. 
1e5a0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
1e5b0 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
1e5c0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
1e5d0 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26  (i=65535; i>=0 &
1e5e0 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33  & ((u32*)sqlite3
1e5f0 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29  _stack_baseline)
1e600 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66  [-i]==0xdeadbeef
1e610 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53  ; i--){}.  Tcl_S
1e620 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e630 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e640 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72  j(i*4));.  retur
1e650 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e660 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1e670 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
1e680 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1e690 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1e6a0 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1e6b0 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
1e6c0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1e6d0 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
1e6e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1e6f0 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1e700 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
1e710 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
1e720 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
1e730 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
1e740 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1e750 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1e760 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
1e770 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1e780 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1e790 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e7a0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1e7b0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1e7c0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1e7d0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1e7e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e7f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e800 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e810 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e820 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1e830 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1e840 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1e850 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e860 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e870 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e880 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1e890 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e8a0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1e8b0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1e8c0 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1e8d0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1e8e0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1e8f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1e900 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1e910 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1e920 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1e930 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e940 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1e950 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
1e960 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
1e970 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1e980 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
1e990 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
1e9a0 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
1e9b0 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1e9c0 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
1e9d0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e9e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1e9f0 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
1ea00 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
1ea10 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1ea20 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1ea30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1ea40 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
1ea50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ea60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ea70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ea80 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1ea90 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1eaa0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1eab0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1eac0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ead0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1eae0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1eaf0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1eb00 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1eb10 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1eb20 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1eb30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1eb40 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1eb50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1eb60 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1eb70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1eb80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1eb90 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1eba0 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
1ebb0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
1ebc0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1ebd0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1ebe0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1ebf0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1ec00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ec10 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ec20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1ec30 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
1ec40 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1ec50 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
1ec60 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
1ec70 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
1ec80 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1ec90 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
1eca0 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63  ic int get_autoc
1ecb0 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  ommit(.  void * 
1ecc0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ecd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ece0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1ecf0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1ed00 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1ed10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ed20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1ed30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ed40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ed50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ed60 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ed70 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1ed80 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1ed90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1eda0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1edb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1edc0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1edd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ede0 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1edf0 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1ee00 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1ee10 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1ee20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1ee30 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1ee40 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ee50 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1ee60 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1ee70 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1ee80 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1ee90 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1eea0 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1eeb0 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1eec0 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1eed0 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1eee0 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1eef0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1ef00 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1ef10 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1ef20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ef30 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1ef40 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1ef50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ef60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1ef70 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1ef80 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1ef90 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1efa0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1efb0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1efc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1efd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1efe0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1eff0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1f000 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1f010 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f020 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f030 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f040 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f050 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f060 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1f070 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1f080 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1f090 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f0a0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f0b0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1f0c0 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1f0d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f0e0 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1f0f0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1f100 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f110 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c  *.** Usage:  tcl
1f120 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56  _variable_type V
1f130 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ARIABLENAME.**.*
1f140 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1f150 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  e of the interna
1f160 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
1f170 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75   for the.** valu
1f180 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76  e of the given v
1f190 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1f1a0 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61  ic int tcl_varia
1f1b0 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  ble_type(.  void
1f1c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f1d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f1e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f1f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f200 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1f210 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69  l_Obj *pVar;.  i
1f220 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f230 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f240 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f250 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b  jv, "VARIABLE");
1f260 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f270 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61  ERROR;.  }.  pVa
1f280 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
1f290 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  x(interp, Tcl_Ge
1f2a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f2b0 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45  , 0, TCL_LEAVE_E
1f2c0 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70  RR_MSG);.  if( p
1f2d0 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Var==0 ) return 
1f2e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1f2f0 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29   pVar->typePtr )
1f300 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1f310 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1f320 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1f330 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
1f340 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
1f350 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f360 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f370 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1f380 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a  _memory ?N?.**.*
1f390 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * Attempt to rel
1f3a0 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
1f3b0 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e  ently held but n
1f3c0 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  ot actually requ
1f3d0 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74  ired..** The int
1f3e0 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75  eger N is the nu
1f3f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65  mber of bytes we
1f400 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1f410 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a  elease.  The .**
1f420 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f430 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
1f440 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72  emory actually r
1f450 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  eleased..*/.stat
1f460 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65  ic int test_rele
1f470 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1f480 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f490 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f4a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f4b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f4c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1f4d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f4e0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1f4f0 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
1f500 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f510 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
1f520 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
1f530 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1f540 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f550 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f560 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f570 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1f580 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f590 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1f5a0 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1f5b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1f5c0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1f5d0 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1f5e0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
1f5f0 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
1f600 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
1f610 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
1f620 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1f630 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1f640 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
1f650 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1f660 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1f670 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f680 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1f690 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
1f6a0 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1f6b0 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1f6c0 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
1f6d0 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
1f6e0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1f6f0 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
1f700 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
1f710 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
1f720 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
1f730 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
1f740 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1f750 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f760 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f770 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f780 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f790 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f7a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f7b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1f7c0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1f7d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1f7e0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1f7f0 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1f800 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f810 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f820 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1f830 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f840 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1f850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62   rc = sqlite3_db
1f870 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1f880 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
1f890 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1f8a0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
1f8b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1f8c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f8d0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
1f8e0 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e  _filename DB DBN
1f8f0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1f900 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
1f910 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1f920 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a  ith a database..
1f930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f940 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a  st_db_filename(.
1f950 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f960 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f970 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f980 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f990 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f9a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f9b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f9c0 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
1f9d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1f9e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f9f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1fa00 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
1fa10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa20 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1fa30 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1fa40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1fa50 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1fa60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa70 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
1fa80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1fa90 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
1faa0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fab0 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  , sqlite3_db_fil
1fac0 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d  ename(db, zDbNam
1fad0 65 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  e), (void*)0);. 
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 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
1fb10 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a  only DB DBNAME.*
1fb20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72  *.** Return 1 or
1fb30 20 30 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20   0 if DBNAME is 
1fb40 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e  readonly or not.
1fb50 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44    Return -1 if D
1fb60 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f  BNAME does.** no
1fb70 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  t exist..*/.stat
1fb80 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72  ic int test_db_r
1fb90 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  eadonly(.  void 
1fba0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1fbb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fbc0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1fbd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1fbe0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1fbf0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1fc00 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
1fc10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1fc20 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1fc30 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1fc40 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
1fc50 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
1fc60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fc70 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1fc80 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1fc90 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1fca0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1fcb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
1fcc0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
1fcd0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1fce0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1fcf0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1fd00 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1fd10 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c  _db_readonly(db,
1fd20 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72   zDbName)));.  r
1fd30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fd40 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1fd50 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
1fd60 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a  _limit ?N?.**.**
1fd70 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
1fd80 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69  e soft heap limi
1fd90 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
1fda0 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a  t thread.  The.*
1fdb0 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20  * limit is only 
1fdc0 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e  changed if the N
1fdd0 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68   is present.  Th
1fde0 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74  e previous limit
1fdf0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
1fe00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1fe10 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
1fe20 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
1fe30 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1fe40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1fe50 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1fe60 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1fe70 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1fe80 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63  _int64 amt;.  Tc
1fe90 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31  l_WideInt N = -1
1fea0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1feb0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
1fec0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1fed0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1fee0 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20  jv, "?N?");.    
1fef0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ff00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
1ff10 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
1ff20 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
1ff30 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1ff40 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1ff50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ff60 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
1ff70 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1ff80 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  t64(N);.  Tcl_Se
1ff90 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ffa0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
1ffb0 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
1ffc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ffd0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1ffe0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
1fff0 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
20000 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
20010 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
20020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
20030 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
20040 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  up(.  void * cli
20050 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20060 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20070 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
20080 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20090 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
200a0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
200b0 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74  ATED.  sqlite3_t
200c0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b  hread_cleanup();
200d0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
200e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
200f0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
20100 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
20110 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ts  DB.**.** Ret
20120 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75  urn a list of nu
20130 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
20140 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e  the PagerRefcoun
20150 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67  t for all.** pag
20160 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61  ers on each data
20170 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
20180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
20190 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
201a0 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nts(.  void * cl
201b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
201c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
201d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
201e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
201f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20200 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
20210 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63   int v, *a;.  Tc
20220 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
20230 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
20240 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20250 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20260 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20270 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
20280 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
20290 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
202a0 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
202b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
202c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
202d0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
202e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
202f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20300 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20310 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c  _ERROR;.  pResul
20320 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
20330 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
20340 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20350 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
20360 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pBt==0 ){.     
20370 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   v = -1;.    }el
20380 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
20390 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
203a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
203b0 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
203c0 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 72  Stats(sqlite3Btr
203d0 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
203e0 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20  i].pBt));.      
203f0 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  v = a[0];.      
20400 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20410 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
20420 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
20430 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20440 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54  nt(0, pResult, T
20450 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
20460 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
20470 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20480 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74   pResult);.  ret
20490 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
204a0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
204b0 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
204c0 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c  t.**.** Some TCL
204d0 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67   builds (ex: cyg
204e0 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70  win) do not supp
204f0 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ort 64-bit integ
20500 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65  ers.  This.** le
20510 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20  ads to a number 
20520 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  of test failures
20530 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63  .  The present c
20540 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68  ommand checks th
20550 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74  e.** TCL build t
20560 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
20570 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73   not it supports
20580 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
20590 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  .  It.** returns
205a0 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73   TRUE if it does
205b0 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
205c0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  t..**.** This co
205d0 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
205e0 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74   warn users that
205f0 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64   their TCL build
20600 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a   is defective.**
20610 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72   and that the er
20620 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65  rors they are se
20630 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74  eing in the test
20640 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62   scripts might b
20650 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66  e.** a result of
20660 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65   their defective
20670 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e   TCL rather than
20680 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c   problems in SQL
20690 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ite..*/.static i
206a0 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  nt working_64bit
206b0 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  _int(.  ClientDa
206c0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
206d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
206e0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
206f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
20700 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20710 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
20720 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
20730 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
20740 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
20750 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
20760 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
20770 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
20780 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20790 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
207a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
207b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74    Tcl_Obj *pTest
207c0 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69  Obj;.  int worki
207d0 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74  ng = 0;..  pTest
207e0 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Obj = Tcl_NewWid
207f0 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a  eIntObj(1000000*
20800 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29  (i64)1234567890)
20810 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74  ;.  working = st
20820 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
20830 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31  ng(pTestObj), "1
20840 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22  234567890000000"
20850 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72  )==0;.  Tcl_Decr
20860 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62  RefCount(pTestOb
20870 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  j);.  Tcl_SetObj
20880 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20890 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
208a0 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65  (working));.  re
208b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
208c0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
208d0 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
208e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
208f0 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74  command unregist
20900 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20  ers the primary 
20910 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67  VFS and then reg
20920 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63  isters.** it bac
20930 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69  k again.  This i
20940 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
20950 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
20960 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20  gister a.** VFS 
20970 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72  when none are pr
20980 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
20990 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69  red, and the abi
209a0 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65  lity to .** unre
209b0 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20  gister the only 
209c0 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20  available VFS.  
209d0 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a  Ticket #2738.*/.
209e0 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
209f0 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c  nlink_test(.  Cl
20a00 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
20a10 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
20a20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
20a30 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
20a40 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
20a50 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
20a60 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
20a70 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20a80 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20a90 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
20aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20ab0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
20ac0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
20ad0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
20ae0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
20af0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
20b00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d   sqlite3_vfs *pM
20b10 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ain;.  sqlite3_v
20b20 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20  fs *apVfs[20];. 
20b30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
20b40 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  , two;..  sqlite
20b50 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
20b60 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69  (0);   /* Unregi
20b70 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20  ster of NULL is 
20b80 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e  harmless */.  on
20b90 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
20ba0 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d  ";.  two.zName =
20bb0 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20   "__two";..  /* 
20bc0 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
20bd0 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
20be0 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f  h 2nd argument o
20bf0 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  f 0 does not.  *
20c00 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 66  * change the def
20c10 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20  ault VFS.  */.  
20c20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pMain = sqlite3_
20c30 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73  vfs_find(0);.  s
20c40 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20c50 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20  ter(&one, 0);.  
20c60 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
20c70 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
20c80 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
20c90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
20ca0 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30  register(&two, 0
20cb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
20cc0 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
20cd0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20ce0 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  (0) );..  /* We 
20cf0 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62  can find a VFS b
20d00 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  y its name */.  
20d10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20d20 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
20d30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
20d40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
20d50 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
20d60 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  &two );..  /* Ca
20d70 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73  lling sqlite_vfs
20d80 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 6e  _register with n
20d90 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70  on-zero second p
20da0 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73  arameter changes
20db0 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
20dc0 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74  t VFS, even if t
20dd0 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65 72  he 1st parameter
20de0 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20 56   is an existig V
20df0 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  FS that is.  ** 
20e00 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
20e10 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e  tered as the non
20e20 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20  -default..  */. 
20e30 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
20e40 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
20e50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e60 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
20e70 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
20e80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20e90 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
20ea0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
20eb0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
20ec0 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b  find(0)==&one );
20ed0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
20ee0 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29  egister(&two, 1)
20ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20f00 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
20f10 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
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 74 77 6f  _vfs_find("__two
20f40 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
20f50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
20f60 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20  s_find(0)==&two 
20f70 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29  );.  if( pMain )
20f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
20f90 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
20fa0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
20fb0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20fc0 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
20fd0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
20fe0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
20ff0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
21000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21010 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21020 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
21030 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  }.  .  /* Unlink
21040 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
21050 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
21060 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
21070 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67  e VFSes.  ** reg
21080 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  istered..  */.  
21090 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
210a0 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
210b0 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  apVfs[0]); i++){
210c0 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
210d0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
210e0 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
210f0 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61  fs[i] ){.      a
21100 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
21110 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
21120 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
21130 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
21140 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21150 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
21160 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
21170 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21180 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
21190 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
211a0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
211b0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
211c0 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74  ;.  .  /* Regist
211d0 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
211e0 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28  as non-default (
211f0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66  will be made def
21200 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a  ault, since.  **
21210 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e   it'll be the on
21220 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65  ly one in existe
21230 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  nce)..  */.  sql
21240 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21250 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61  r(pMain, 0);.  a
21260 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21270 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
21280 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d  n );.  .  /* Un-
21290 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  register the mai
212a0 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72  n VFS again to r
212b0 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20  estore an empty 
212c0 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  VFS list */.  sq
212d0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
212e0 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61  ster(pMain);.  a
212f0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
21300 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
21310 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c  ..  /* Relink al
21320 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65 72  l VFSes in rever
21330 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20  se order. */  . 
21340 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70   for(i=sizeof(ap
21350 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
21360 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  s[0])-1; i>=0; i
21370 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56  --){.    if( apV
21380 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  fs[i] ){.      s
21390 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
213a0 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29  ter(apVfs[i], 1)
213b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
213c0 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
213d0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
213e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
213f0 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
21400 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
21410 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
21420 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
21430 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d  register out sam
21440 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20  ple VFSes. */.  
21450 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21460 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
21470 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21480 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20  gister(&two);.. 
21490 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e   /* Unregisterin
214a0 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73 20  g a VFS that is 
214b0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
214c0 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72 6d  gistered is harm
214d0 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  less */.  sqlite
214e0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
214f0 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
21500 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21510 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74  (&two);.  assert
21520 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21530 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29  nd("__one")==0 )
21540 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21550 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21560 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  two")==0 );..  /
21570 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c  * We should be l
21580 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  eft with the ori
21590 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46  ginal default VF
215a0 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20  S back as the.  
215b0 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20  ** original */. 
215c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
215d0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
215e0 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ain );..  return
215f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21600 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
21610 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a  initfail_test.**
21620 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
21630 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f  mand attempts to
21640 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66   vfs_find and vf
21650 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s_register when 
21660 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  the.** sqlite3_i
21670 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65  nitialize() inte
21680 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67  rface is failing
21690 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f  .  All calls sho
216a0 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61  uld fail..*/.sta
216b0 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74  tic int vfs_init
216c0 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  fail_test(.  Cli
216d0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
216e0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
216f0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
21700 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
21710 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21720 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21730 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21740 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21750 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21760 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21780 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21790 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
217a0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
217b0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
217c0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
217d0 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e  fs one;.  one.zN
217e0 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a  ame = "__one";..
217f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
21800 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
21810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21820 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21830 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
21840 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
21850 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
21860 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
21870 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21880 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
21890 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
218a0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
218b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
218c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
218d0 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65  /*.** Saved VFSe
218e0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  s.*/.static sqli
218f0 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
21900 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  0];.static int n
21910 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Vfs = 0;../*.** 
21920 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
21930 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
21940 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c  ** Unregister al
21950 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  l VFSes..*/.stat
21960 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67  ic int vfs_unreg
21970 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
21980 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21990 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
219a0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
219b0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
219c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
219d0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
219e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
219f0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21a00 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21a10 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21a20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21a30 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21a40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21a50 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21a60 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21a70 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
21a80 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
21a90 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b  Size(apVfs); i++
21aa0 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
21ab0 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21ac0 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
21ad0 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65  pVfs[i]==0 ) bre
21ae0 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ak;.    sqlite3_
21af0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
21b00 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pVfs[i]);.  }.  
21b10 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75  nVfs = i;.  retu
21b20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
21b30 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
21b40 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _reregister_all.
21b50 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c  **.** Restore al
21b60 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65 72  l VFSes that wer
21b70 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20  e removed using 
21b80 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21b90 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ll.*/.static int
21ba0 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
21bb0 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
21bc0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21bd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21be0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21bf0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21c00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21c10 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21c20 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21c30 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21c40 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21c50 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21c60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21c70 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21c80 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21c90 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21ca0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21cb0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
21cc0 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b  0; i<nVfs; i++){
21cd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
21ce0 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  _register(apVfs[
21cf0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
21d00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
21d10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
21d20 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
21d30 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
21d40 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
21d50 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
21d60 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
21d70 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
21d80 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
21d90 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
21da0 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
21db0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
21dc0 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
21dd0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
21de0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
21df0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
21e00 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
21e10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21e20 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
21e30 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
21e40 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
21e50 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21e60 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21e80 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
21e90 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21ea0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
21eb0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
21ec0 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30  {.  int iArg = 0
21ed0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
21ee0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
21ef0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21f00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21f10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
21f20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
21f30 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
21f40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
21f50 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
21f60 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
21f70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21f80 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
21f90 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
21fa0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
21fb0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
21fc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21fd0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
21fe0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
21ff0 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b  b, 0, 0, &iArg);
22000 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
22010 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
22020 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22030 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22040 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22  , "notadatabase"
22050 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  , SQLITE_FCNTL_L
22060 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29  OCKSTATE, &iArg)
22070 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22080 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
22090 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
220a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
220b0 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72  "main", -1, &iAr
220c0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
220d0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
220e0 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  D );.  rc = sqli
220f0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22100 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c  (db, "temp", -1,
22110 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
22120 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
22130 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51  TFOUND || rc==SQ
22140 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
22150 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22160 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
22170 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
22180 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20  _lasterrno_test 
22190 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
221a0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
221b0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
221c0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
221d0 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
221e0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
221f0 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
22200 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72  E_LAST_ERRNO ver
22210 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
22220 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
22230 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20  sterrno_test(.  
22240 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22250 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
22260 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
22270 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
22280 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
22290 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
222a0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
222b0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
222c0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
222d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
222e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
222f0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22300 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
22310 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
22320 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
22330 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
22340 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
22350 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
22360 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
22370 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22380 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22390 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
223a0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
223b0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
223c0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
223d0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
223e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
223f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22400 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
22410 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
22420 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
22430 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
22440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22450 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
22460 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22470 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c  , NULL, SQLITE_L
22480 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67  AST_ERRNO, &iArg
22490 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
224a0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
224b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
224c0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
224d0 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
224e0 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69  _ERROR; .  }.  i
224f0 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20  f( iArg!=0 ) {. 
22500 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22510 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65  ult(interp, "Une
22520 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f  xpected non-zero
22530 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20   errno: ",.     
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
22560 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f  mObj(Tcl_NewIntO
22570 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20  bj(iArg), 0), " 
22580 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
22590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
225a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
225b0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
225c0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
225d0 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
225e0 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
225f0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
22600 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
22610 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
22620 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
22630 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
22640 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
22650 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
22660 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
22670 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
22680 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
22690 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
226a0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
226b0 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
226c0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
226d0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
226e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
226f0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22700 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22710 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22720 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22730 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22740 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22750 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22760 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22770 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22780 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22790 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
227a0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
227b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
227c0 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227e0 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69   /* New chunk si
227f0 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
22800 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22810 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
22820 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
22830 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
22840 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22860 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
22870 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
228a0 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
228b0 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
228c0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
228d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
228e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
228f0 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
22900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22910 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22920 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22930 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22940 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22950 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
22960 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
22970 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
22980 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
22990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
229a0 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
229b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
229c0 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
229d0 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
229e0 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
229f0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22a00 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
22a10 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
22a20 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  ZE, (void *)&nSi
22a30 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
22a40 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
22a50 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
22a60 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
22a70 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22a80 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
22a90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22aa0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22ab0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22ac0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
22ad0 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20  izehint_test DB 
22ae0 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a  DBNAME SIZE.**.*
22af0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
22b00 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
22b10 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22b20 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77   interface .** w
22b30 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ith SQLITE_FCNTL
22b40 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74  _SIZE_HINT.*/.st
22b50 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
22b60 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
22b70 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22b80 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22b90 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22ba0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22bb0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22bc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22bd0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22be0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22bf0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22c00 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22c10 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22c20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22c30 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22c40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22c50 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22c60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22c70 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
22c80 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
22c90 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
22ca0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
22cd0 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
22ce0 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
22cf0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
22d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
22d10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
22d20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d40 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
22d50 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
22d60 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
22d70 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
22d80 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
22d90 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
22da0 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
22db0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22dc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22dd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22de0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22df0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22e00 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
22e10 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
22e20 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
22e30 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
22e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e50 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
22e60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22e70 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
22e80 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
22e90 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
22ea0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22eb0 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
22ec0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
22ed0 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
22ee0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
22ef0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
22f00 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
22f10 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
22f20 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22f30 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
22f40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22f50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22f60 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22f70 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
22f80 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
22f90 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
22fa0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22fb0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22fc0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
22fd0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22fe0 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22ff0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
23000 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
23010 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
23020 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23030 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
23040 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23050 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
23060 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  y_test(.  Client
23070 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23080 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23090 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
230a0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
230b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
230c0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
230d0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
230e0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
230f0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23100 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23110 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23120 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23130 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23140 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23150 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23160 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
23170 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
23180 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
23190 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
231a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
231b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
231e0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
231f0 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57 44 22  ], 0), " DB PWD"
23200 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23220 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23230 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
23240 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23250 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65  ), &db) ){.   re
23260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23270 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69    }.  .#if !defi
23280 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
23290 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29  E_LOCKING_STYLE)
232a0 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f  .#  if defined(_
232b0 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64  _APPLE__).#    d
232c0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
232d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
232e0 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  E 1.#  else.#   
232f0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
23300 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23310 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  YLE 0.#  endif.#
23320 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
23330 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23340 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
23350 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a  (__APPLE__).  {.
23360 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50 61      char *testPa
23370 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  th;.    int rc;.
23380 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20      int nPwd;.  
23390 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
233a0 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  wd;.    char pro
233b0 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
233c0 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c   .    zPwd = Tcl
233d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
233e0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64  j(objv[2], &nPwd
233f0 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f  );.    if( sizeo
23400 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77  f(proxyPath)<nPw
23410 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63  d+20 ){.      Tc
23420 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23430 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20  nterp, "PWD too 
23440 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  big", (void*)0);
23450 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23460 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
23470 20 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79     sprintf(proxy
23480 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70  Path, "%s/test.p
23490 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20  roxy", zPwd);.  
234a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
234b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
234c0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54  NULL, SQLITE_SET
234d0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
234e0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
234f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23500 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
23510 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
23520 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
23530 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23540 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23550 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23560 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23570 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  LL, SQLITE_GET_L
23580 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74  OCKPROXYFILE, &t
23590 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66  estPath);.    if
235a0 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50  ( strncmp(proxyP
235b0 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29  ath,testPath,11)
235c0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
235d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
235e0 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66  p, "Lock proxy f
235f0 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63  ile did not matc
23600 68 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20  h the ".        
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73         "previous
23630 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75  ly assigned valu
23640 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
23650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23660 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23670 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
23680 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23690 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
236a0 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
236b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
236c0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
236d0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
236e0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
236f0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23700 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
23710 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
23720 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
23730 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23740 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
23750 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
23770 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
23780 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
23790 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
237a0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
237b0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
237c0 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
237d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
237e0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
237f0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23800 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23810 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
23820 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
23830 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
23840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23850 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
23860 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
23870 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23880 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23890 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
238a0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
238b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
238c0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
238d0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
238e0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
238f0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23900 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23920 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23930 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23940 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23950 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23960 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23970 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23980 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
23990 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
239a0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
239b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
239c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
239d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
239e0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
239f0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23a00 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
23a10 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
23a20 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
23a30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23a40 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23a50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23a60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23a70 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
23a80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23a90 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
23aa0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
23ab0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
23ac0 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
23ad0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
23ae0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23af0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23b00 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
23b10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23b30 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23b40 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
23b50 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
23b60 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
23b70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23b80 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
23b90 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
23ba0 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
23bb0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23bc0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
23bd0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23be0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
23bf0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23c00 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
23c10 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c  al DB PERSIST-FL
23c20 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
23c30 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23c40 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23c50 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23c60 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
23c70 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
23c80 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a  ST_WAL opcode..*
23c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23ca0 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
23cb0 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44  t_wal(.  ClientD
23cc0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
23cd0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
23ce0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
23cf0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
23d00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23d10 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
23d20 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
23d30 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23d40 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23d50 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23d60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23d70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
23d80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23d90 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
23da0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
23db0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23dc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
23dd0 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72  bPersist;.  char
23de0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
23df0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
23e00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
23e10 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
23e20 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
23e30 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
23e40 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23e50 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
23e60 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a  " DB FLAG", 0);.
23e70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23e80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23e90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23ea0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23eb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23ec0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
23ed0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23ee0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
23ef0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
23f00 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73  bjv[2], &bPersis
23f10 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
23f20 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
23f30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23f40 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
23f50 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
23f60 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62  T_WAL, (void*)&b
23f70 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69  Persist);.  sqli
23f80 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
23f90 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
23fa0 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74  d", rc, bPersist
23fb0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
23fc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
23fd0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
23fe0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
23ff0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
24000 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
24010 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
24020 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a  te DB PSOW-FLAG.
24030 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
24040 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
24050 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24060 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
24070 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
24080 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
24090 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f  E_OVERWRITE opco
240a0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
240b0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
240c0 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
240d0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
240e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
240f0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24100 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24110 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24120 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24130 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24140 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24150 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24160 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24170 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24180 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24190 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
241a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
241b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
241c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
241d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
241e0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a  nt rc;.  int b;.
241f0 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a    char z[100];..
24200 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
24210 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
24230 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
24240 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
24250 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
24260 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
24270 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22  , 0), " DB FLAG"
24280 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24290 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
242a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
242b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
242c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
242d0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
242e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
242f0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
24300 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
24310 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
24320 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
24330 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24340 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24350 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45  l(db,NULL,SQLITE
24360 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
24370 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64  _OVERWRITE,(void
24380 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)&b);.  sqlite3
24390 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
243a0 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c  (z), z, "%d %d",
243b0 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41   rc, b);.  Tcl_A
243c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
243d0 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
243e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
243f0 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
24400 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24410 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42  ntrol_vfsname DB
24420 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
24430 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
24440 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
24450 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73  e stack of VFSes
24460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24470 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
24480 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
24490 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
244a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
244b0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
244c0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
244d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
244e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
244f0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24500 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24510 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24520 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24530 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24540 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24550 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24560 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24570 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24580 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24590 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
245a0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
245b0 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20   char *zVfsName 
245c0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
245d0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
245e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
245f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24600 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
24610 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
24620 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
24630 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24640 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24650 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
24660 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24670 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24680 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24690 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
246a0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
246b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
246c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
246d0 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
246e0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
246f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24700 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
24710 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24720 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
24730 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f  CNTL_VFSNAME,(vo
24740 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  id*)&zVfsName);.
24750 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24760 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e  lt(interp, zVfsN
24770 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
24780 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24790 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  VfsName);.  retu
247a0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
247b0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
247c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
247d0 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55  pfilename DB ?AU
247e0 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  XDB?.**.** Retur
247f0 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
24800 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
24810 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  ilename.*/.stati
24820 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
24830 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28  ol_tempfilename(
24840 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24850 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24860 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
24870 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24880 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24890 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
248a0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
248b0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
248c0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
248d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
248f0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24900 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24910 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24920 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24930 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24940 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
24950 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
24960 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72  = "main";.  char
24970 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20   *zTName = 0;.. 
24980 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
24990 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
249a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
249b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
249c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
249d0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
249e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
249f0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24a00 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30  " DB ?AUXDB?", 0
24a10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24a20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24a30 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24a40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24a50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24a60 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
24a70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24a80 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
24a90 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  ){.    zDbName =
24aa0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24ab0 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73  bjv[2]);.  }.  s
24ac0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24ad0 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c  rol(db, zDbName,
24ae0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
24af0 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69  MPFILENAME, (voi
24b00 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54  d*)&zTName);.  T
24b10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24b20 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20  interp, zTName, 
24b30 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c  (char*)0);.  sql
24b40 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65  ite3_free(zTName
24b50 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24b60 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
24b70 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
24b80 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a  3_vfs_list.**.**
24b90 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20     Return a tcl 
24ba0 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
24bb0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
24bc0 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27   registered vfs'
24bd0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24be0 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69   vfs_list(.  Cli
24bf0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24c00 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24c10 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24c20 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24c30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24c40 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24c50 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24c60 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24c70 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24c80 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24c90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24ca0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24cb0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24cc0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
24cd0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
24ce0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
24cf0 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f  fs *pVfs;.  Tcl_
24d00 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
24d10 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20  NewObj();.  if( 
24d20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
24d30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
24d40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
24d50 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
24d60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24d70 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74    for(pVfs=sqlit
24d80 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20  e3_vfs_find(0); 
24d90 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d  pVfs; pVfs=pVfs-
24da0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c  >pNext){.    Tcl
24db0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
24dc0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
24dd0 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
24de0 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  gObj(pVfs->zName
24df0 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63  , -1));.  }.  Tc
24e00 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24e10 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
24e20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
24e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
24e40 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  :   sqlite3_limi
24e50 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a  t DB ID VALUE.**
24e60 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
24e70 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
24e80 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65  lite3_limit inte
24e90 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
24ea0 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
24eb0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
24ec0 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
24ed0 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20  nt test_limit(. 
24ee0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
24ef0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
24f00 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
24f10 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
24f20 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24f30 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24f40 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24f50 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
24f60 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
24f70 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
24f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24f90 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24fa0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24fb0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24fc0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
24fd0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
24fe0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
24ff0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
25000 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
25010 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
25020 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64   int id;.  } aId
25030 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
25040 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
25050 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
25060 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
25070 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
25080 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
25090 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
250a0 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  NGTH",          
250b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
250c0 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
250d0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
250e0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22  TE_LIMIT_COLUMN"
250f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
25100 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
25110 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
25120 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25130 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
25140 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
25150 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
25160 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
25170 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25180 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
25190 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c  SELECT",     SQL
251a0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
251b0 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d  ND_SELECT      }
251c0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
251d0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20  LIMIT_VDBE_OP", 
251e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
251f0 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
25210 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25220 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
25230 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  G",        SQLIT
25240 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
25250 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a  _ARG         },.
25260 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25270 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20  MIT_ATTACHED",  
25280 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
25290 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
252a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
252b0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
252c0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
252d0 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f  LENGTH", SQLITE_
252e0 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
252f0 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20  RN_LENGTH  },.  
25300 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25310 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
25320 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  R",     SQLITE_L
25330 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
25340 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20  MBER      },.   
25350 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25360 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c  _TRIGGER_DEPTH",
25370 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
25380 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
25390 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  H        },.    
253a0 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72  .    /* Out of r
253b0 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20  ange test cases 
253c0 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  */.    { "SQLITE
253d0 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22  _LIMIT_TOOSMALL"
253e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
25410 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25420 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20  LIMIT_TOOBIG",  
25430 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25440 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
25450 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20 7d 2c  _DEPTH+1      },
25460 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69  .  };.  int i, i
25470 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  d;.  int val;.  
25480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
25490 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
254a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
254b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
254c0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
254d0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
254e0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
254f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
25500 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20  0], 0), " DB ID 
25510 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
25520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25530 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
25540 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25550 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25560 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
25570 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25580 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65  ;.  zId = Tcl_Ge
25590 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
255a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
255b0 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
255c0 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  f(aId[0]); i++){
255d0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
255e0 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d  zId, aId[i].zNam
255f0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
25600 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20  d = aId[i].id;. 
25610 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25620 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
25630 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
25640 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20  f(aId[0]) ){.   
25650 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25660 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
25670 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22  wn limit type: "
25680 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29  , zId, (char*)0)
25690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
256a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
256b0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
256c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
256d0 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
256e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
256f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69   rc = sqlite3_li
25700 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29  mit(db, id, val)
25710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
25720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
25730 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
25740 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25750 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
25760 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f  cmd:  save_prng_
25770 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65  state.**.** Save
25780 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
25790 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  e pseudo-random 
257a0 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
257b0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65  ..** At the same
257c0 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68   time, verify th
257d0 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  at sqlite3_test_
257e0 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76  control works ev
257f0 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65  en when.** calle
25800 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  d with an out-of
25810 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a  -range opcode..*
25820 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
25830 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
25840 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25850 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25860 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25870 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25880 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25890 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
258a0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
258b0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
258c0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
258d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
258e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
258f0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25900 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25910 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25920 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25930 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
25940 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
25950 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20  control(9999);. 
25960 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
25970 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
25980 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31  _test_control(-1
25990 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
259a0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
259b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
259c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
259d0 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72  G_SAVE);.  retur
259e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
259f0 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f  * tclcmd:  resto
25a00 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f  re_prng_state.*/
25a10 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74  .static int rest
25a20 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ore_prng_state(.
25a30 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25a40 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25a50 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25a60 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25a70 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25a80 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25a90 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25aa0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25ab0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25ac0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25ae0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25af0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25b00 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25b10 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25b20 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25b30 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
25b40 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
25b50 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a  _PRNG_RESTORE);.
25b60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25b70 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25b80 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
25b90 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
25ba0 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
25bb0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25bc0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25bd0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25be0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25bf0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25c00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25c10 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25c20 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25c30 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25c40 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25c60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25c70 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25c80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25c90 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25ca0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
25cb0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
25cc0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
25cd0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b  TRL_PRNG_RESET);
25ce0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25cf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
25d00 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79  d:  database_may
25d10 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  _be_corrupt.**.*
25d20 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
25d30 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
25d40 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e  ight be corrupt.
25d50 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
25d60 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c  , set the normal
25d70 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65  .** state of ope
25d80 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
25d90 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6d  c int database_m
25da0 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a 20  ay_be_corrupt(. 
25db0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25dc0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25dd0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25de0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25df0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25e00 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25e10 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25e20 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25e30 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25e40 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25e60 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25e70 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25e80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25e90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25ea0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
25eb0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25ec0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
25ed0 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 30  NEVER_CORRUPT, 0
25ee0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25ef0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
25f00 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e 65  md:  database_ne
25f10 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  ver_corrupt.**.*
25f20 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
25f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
25f40 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 66  re always well-f
25f50 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e 61  ormed.  This ena
25f60 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65 72  bles extra asser
25f70 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
25f80 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e 64  s that test cond
25f90 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
25fa0 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72 20  always true for 
25fb0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
25fc0 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bases..*/.static
25fd0 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e 65   int database_ne
25fe0 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20 43  ver_corrupt(.  C
25ff0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26000 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26010 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26020 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26030 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26040 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26050 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26060 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26070 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26080 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26090 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
260a0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
260b0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
260c0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
260d0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
260e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
260f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
26100 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
26110 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29 3b  VER_CORRUPT, 1);
26120 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
26140 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73  d:  pcache_stats
26150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
26160 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
26170 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26180 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26190 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
261a0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
261b0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
261c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
261d0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
261e0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
261f0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26200 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26220 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26230 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26240 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26250 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26260 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
26270 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d  t nMin;.  int nM
26280 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65  ax;.  int nCurre
26290 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63  nt;.  int nRecyc
262a0 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a  lable;.  Tcl_Obj
262b0 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74   *pRet;..  sqlit
262c0 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e  e3PcacheStats(&n
262d0 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20  Current, &nMax, 
262e0 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61  &nMin, &nRecycla
262f0 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20  ble);..  pRet = 
26300 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
26310 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
26320 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26330 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
26340 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74  ringObj("current
26350 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26360 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26370 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26380 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
26390 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63  nCurrent));.  Tc
263a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
263b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
263c0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
263d0 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29  ngObj("max", -1)
263e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
263f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
26400 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
26410 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29  NewIntObj(nMax))
26420 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
26430 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26440 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26450 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e  ewStringObj("min
26460 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26470 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26480 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26490 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
264a0 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMin));.  Tcl_Li
264b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
264c0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
264d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
264e0 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20  j("recyclable", 
264f0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
26500 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26510 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
26520 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65  cl_NewIntObj(nRe
26530 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54  cyclable));..  T
26540 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
26550 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
26560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26570 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
26580 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
26590 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
265a0 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  id test_unlock_n
265b0 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a  otify_cb(void **
265c0 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  aArg, int nArg){
265d0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
265e0 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20  (ii=0; ii<nArg; 
265f0 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45  ii++){.    Tcl_E
26600 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72  valEx((Tcl_Inter
26610 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75  p *)aArg[ii], "u
26620 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d  nlock_notify", -
26630 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
26640 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
26650 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26660 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
26670 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   */../*.** tclcm
26680 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  d:  sqlite3_unlo
26690 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a  ck_notify db.*/.
266a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
266b0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
266c0 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  FY.static int te
266d0 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
266e0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
266f0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
26700 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
26710 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26720 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26730 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26740 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26750 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26770 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26780 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26790 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
267a0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
267b0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
267c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
267d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
267e0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
267f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
26800 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
26810 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
26820 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
26830 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26840 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26850 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26860 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
26870 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26880 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
26890 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
268a0 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  (db, test_unlock
268b0 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69  _notify_cb, (voi
268c0 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54  d *)interp);.  T
268d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
268e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
268f0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26900 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26910 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
26920 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ndif../*.** tclc
26930 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
26940 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f  _checkpoint db ?
26950 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME?.*/.static 
26960 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
26970 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
26980 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26990 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
269a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
269b0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
269c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
269d0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
269e0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
269f0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26a00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26a10 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26a20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26a30 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26a40 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26a50 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
26a60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
26a70 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
26a80 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
26a90 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
26aa0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
26ab0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
26ac0 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  "DB ?NAME?");.  
26ad0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26ae0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
26af0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26b00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26b10 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26b30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26b40 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
26b50 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
26b60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
26b70 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
26b80 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
26b90 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54  nt(db, zDb);.  T
26ba0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26bb0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
26bc0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26bd0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26be0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
26bf0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
26c00 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
26c10 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20  oint_v2 db MODE 
26c20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  ?NAME?.**.** Thi
26c30 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20  s command calls 
26c40 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
26c50 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  nt_v2() function
26c60 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
26c70 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75  ied.** mode argu
26c80 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66  ment (passive, f
26c90 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e  ull or restart).
26ca0 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65   If present, the
26cb0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
26cc0 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64  * NAME is passed
26cd0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
26ce0 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63  rgument to wal_c
26cf0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20  heckpoint_v2(). 
26d00 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d  If it the.** NAM
26d10 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  E argument is no
26d20 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c  t present, a NUL
26d30 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73  L pointer is pas
26d40 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
26d50 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70  ** If wal_checkp
26d60 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e  oint_v2() return
26d70 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
26d80 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
26d90 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  SY or.** SQLITE_
26da0 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  OK, then this co
26db0 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43  mmand returns TC
26dc0 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c  L_ERROR. The Tcl
26dd0 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a   result is set.*
26de0 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  * to the error m
26df0 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20  essage obtained 
26e00 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
26e10 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  msg()..**.** Oth
26e20 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d  erwise, this com
26e30 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c  mand returns a l
26e40 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74  ist of three int
26e50 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
26e60 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31   integer.** is 1
26e70 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
26e80 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72  was returned, or
26e90 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68   0 otherwise. Th
26ea0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
26eb0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
26ec0 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
26ed0 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70  ned via the outp
26ee0 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62 79  ut parameters by
26ef0 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
26f00 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75  v2() -.** the nu
26f10 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
26f20 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68  n the log and th
26f30 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
26f40 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a  es in the log.**
26f50 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
26f60 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
26f70 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
26f80 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
26f90 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
26fa0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26fb0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
26fc0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26fd0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26fe0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26ff0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27000 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27010 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27020 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27030 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27040 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27050 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27060 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27070 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
27080 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
27090 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65  int rc;..  int e
270a0 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67  Mode;.  int nLog
270b0 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e   = -555;.  int n
270c0 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54  Ckpt = -555;.  T
270d0 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
270e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d   const char * aM
270f0 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69  ode[] = { "passi
27100 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65  ve", "full", "re
27110 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20 20 61  start", 0 };.  a
27120 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
27130 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
27140 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27150 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
27160 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
27170 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
27180 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
27190 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 6f  T==2 );..  if( o
271a0 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
271b0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
271c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
271d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d  , 1, objv, "DB M
271e0 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  ODE ?NAME?");.  
271f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27200 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
27210 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44  bjc==4 ){.    zD
27220 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
27230 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a  g(objv[3]);.  }.
27240 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
27250 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
27260 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
27270 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20 54 63  ), &db).   || Tc
27280 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
27290 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
272a0 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22  ], aMode, "mode"
272b0 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20  , 0, &eMode) .  
272c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
272d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
272e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
272f0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
27300 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20 26  b, zDb, eMode, &
27310 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a 20  nLog, &nCkpt);. 
27320 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27330 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
27340 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54 63 6c  _BUSY ){.    Tcl
27350 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
27360 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
27370 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54  e3_errmsg(db), T
27380 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
27390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
273a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
273b0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
273c0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
273d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
273e0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
273f0 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54  IntObj(rc==SQLIT
27400 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20  E_BUSY?1:0));.  
27410 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27420 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27430 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
27440 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54  tObj(nLog));.  T
27450 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27460 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27470 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
27480 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54  Obj(nCkpt));.  T
27490 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
274a0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
274b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
274c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
274d0 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  :  test_sqlite3_
274e0 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  log ?SCRIPT?.*/.
274f0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f  static struct Lo
27500 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63  gCallback {.  Tc
27510 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72  l_Interp *pInter
27520 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
27530 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63  bj;.} logcallbac
27540 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74  k = {0, 0};.stat
27550 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c  ic void xLogcall
27560 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65  back(void *unuse
27570 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72  d, int err, char
27580 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f   *zMsg){.  Tcl_O
27590 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44  bj *pNew = Tcl_D
275a0 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63  uplicateObj(logc
275b0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
275c0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
275d0 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c  t(pNew);.  Tcl_L
275e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
275f0 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e  ent(.      0, pN
27600 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
27610 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
27620 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
27630 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27640 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
27650 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
27660 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
27670 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
27680 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
27690 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
276a0 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
276b0 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
276c0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
276d0 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
276e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
276f0 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
27700 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27710 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
27720 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27730 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27740 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27750 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27760 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27770 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27780 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27790 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
277a0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
277b0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
277c0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
277d0 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
277e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
277f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
27800 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
27810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27820 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
27830 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
27840 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
27850 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27860 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27870 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
27880 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
27890 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
278a0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
278b0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
278c0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
278d0 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
278e0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
278f0 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20   = objv[1];.    
27900 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
27910 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27920 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27930 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e  ack.pInterp = in
27940 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  terp;.    sqlite
27950 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
27960 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67  CONFIG_LOG, xLog
27970 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20  callback, 0);.  
27980 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
27990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
279a0 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d  tcl_objproc COMM
279b0 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a  ANDNAME ARGS....
279c0 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20  **.** Run a TCL 
279d0 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74  command using it
279e0 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  s objProc interf
279f0 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65  ace.  Throw an e
27a00 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  rror if.** the c
27a10 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
27a20 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
27a30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
27a40 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76  unAsObjProc(.  v
27a50 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
27a60 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
27a70 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
27a80 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
27a90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
27aa0 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
27ab0 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Info;.  if( objc
27ac0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
27ad0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27ae0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d  p, 1, objv, "COM
27af0 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
27b00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27b10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c  ;.  }.  if( !Tcl
27b20 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
27b30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27b40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27b50 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
27b60 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27b70 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
27b80 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
27b90 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
27ba0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27bb0 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
27bc0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27bd0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ROR;.  }.  if( c
27be0 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d  mdInfo.objProc==
27bf0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
27c00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27c10 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  , "command has n
27c20 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20  o objProc: ",.  
27c30 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
27c40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27c50 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
27c60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27c70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
27c80 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63  mdInfo.objProc(c
27c90 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
27ca0 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
27cb0 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d  jc-1, objv+1);.}
27cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27cd0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
27ce0 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65  .** WARNING: The
27cf0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
27d00 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69  ion, printExplai
27d10 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20  nQueryPlan() is 
27d20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79  an exact.** copy
27d30 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65   of example code
27d40 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71   from eqp.in (eq
27d50 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73  p.html). If this
27d60 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65   code is modifie
27d70 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64  d,.** then the d
27d80 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70  ocumentation cop
27d90 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  y needs to be mo
27da0 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a  dified as well..
27db0 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  */./*.** Argumen
27dc0 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65  t pStmt is a pre
27dd0 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
27de0 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
27df0 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61  on compiles.** a
27e00 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
27e10 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  PLAN command to 
27e20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72  report on the pr
27e30 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
27e40 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20  ,.** and prints 
27e50 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74  the report to st
27e60 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74  dout using print
27e70 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e  f()..*/.int prin
27e80 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
27e90 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  n(sqlite3_stmt *
27ea0 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  pStmt){.  const 
27eb0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
27ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
27ed0 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72  ut SQL */.  char
27ee0 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *zExplain;     
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27f00 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20  QL with EXPLAIN 
27f10 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65  QUERY PLAN prepe
27f20 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nded */.  sqlite
27f30 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
27f40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
27f50 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55  piled EXPLAIN QU
27f60 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
27f70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27fa0 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
27fb0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a  3_prepare_v2() *
27fc0 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  /..  zSql = sqli
27fd0 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  te3_sql(pStmt);.
27fe0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
27ff0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28000 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e  ROR;..  zExplain
28010 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
28020 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
28030 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c  Y PLAN %s", zSql
28040 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69  );.  if( zExplai
28050 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
28060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
28070 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
28080 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64  are_v2(sqlite3_d
28090 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c  b_handle(pStmt),
280a0 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26   zExplain, -1, &
280b0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
280c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
280d0 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63  plain);.  if( rc
280e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
280f0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
28100 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
28110 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
28120 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74  lain) ){.    int
28130 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c   iSelectid = sql
28140 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
28150 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
28160 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73    int iOrder = s
28170 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
28180 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
28190 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20      int iFrom = 
281a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
281b0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b  nt(pExplain, 2);
281c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
281d0 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73  *zDetail = (cons
281e0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
281f0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
28200 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20  plain, 3);..    
28210 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64  printf("%d %d %d
28220 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69   %s\n", iSelecti
28230 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d  d, iOrder, iFrom
28240 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a  , zDetail);.  }.
28250 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
28260 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
28270 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ain);.}..static 
28280 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  int test_print_e
28290 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  qp(.  void * cli
282a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
282b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
282c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
282d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
282e0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
282f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
28300 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
28310 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
28320 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
28330 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
28340 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
28350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28360 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
28370 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
28380 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
28390 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
283a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
283b0 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45  R;.  rc = printE
283c0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
283d0 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69  pStmt);.  /* Thi
283e0 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57  s is needed on W
283f0 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61  indows so that a
28400 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67   test case using
28410 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
28420 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20  tion can open a 
28430 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65  read pipe and ge
28440 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a  t the output of.
28450 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69    ** printExplai
28460 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d  nQueryPlan() imm
28470 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
28480 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
28490 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
284a0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
284b0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
284c0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
284d0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
284e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
284f0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
28500 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
28510 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e  ntrol VERB ARGS.
28520 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
28530 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
28540 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
28550 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28560 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28570 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28580 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28590 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56  [].){.  struct V
285a0 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  erb {.    const 
285b0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
285c0 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72   int i;.  } aVer
285d0 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  b[] = {.    { "S
285e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
285f0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c  OCALTIME_FAULT",
28600 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
28610 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
28620 20 7d 2c 20 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   }, .  };.  int 
28630 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c  iVerb;.  int iFl
28640 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ag;.  int rc;.. 
28650 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
28660 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28670 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28680 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e  bjv, "VERB ARGS.
28690 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
286a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
286b0 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49  .  rc = Tcl_GetI
286c0 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63  ndexFromObjStruc
286d0 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c  t(.      interp,
286e0 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c   objv[1], aVerb,
286f0 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d   sizeof(aVerb[0]
28700 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69  ), "VERB", 0, &i
28710 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20  Verb.  );.  if( 
28720 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
28730 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67  urn rc;..  iFlag
28740 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e   = aVerb[iVerb].
28750 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c  i;.  switch( iFl
28760 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ag ){.    case S
28770 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
28780 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20  OCALTIME_FAULT: 
28790 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b  {.      int val;
287a0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
287b0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
287c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
287d0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
287e0 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20  "ONOFF");.      
287f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28800 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
28810 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
28820 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
28830 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
28840 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
28850 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
28860 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
28870 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
28880 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
28890 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62  T, val);.      b
288a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
288b0 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
288c0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
288d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
288e0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
288f0 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  IX.#include <sys
28900 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
28910 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
28920 68 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  h>..static int t
28930 65 73 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20  est_getrusage(. 
28940 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
28950 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
28960 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
28970 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
28980 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
28990 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 32 34  .  char buf[1024
289a0 5d 3b 0a 20 20 73 74 72 75 63 74 20 72 75 73 61  ];.  struct rusa
289b0 67 65 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ge r;.  memset(&
289c0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29  r, 0, sizeof(r))
289d0 3b 0a 20 20 67 65 74 72 75 73 61 67 65 28 52 55  ;.  getrusage(RU
289e0 53 41 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a  SAGE_SELF, &r);.
289f0 0a 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 20  .  sprintf(buf, 
28a00 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36  "ru_utime=%d.%06
28a10 64 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30  d ru_stime=%d.%0
28a20 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20  6d ru_minflt=%d 
28a30 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a  ru_majflt=%d", .
28a40 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74      (int)r.ru_ut
28a50 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74  ime.tv_sec, (int
28a60 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75  )r.ru_utime.tv_u
28a70 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72  sec, .    (int)r
28a80 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63  .ru_stime.tv_sec
28a90 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d  , (int)r.ru_stim
28aa0 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20  e.tv_usec, .    
28ab0 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74  (int)r.ru_minflt
28ac0 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66  , (int)r.ru_majf
28ad0 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65  lt.  );.  Tcl_Se
28ae0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
28af0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
28b00 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20  Obj(buf, -1));. 
28b10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
28b20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
28b30 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
28b40 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  * Information pa
28b50 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ssed from the ma
28b60 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74  in thread into t
28b70 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20  he windows file 
28b80 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72  locker.** backgr
28b90 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a  ound thread..*/.
28ba0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
28bb0 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20  Locker {.  char 
28bc0 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f  *evName;       /
28bd0 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20  * Name of event 
28be0 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64  to signal thread
28bf0 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41   startup */.  HA
28c00 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
28c10 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74    /* Handle of t
28c20 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
28c30 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  cked */.  int de
28c40 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  lay1;         /*
28c50 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f   Delay before lo
28c60 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64  cking */.  int d
28c70 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f  elay2;         /
28c80 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75  * Delay before u
28c90 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e  nlocking */.  in
28ca0 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20  t ok;           
28cb0 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b    /* Finished ok
28cc0 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20   */.  int err;  
28cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28ce0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
28cf0 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69  curs */.};.#endi
28d00 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  f...#if SQLITE_O
28d10 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c  S_WIN.#include <
28d20 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a  process.h>./*.**
28d30 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20   The background 
28d40 74 68 72 65 61 64 20 74 68 61 74 20 64 6f 65 73  thread that does
28d50 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
28d60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
28d70 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28  n32_file_locker(
28d80 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
28d90 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46  .  struct win32F
28da0 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28  ileLocker *p = (
28db0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
28dc0 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61  Locker*)pAppData
28dd0 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d  ;.  if( p->evNam
28de0 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  e ){.    HANDLE 
28df0 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45  ev = OpenEvent(E
28e00 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54  VENT_MODIFY_STAT
28e10 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e  E, FALSE, p->evN
28e20 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65  ame);.    if ( e
28e30 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76  v ){.      SetEv
28e40 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43  ent(ev);.      C
28e50 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
28e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28e70 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65  p->delay1 ) Slee
28e80 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20  p(p->delay1);.  
28e90 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e  if( LockFile(p->
28ea0 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
28eb0 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c  00, 0) ){.    Sl
28ec0 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a  eep(p->delay2);.
28ed0 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
28ee0 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30  ->h, 0, 0, 10000
28ef0 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0000, 0);.    p-
28f00 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  >ok = 1;.  }else
28f10 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31  {.    p->err = 1
28f20 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e  ;.  }.  CloseHan
28f30 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e  dle(p->h);.  p->
28f40 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  h = 0;.  p->dela
28f50 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  y1 = 0;.  p->del
28f60 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ay2 = 0;.}.#endi
28f70 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
28f80 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  _WIN./*.**      
28f90 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20  lock_win32_file 
28fa0 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
28fb0 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74  DELAY2.**.** Get
28fc0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61   an exclusive ma
28fd0 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20  nditory lock on 
28fe0 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20  file for DELAY2 
28ff0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a  milliseconds..**
29000 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c   Wait DELAY1 mil
29010 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
29020 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c   acquiring the l
29030 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
29040 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  nt win32_file_lo
29050 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ck(.  void * cli
29060 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
29070 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
29080 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
29090 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
290a0 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73  [].){.  static s
290b0 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
290c0 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e  ocker x = { "win
290d0 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30  32_file_lock", 0
290e0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
290f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
29100 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  ilename;.  char 
29110 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74  zBuf[200];.  int
29120 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41   retry = 0;.  HA
29130 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44  NDLE ev;.  DWORD
29140 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69   wResult;.  .  i
29150 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62  f( objc!=4 && ob
29160 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
29170 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
29180 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
29190 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
291a0 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65  DELAY2");.    re
291b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
291c0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
291d0 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
291e0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
291f0 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
29200 64 20 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a  d %d %d %d %d",.
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72       x.ok, x.err
29230 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65  , x.delay1, x.de
29240 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20  lay2, x.h);.    
29250 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29260 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28  (interp, zBuf, (
29270 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
29280 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d  turn TCL_OK;.  }
29290 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26  .  while( x.h &&
292a0 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20   retry<30 ){.   
292b0 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c   retry++;.    Sl
292c0 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20  eep(100);.  }.  
292d0 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54  if( x.h ){.    T
292e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
292f0 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20  interp, "busy", 
29300 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29310 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29320 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
29330 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29340 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78  erp, objv[2], &x
29350 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74 75 72  .delay1) ) retur
29360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
29370 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
29380 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
29390 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29  v[3], &x.delay2)
293a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
293b0 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  ROR;.  zFilename
293c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
293d0 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68  (objv[1]);.  x.h
293e0 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46   = CreateFile(zF
293f0 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43  ilename, GENERIC
29400 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52  _READ|GENERIC_WR
29410 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
29420 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45     FILE_SHARE_RE
29430 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52  AD|FILE_SHARE_WR
29440 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57  ITE, 0, OPEN_ALW
29450 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AYS,.           
29460 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
29470 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20  E_NORMAL, 0);.  
29480 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20  if( !x.h ){.    
29490 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
294a0 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
294b0 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a   open file: ", z
294c0 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a  Filename, (char*
294d0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
294e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
294f0 20 65 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e   ev = CreateEven
29500 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41  t(NULL, TRUE, FA
29510 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a  LSE, x.evName);.
29520 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20    if ( !ev ){.  
29530 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
29540 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
29550 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a  ot create event:
29560 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63   ", x.evName, (c
29570 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
29580 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29590 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61   }.  _beginthrea
295a0 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63  d(win32_file_loc
295b0 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26  ker, 0, (void*)&
295c0 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a  x);.  Sleep(0);.
295d0 20 20 69 66 20 28 20 28 77 52 65 73 75 6c 74 20    if ( (wResult 
295e0 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  = WaitForSingleO
295f0 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30 29  bject(ev, 10000)
29600 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  )!=WAIT_OBJECT_0
29610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29620 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
29630 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78  zBuf), zBuf, "0x
29640 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20  %x", wResult);. 
29650 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
29660 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69  ult(interp, "wai
29670 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75  t failed: ", zBu
29680 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
29690 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
296a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
296b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43  L_ERROR;.  }.  C
296c0 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
296d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
296e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65  .}../*.**      e
296f0 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68  xists_win32_path
29700 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75   PATH.**.** Retu
29710 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
29720 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
29730 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65  th exists, whose
29740 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
29750 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63   name.** may exc
29760 65 65 64 20 32 36 30 20 63 68 61 72 61 63 74 65  eed 260 characte
29770 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
29780 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
29790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
297a0 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
297b0 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  h(.  void *clien
297c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
297d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
297e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
297f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
29800 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
29810 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29820 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29830 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48  , 1, objv, "PATH
29840 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
29850 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29860 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
29870 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
29880 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20  BooleanObj(.    
29890 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75    GetFileAttribu
298a0 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69  tesW( Tcl_GetUni
298b0 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d  code(objv[1]))!=
298c0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
298d0 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65  RIBUTES ));.  re
298e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
298f0 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f  /*.**      find_
29900 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45  win32_file PATTE
29910 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  RN.**.** Returns
29920 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69   a list of entri
29930 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72  es in a director
29940 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  y that match the
29950 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74 65   specified patte
29960 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c  rn,.** whose ful
29970 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
29980 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
29990 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
299a0 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
299b0 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f  th.** "\\?\"..*/
299c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
299d0 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76  2_find_file(.  v
299e0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
299f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29a00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
29a10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
29a20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
29a30 48 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65  HANDLE hFindFile
29a40 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
29a50 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32  E_VALUE;.  WIN32
29a60 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64  _FIND_DATAW find
29a70 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Data;.  Tcl_Obj 
29a80 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52  *listObj;.  DWOR
29a90 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
29aa0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
29ab0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29ac0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
29ad0 6a 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a  jv, "PATTERN");.
29ae0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29af0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e  RROR;.  }.  hFin
29b00 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73  dFile = FindFirs
29b10 74 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e  tFileW(Tcl_GetUn
29b20 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20  icode(objv[1]), 
29b30 26 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66  &findData);.  if
29b40 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56  ( hFindFile==INV
29b50 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
29b60 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  E ){.    Tcl_Set
29b70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
29b80 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
29b90 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
29ba0 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
29bb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29bc0 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f    listObj = Tcl_
29bd0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
29be0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73  IncrRefCount(lis
29bf0 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  tObj);.  do {.  
29c00 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
29c10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
29c20 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f  p, listObj, Tcl_
29c30 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20  NewUnicodeObj(. 
29c40 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e         findData.
29c50 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b  cFileName, -1));
29c60 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
29c70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
29c80 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54  terp, listObj, T
29c90 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
29ca0 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61  (.        findDa
29cb0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
29cc0 74 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65  tes));.  } while
29cd0 28 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28  ( FindNextFileW(
29ce0 68 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64  hFindFile, &find
29cf0 44 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45  Data) );.  lastE
29d00 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
29d10 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73  ror();.  if( las
29d20 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52  tErrno!=NO_ERROR
29d30 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
29d40 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c  RROR_NO_MORE_FIL
29d50 45 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c  ES ){.    FindCl
29d60 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
29d70 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
29d80 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20  ount(listObj);. 
29d90 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
29da0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
29db0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
29dc0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
29dd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29de0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64  RROR;.  }.  Find
29df0 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29  Close(hFindFile)
29e00 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
29e10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  sult(interp, lis
29e20 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20  tObj);.  return 
29e30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
29e40 20 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e        delete_win
29e50 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45  32_file FILENAME
29e60 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74  .**.** Deletes t
29e70 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
29e80 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  e, whose fully q
29e90 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
29ea0 79 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20  y exceed 260.** 
29eb0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
29ec0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
29ed0 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
29ee0 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65  tic int win32_de
29ef0 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69  lete_file(.  voi
29f00 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
29f10 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29f20 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
29f30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29f40 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
29f50 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
29f60 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
29f70 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29f80 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  v, "FILENAME");.
29f90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29fa0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29fb0 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c  !DeleteFileW(Tcl
29fc0 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
29fd0 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c  [1])) ){.    Tcl
29fe0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
29ff0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2a000 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2a010 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2a020 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a030 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
2a040 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2a050 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a060 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61  }../*.**      ma
2a070 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52  ke_win32_dir DIR
2a080 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65  ECTORY.**.** Cre
2a090 61 74 65 73 20 74 68 65 20 73 70 65 63 69 66 69  ates the specifi
2a0a0 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68  ed directory, wh
2a0b0 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2a0c0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
2a0d0 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61  eed 248.** chara
2a0e0 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
2a0f0 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
2a100 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2a110 6e 74 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a  nt win32_mkdir(.
2a120 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2a130 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2a140 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2a150 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2a160 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2a170 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2a180 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2a190 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2a1a0 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f  , objv, "DIRECTO
2a1b0 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RY");.    return
2a1c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a1d0 20 20 69 66 28 20 21 43 72 65 61 74 65 44 69 72    if( !CreateDir
2a1e0 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55  ectoryW(Tcl_GetU
2a1f0 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c  nicode(objv[1]),
2a200 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63   NULL) ){.    Tc
2a210 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a220 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2a230 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2a240 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2a250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a260 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2a270 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2a280 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a290 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72  .}../*.**      r
2a2a0 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20  emove_win32_dir 
2a2b0 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20  DIRECTORY.**.** 
2a2c0 52 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63  Removes the spec
2a2d0 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c  ified directory,
2a2e0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2a2f0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2a300 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68  exceed 248.** ch
2a310 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2a320 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2a330 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2a340 63 20 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69  c int win32_rmdi
2a350 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  r(.  void *clien
2a360 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a370 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2a380 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2a390 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2a3a0 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
2a3b0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2a3c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2a3d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45  , 1, objv, "DIRE
2a3e0 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74  CTORY");.    ret
2a3f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a400 20 7d 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65   }.  if( !Remove
2a410 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47  DirectoryW(Tcl_G
2a420 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2a430 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2a440 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2a450 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2a460 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2a470 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2a480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a490 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2a4a0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2a4b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2a4c0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20  #endif.../*.**  
2a4d0 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e      optimization
2a4e0 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20  _control DB OPT 
2a4f0 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e  BOOLEAN.**.** En
2a500 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
2a510 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69  query optimizati
2a520 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73 71  ons using the sq
2a530 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2a540 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ol().** interfac
2a550 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20 42  e.  Disable if B
2a560 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20  OOLEAN is false 
2a570 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f  and enable if BO
2a580 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a  OLEAN is true..*
2a590 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d  * OPT is the nam
2a5a0 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  e of the optimiz
2a5b0 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61  ation to be disa
2a5c0 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bled..*/.static 
2a5d0 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  int optimization
2a5e0 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64  _control(.  void
2a5f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2a600 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a610 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a620 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a630 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
2a640 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
2a650 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
2a660 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e   *zOpt;.  int on
2a670 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20  off;.  int mask 
2a680 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  = 0;.  static co
2a690 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
2a6a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
2a6b0 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d  tName;.    int m
2a6c0 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20  ask;.  } aOpt[] 
2a6d0 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c  = {.    { "all",
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6f0 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20   SQLITE_AllOpts 
2a700 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2a710 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20  "none",         
2a720 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2a740 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61      { "query-fla
2a750 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c  ttener",     SQL
2a760 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
2a770 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c  er },.    { "col
2a780 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20  umn-cache",     
2a790 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e     SQLITE_Column
2a7a0 43 61 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20  Cache    },.    
2a7b0 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72  { "groupby-order
2a7c0 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
2a7d0 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d  GroupByOrder   }
2a7e0 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d  ,.    { "factor-
2a7f0 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53  constants",    S
2a800 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
2a810 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64  onst },.    { "d
2a820 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20  istinct-opt",   
2a830 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74       SQLITE_Dist
2a840 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20  inctOpt    },.  
2a850 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73    { "cover-idx-s
2a860 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54  can",      SQLIT
2a870 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20  E_CoverIdxScan  
2a880 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72   },.    { "order
2a890 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20  -by-idx-join",  
2a8a0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
2a8b0 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20  dxJoin },.    { 
2a8c0 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20  "transitive",   
2a8d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72         SQLITE_Tr
2a8e0 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a  ansitive     },.
2a8f0 20 20 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d      { "subquery-
2a900 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c  coroutine",  SQL
2a910 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
2a920 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69  e  },.    { "omi
2a930 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20  t-noop-join",   
2a940 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f     SQLITE_OmitNo
2a950 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20  opJoin   },.    
2a960 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20 20 20  { "stat3",      
2a970 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2a980 53 74 61 74 33 20 20 20 20 20 20 20 20 20 20 7d  Stat3          }
2a990 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
2a9a0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
2a9b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2a9c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2a9d0 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22 29  DB OPT BOOLEAN")
2a9e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a9f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2aa00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2aa10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2aa20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2aa30 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2aa40 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
2aa50 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
2aa60 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2aa70 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20 72  [3], &onoff) ) r
2aa80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2aa90 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65  .  zOpt = Tcl_Ge
2aaa0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2aab0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2aac0 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
2aad0 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b  of(aOpt[0]); i++
2aae0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
2aaf0 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d 2e  p(zOpt, aOpt[i].
2ab00 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  zOptName)==0 ){.
2ab10 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f 70        mask = aOp
2ab20 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  t[i].mask;.     
2ab30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ab40 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29 20  }.  if( onoff ) 
2ab50 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20  mask = ~mask;.  
2ab60 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 4f  if( i>=sizeof(aO
2ab70 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
2ab80 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  0]) ){.    Tcl_A
2ab90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2aba0 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rp, "unknown opt
2abb0 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f 75  imization - shou
2abc0 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a  ld be one of:",.
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abe0 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
2abf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2ac00 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
2ac10 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b  of(aOpt[0]); i++
2ac20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2ac30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2ac40 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a  , " ", aOpt[i].z
2ac50 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  OptName, (char*)
2ac60 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
2ac70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ac80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74 65    }.  sqlite3_te
2ac90 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2aca0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2acb0 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61  IZATIONS, db, ma
2acc0 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  sk);.  return TC
2acd0 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  L_OK;.}..typedef
2ace0 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2acf0 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c  api_routines sql
2ad00 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2ad10 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61  s;./*.**     loa
2ad20 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69  d_static_extensi
2ad30 6f 6e 20 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a  on DB NAME ....*
2ad40 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72  *.** Load one or
2ad50 20 6d 6f 72 65 20 73 74 61 74 69 63 61 6c 6c 79   more statically
2ad60 20 6c 69 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f   linked extensio
2ad70 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
2ad80 74 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63 45  t tclLoadStaticE
2ad90 78 74 65 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76  xtensionCmd(.  v
2ada0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2adb0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2adc0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2add0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2ade0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2adf0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2ae00 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28  te3_amatch_init(
2ae10 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2ae20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2ae30 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2ae40 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ae50 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28  e3_closure_init(
2ae60 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2ae70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2ae80 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2ae90 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2aea0 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73  e3_fuzzer_init(s
2aeb0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2aec0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2aed0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2aee0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2aef0 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c 69  3_ieee_init(sqli
2af00 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2af10 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2af20 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2af30 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e  rn int sqlite3_n
2af40 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71 6c  extchar_init(sql
2af50 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2af60 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2af70 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2af80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2af90 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28  percentile_init(
2afa0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2afb0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2afc0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2afd0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2afe0 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 28 73  e3_regexp_init(s
2aff0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2b000 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2b010 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2b020 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b030 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28  3_spellfix_init(
2b040 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b050 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b060 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b070 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b080 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28 73  e3_totype_init(s
2b090 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2b0a0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2b0b0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2b0c0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b0d0 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2b0e0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2b0f0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2b100 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2b110 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2b120 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
2b130 73 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d  st char *zExtNam
2b140 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e  e;.    int (*pIn
2b150 69 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  it)(sqlite3*,cha
2b160 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2b170 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2b180 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e  ;.  } aExtension
2b190 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d  [] = {.    { "am
2b1a0 61 74 63 68 22 2c 20 20 20 20 20 20 20 20 20 20  atch",          
2b1b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d        sqlite3_am
2b1c0 61 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20  atch_init       
2b1d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b1e0 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20   "closure",     
2b1f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b200 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20  3_closure_init  
2b210 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2b220 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
2b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b240 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2b250 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b260 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
2b270 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2b280 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
2b290 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2b2a0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
2b2b0 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
2b2c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
2b2d0 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
2b2e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b2f0 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
2b300 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b310 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
2b320 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2b330 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20     { "regexp",  
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b350 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2b360 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b370 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66  },.    { "spellf
2b380 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ix",            
2b390 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66    sqlite3_spellf
2b3a0 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ix_init         
2b3b0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f      },.    { "to
2b3c0 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
2b3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2b3e0 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20  type_init       
2b3f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b400 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20   "wholenumber", 
2b410 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b420 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2b430 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  it          },. 
2b440 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   };.  sqlite3 *d
2b450 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
2b460 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c  *zName;.  int i,
2b470 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a   j, rc;.  char *
2b480 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2b490 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
2b4a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2b4b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2b4c0 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22  v, "DB NAME ..."
2b4d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b4e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2b4f0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2b500 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2b510 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2b520 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2b530 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a  L_ERROR;.  for(j
2b540 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29  =2; j<objc; j++)
2b550 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  {.    zName = Tc
2b560 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2b570 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
2b580 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2b590 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29  Extension); i++)
2b5a0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2b5b0 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e  mp(zName, aExten
2b5c0 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65  sion[i].zExtName
2b5d0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2b5e0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41    }.    if( i>=A
2b5f0 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
2b600 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ion) ){.      Tc
2b610 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b620 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
2b630 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e  extension: ", zN
2b640 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2b650 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2b660 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2b670 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f    rc = aExtensio
2b680 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26  n[i].pInit(db, &
2b690 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
2b6a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b6b0 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  OK || zErrMsg ){
2b6c0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
2b6d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b6e0 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20  "initialization 
2b6f0 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66  of ", zName, " f
2b700 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73  ailed: ", zErrMs
2b710 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
2b720 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2b730 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
2b740 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2b750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2b760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2b770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2b780 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
2b790 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
2b7a0 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
2b7b0 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
2b7c0 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
2b7d0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
2b7e0 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
2b7f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
2b800 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
2b810 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b820 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65  found_count;.  e
2b830 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b840 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
2b850 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2b860 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
2b870 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
2b880 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f  n int sqlite3_so
2b890 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  rt_count;.  exte
2b8a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
2b8b0 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66  urrent_time;.#if
2b8c0 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
2b8d0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b8e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b8f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b900 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  TYLE.  extern in
2b910 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
2b920 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65  _num;.#endif.  e
2b930 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b940 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a  3_max_blobsize;.
2b950 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b960 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43  ite3BtreeSharedC
2b970 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a  acheReport(void*
2b980 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9a0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
2b9b0 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f  Interp*,int,Tcl_
2b9c0 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73  Obj*CONST*);.  s
2b9d0 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2b9e0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2b9f0 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f  .     Tcl_CmdPro
2ba00 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43  c *xProc;.  } aC
2ba10 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
2ba20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20  "db_enter",     
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba40 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2ba50 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20 20  b_enter         
2ba60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2ba70 22 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20  "db_leave",     
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba90 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2baa0 62 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20 20  b_leave         
2bab0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2bac0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bad0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2bae0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2baf0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
2bb00 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt    },.     { 
2bb10 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bb20 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
2bb30 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bb40 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
2bb50 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt64  },.     { 
2bb60 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bb70 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 20  _long",         
2bb80 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bb90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c  qlite3_mprintf_l
2bba0 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  ong   },.     { 
2bbb0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bbc0 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
2bbd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bbe0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bbf0 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tr    },.     { 
2bc00 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74  "sqlite3_snprint
2bc10 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  f_str",         
2bc20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bc30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
2bc40 73 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  str   },.     { 
2bc50 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bc60 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20  _stronly",      
2bc70 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bc80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bc90 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20  tronly},.     { 
2bca0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bcb0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
2bcc0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bcd0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
2bce0 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20  ouble },.     { 
2bcf0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bd00 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20  _scaled",       
2bd10 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bd20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bd30 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20  caled },.     { 
2bd40 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bd50 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28  _hexdouble",   (
2bd60 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
2bd70 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
2bd80 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20  double},.     { 
2bd90 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bda0 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _z_test",       
2bdb0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2bdc0 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20  est_mprintf_z   
2bdd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2bde0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2bdf0 6e 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  n_test",        
2be00 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2be10 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20  st_mprintf_n    
2be20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2be30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
2be40 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 28  int",          (
2be50 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2be60 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20  t_snprintf_int  
2be70 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2be80 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
2be90 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54  t_rowid",     (T
2bea0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2beb0 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20  _last_rowid     
2bec0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2bed0 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
2bee0 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
2bef0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2bf00 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20  exec_printf     
2bf10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bf20 74 65 33 5f 65 78 65 63 5f 68 65 78 22 2c 20 20  te3_exec_hex",  
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2bf40 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
2bf50 78 65 63 5f 68 65 78 20 20 20 20 20 20 20 20 20  xec_hex         
2bf60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bf70 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20  e3_exec",       
2bf80 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2bf90 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
2bfa0 65 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ec             }
2bfb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bfc0 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20  3_exec_nr",     
2bfd0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2bfe0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2bff0 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c  c_nr          },
2c000 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c010 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20  OMIT_GET_TABLE. 
2c020 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2c030 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
2c040 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2c050 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
2c060 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65  ble_printf },.#e
2c070 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2c080 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20  ite3_close",    
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2c0a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2c0b0 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20  e_test_close    
2c0c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c0d0 74 65 33 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20  te3_close_v2",  
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2c0f0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2c100 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20  _test_close_v2  
2c110 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c120 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2c130 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
2c140 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
2c150 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d  eate_function  }
2c160 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c170 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
2c180 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  te",      (Tcl_C
2c190 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
2c1a0 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c  ate_aggregate },
2c1b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2c1c0 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
2c1d0 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d  nction", (Tcl_Cm
2c1e0 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69  dProc*)test_regi
2c1f0 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a  ster_func    },.
2c200 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61       { "sqlite_a
2c210 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20  bort",          
2c220 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2c230 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f  Proc*)sqlite_abo
2c240 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  rt          },. 
2c250 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69      { "sqlite_bi
2c260 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nd",            
2c270 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2c280 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20  roc*)test_bind  
2c290 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c2a0 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74     { "breakpoint
2c2b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c2c0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2c2d0 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f  oc*)test_breakpo
2c2e0 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  int       },.   
2c2f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79    { "sqlite3_key
2c300 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c310 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2c320 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20  c*)test_key     
2c330 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2c340 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65   { "sqlite3_reke
2c350 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
2c360 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2c370 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20  *)test_rekey    
2c380 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c390 7b 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  { "sqlite_set_ma
2c3a0 67 69 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  gic",           
2c3b0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2c3c0 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69  )sqlite_set_magi
2c3d0 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  c      },.     {
2c3e0 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72   "sqlite3_interr
2c3f0 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  upt",           
2c400 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2c410 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20  test_interrupt  
2c420 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2c430 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66  "sqlite_delete_f
2c440 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
2c450 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2c460 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  elete_function  
2c470 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2c480 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
2c490 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  llation",       
2c4a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65  (Tcl_CmdProc*)de
2c4b0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20  lete_collation  
2c4c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2c4d0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
2c4e0 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28  ommit",        (
2c4f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74  Tcl_CmdProc*)get
2c500 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20  _autocommit     
2c510 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2c520 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64  lite3_stack_used
2c530 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ",            (T
2c540 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2c550 5f 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20  _stack_used     
2c560 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c570 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
2c580 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
2c590 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2c5a0 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20  busy_timeout    
2c5b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e   },.     { "prin
2c5c0 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  tf",            
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2c5e0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70  _CmdProc*)test_p
2c5f0 72 69 6e 74 66 20 20 20 20 20 20 20 20 20 20 20  rintf           
2c600 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c610 65 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20  e3IoTrace",     
2c620 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2c630 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74  dProc*)test_io_t
2c640 72 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a  race         },.
2c650 20 20 20 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61       { "clang_sa
2c660 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73 22 2c  nitize_address",
2c670 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2c680 50 72 6f 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69  Proc*)clang_sani
2c690 74 69 7a 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a  tize_address },.
2c6a0 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74    };.  static st
2c6b0 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
2c6c0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
2c6d0 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
2c6e0 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
2c6f0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
2c700 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
2c710 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2c720 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
2c730 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65  ",    get_sqlite
2c740 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20  _pointer, 0 },. 
2c750 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2c760 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ind_int",       
2c770 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2c780 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a  _int,      0 },.
2c790 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c7a0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20  bind_zeroblob", 
2c7b0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2c7c0 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c  d_zeroblob, 0 },
2c7d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c7e0 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
2c7f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2c800 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
2c810 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c820 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
2c830 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2c840 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
2c850 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c860 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
2c870 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2c880 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
2c890 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c8a0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2c8c0 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
2c8d0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2c8e0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
2c8f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2c900 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
2c910 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2c920 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
2c930 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
2c940 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
2c950 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2c960 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2c970 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74  meter_count",  t
2c980 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
2c990 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20  er_count, 0},.  
2c9a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2c9b0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
2c9c0 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f  e",   test_bind_
2c9d0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20  parameter_name, 
2c9e0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2c9f0 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2ca00 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73  ter_index",  tes
2ca10 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
2ca20 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20  _index, 0},.    
2ca30 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61   { "sqlite3_clea
2ca40 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
2ca50 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62      test_clear_b
2ca60 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20  indings, 0},.   
2ca70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65    { "sqlite3_sle
2ca80 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
2ca90 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c       test_sleep,
2caa0 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20            0},.  
2cab0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2cac0 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  rcode",         
2cad0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f        test_errco
2cae0 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  de       ,0 },. 
2caf0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2cb00 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22  xtended_errcode"
2cb10 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65  ,      test_ex_e
2cb20 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a  rrcode    ,0 },.
2cb30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cb40 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
2cb50 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
2cb60 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
2cb70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cb80 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
2cb90 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
2cba0 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
2cbb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2cbc0 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
2cbd0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
2cbe0 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
2cbf0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2cc00 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
2cc10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2cc20 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
2cc30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2cc40 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20  te3_open_v2",   
2cc50 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2cc60 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c  _open_v2       ,
2cc70 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2cc80 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22  ite3_complete16"
2cc90 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
2cca0 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20  t_complete16    
2ccb0 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
2ccc0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c  qlite3_prepare",
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2cce0 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20  est_prepare     
2ccf0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2cd00 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
2cd10 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2cd20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20  test_prepare16  
2cd30 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2cd40 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2cd50 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
2cd60 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
2cd70 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2cd80 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
2cd90 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20  e_tkt3134",     
2cda0 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74    test_prepare_t
2cdb0 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20  kt3134, 0},.    
2cdc0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
2cdd0 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20  are16_v2",      
2cde0 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
2cdf0 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20  16_v2  ,0 },.   
2ce00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
2ce10 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
2ce20 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
2ce30 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
2ce40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2ce50 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20  mt_status",     
2ce60 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
2ce70 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20  status   ,0 },. 
2ce80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
2ce90 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
2cea0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
2ceb0 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
2cec0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ced0 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
2cee0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
2cef0 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
2cf00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cf10 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
2cf20 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
2cf30 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
2cf40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2cf50 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
2cf60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2cf70 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
2cf80 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2cf90 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
2cfa0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2cfb0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
2cfc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2cfd0 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20  te3_sql",       
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2cff0 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c  _sql           ,
2d000 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2d010 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c  ite3_next_stmt",
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2d030 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20  t_next_stmt     
2d040 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2d050 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
2d060 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74 65  nly",         te
2d070 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  st_stmt_readonly
2d080 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2d090 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
2d0a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
2d0b0 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20  est_stmt_busy   
2d0c0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2d0d0 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
2d0e0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
2d0f0 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
2d100 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20  l ,0 },..     { 
2d110 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65  "sqlite3_release
2d120 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20  _memory",       
2d130 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
2d140 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20  mory,     0},.  
2d150 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
2d160 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
2d170 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65  ,     test_db_re
2d180 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30  lease_memory,  0
2d190 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2d1a0 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c  e3_db_filename",
2d1b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2d1c0 64 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20  db_filename,    
2d1d0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2d1e0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
2d1f0 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  nly",           
2d200 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  test_db_readonly
2d210 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
2d220 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66    { "sqlite3_sof
2d230 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20  t_heap_limit",  
2d240 20 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68       test_soft_h
2d250 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d  eap_limit,    0}
2d260 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d270 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
2d280 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74  ",        test_t
2d290 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20  hread_cleanup,  
2d2a0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2d2b0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
2d2c0 63 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74  counts",       t
2d2d0 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
2d2e0 6e 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20  nts,    0},..   
2d2f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61    { "sqlite3_loa
2d300 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
2d310 20 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65       test_load_e
2d320 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d  xtension,     0}
2d330 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d340 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
2d350 74 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65  tension", test_e
2d360 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20  nable_load,     
2d370 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2d380 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
2d390 72 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74  result_codes", t
2d3a0 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
2d3b0 75 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20  ult_codes, 0},. 
2d3c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
2d3d0 69 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20  imit",          
2d3e0 20 20 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69         test_limi
2d3f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2d400 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
2d410 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  save_prng_state"
2d420 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d430 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  save_prng_state,
2d440 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
2d450 22 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74  "restore_prng_st
2d460 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
2d470 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
2d480 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ate, 0 },.     {
2d490 20 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61   "reset_prng_sta
2d4a0 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
2d4b0 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
2d4c0 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  te,   0 },.     
2d4d0 7b 20 22 64 61 74 61 62 61 73 65 5f 6e 65 76 65  { "database_neve
2d4e0 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  r_corrupt",     
2d4f0 20 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65     database_neve
2d500 72 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  r_corrupt, 0},. 
2d510 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f      { "database_
2d520 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c  may_be_corrupt",
2d530 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 5f         database_
2d540 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20  may_be_corrupt, 
2d550 30 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69  0},.     { "opti
2d560 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2d570 22 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74 69  ",          opti
2d580 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2d590 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f  ,0},.#if SQLITE_
2d5a0 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c  OS_WIN.     { "l
2d5b0 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ock_win32_file",
2d5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2d5d0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20  in32_file_lock, 
2d5e0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2d5f0 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74  exists_win32_pat
2d600 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2d610 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
2d620 68 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  h,  0 },.     { 
2d630 22 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65  "find_win32_file
2d640 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d650 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65   win32_find_file
2d660 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
2d670 20 22 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66   "delete_win32_f
2d680 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
2d690 20 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66    win32_delete_f
2d6a0 69 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20  ile,  0 },.     
2d6b0 7b 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69  { "make_win32_di
2d6c0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2d6d0 20 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20     win32_mkdir, 
2d6e0 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
2d6f0 20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32   { "remove_win32
2d700 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20 20  _dir",          
2d710 20 20 20 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c      win32_rmdir,
2d720 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2d730 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f  dif.     { "tcl_
2d740 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20  objproc",       
2d750 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41              runA
2d760 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20  sObjProc,       
2d770 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
2d780 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
2d790 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
2d7a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2d7b0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
2d7c0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
2d7d0 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
2d7e0 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
2d7f0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
2d800 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
2d810 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2d820 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2d830 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
2d840 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
2d850 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
2d860 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2d870 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
2d880 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
2d890 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
2d8a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2d8b0 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
2d8c0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
2d8d0 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
2d8e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d8f0 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
2d900 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
2d910 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
2d920 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2d930 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
2d940 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
2d950 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2d960 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
2d970 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d980 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
2d990 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
2d9a0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2d9b0 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
2d9c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2d9d0 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
2d9e0 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
2d9f0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2da00 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
2da10 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2da20 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
2da30 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
2da40 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2da50 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
2da60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
2da70 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
2da80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2da90 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
2daa0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2dab0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
2dac0 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
2dad0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2dae0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
2daf0 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
2db00 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
2db10 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
2db20 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
2db30 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2db40 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
2db50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
2db60 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
2db70 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2db80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2db90 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
2dba0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2dbb0 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
2dbc0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
2dbd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
2dbe0 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
2dbf0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2dc00 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
2dc10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2dc20 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
2dc30 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
2dc40 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2dc50 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
2dc60 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2dc70 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
2dc80 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2dc90 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2dca0 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a  column_text16},.
2dcb0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dcc0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
2dcd0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2dce0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2dcf0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
2dd00 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
2dd10 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2dd20 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
2dd30 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2dd40 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
2dd50 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
2dd60 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
2dd70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2dd80 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
2dd90 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
2dda0 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
2ddb0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2ddc0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
2ddd0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2dde0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
2ddf0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
2de00 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
2de10 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
2de20 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2de30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
2de40 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  abase_name16},.{
2de50 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2de60 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74  table_name16", t
2de70 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
2de80 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2de90 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
2dea0 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
2deb0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2dec0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
2ded0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2dee0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2def0 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e  gin_name16},.#en
2df00 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  dif.#endif.     
2df10 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2df20 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c  e_collation_v2",
2df30 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
2df40 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  lation_v2, 0 },.
2df50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2df60 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c  global_recover",
2df70 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c       test_global
2df80 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c  _recover, 0   },
2df90 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67  .     { "working
2dfa0 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20  _64bit_int",    
2dfb0 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34        working_64
2dfc0 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d  bit_int,   0   }
2dfd0 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e  ,.     { "vfs_un
2dfe0 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20  link_test",     
2dff0 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e         vfs_unlin
2e000 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20  k_test,     0   
2e010 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69  },.     { "vfs_i
2e020 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20  nitfail_test",  
2e030 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74          vfs_init
2e040 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  fail_test,   0  
2e050 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2e060 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  unregister_all",
2e070 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72           vfs_unr
2e080 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
2e090 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
2e0a0 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _reregister_all"
2e0b0 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65  ,         vfs_re
2e0c0 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
2e0d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2e0e0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22  le_control_test"
2e0f0 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f  ,          file_
2e100 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20  control_test,   
2e110 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2e120 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
2e130 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c  errno_test", fil
2e140 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
2e150 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  rno_test,  0   }
2e160 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2e170 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
2e180 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
2e190 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
2e1a0 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
2e1b0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2e1c0 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
2e1d0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2e1e0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20  chunksize_test, 
2e1f0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e200 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
2e210 65 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66 69  ehint_test",  fi
2e220 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
2e230 69 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20 20  int_test,   0   
2e240 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2e250 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76  control_win32_av
2e260 5f 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f  _retry", file_co
2e270 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72  ntrol_win32_av_r
2e280 65 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20  etry,  0   },.  
2e290 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2e2a0 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c  ol_persist_wal",
2e2b0 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
2e2c0 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20  _persist_wal,   
2e2d0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2e2e0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f  "file_control_po
2e2f0 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
2e300 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  e",file_control_
2e310 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
2e320 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ite,0},.     { "
2e330 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
2e340 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69  name",        fi
2e350 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
2e360 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20  me,         0   
2e370 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2e380 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
2e390 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f  name",   file_co
2e3a0 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
2e3b0 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  me,    0   },.  
2e3c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66     { "sqlite3_vf
2e3d0 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20  s_list",        
2e3e0 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20     vfs_list,    
2e3f0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e400 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2e410 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  unction_v2", tes
2e420 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
2e430 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20  n_v2, 0 },..    
2e440 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72   /* Functions fr
2e450 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64  om os.h */.#ifnd
2e460 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
2e470 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64  TF16.     { "add
2e480 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  _test_collate", 
2e490 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c         test_coll
2e4a0 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20  ate, 0          
2e4b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
2e4c0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
2e4d0 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c  eded", test_coll
2e4e0 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20  ate_needed, 0   
2e4f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
2e500 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
2e510 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63         test_func
2e520 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20  tion, 0         
2e530 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
2e540 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74   { "sqlite3_test
2e550 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65  _errstr",     te
2e560 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20  st_errstr, 0    
2e570 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2e580 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65   { "tcl_variable
2e590 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63  _type",       tc
2e5a0 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c  l_variable_type,
2e5b0 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e   0       },.#ifn
2e5c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e5d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
2e5e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
2e5f0 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
2e600 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73  ", test_enable_s
2e610 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20  hared, 0  },.   
2e620 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61    { "sqlite3_sha
2e630 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74  red_cache_report
2e640 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ", sqlite3BtreeS
2e650 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74  haredCacheReport
2e660 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  , 0},.#endif.   
2e670 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62    { "sqlite3_lib
2e680 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c  version_number",
2e690 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e   test_libversion
2e6a0 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23  _number, 0  },.#
2e6b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2e6c0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
2e6d0 41 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  ATA.     { "sqli
2e6e0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2e6f0 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74  _metadata", test
2e700 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
2e710 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65  tadata, 0  },.#e
2e720 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
2e730 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2e740 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  B.     { "sqlite
2e750 33 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 20  3_blob_read",   
2e760 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20  test_blob_read, 
2e770 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
2e780 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
2e790 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72  ",  test_blob_wr
2e7a0 69 74 65 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  ite, 0  },.     
2e7b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
2e7c0 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c  reopen", test_bl
2e7d0 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c  ob_reopen, 0  },
2e7e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e7f0 5f 62 6c 6f 62 5f 62 79 74 65 73 22 2c 20 20 74  _blob_bytes",  t
2e800 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 2c 20  est_blob_bytes, 
2e810 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
2e820 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
2e830 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c  ",  test_blob_cl
2e840 6f 73 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ose, 0  },.#endi
2e850 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65  f.     { "pcache
2e860 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74  _stats",       t
2e870 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
2e880 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53  , 0  },.#ifdef S
2e890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
2e8a0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20  OCK_NOTIFY.     
2e8b0 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  { "sqlite3_unloc
2e8c0 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f  k_notify", test_
2e8d0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30  unlock_notify, 0
2e8e0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
2e8f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
2e900 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74  checkpoint",   t
2e910 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
2e920 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  nt, 0  },.     {
2e930 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   "sqlite3_wal_ch
2e940 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73  eckpoint_v2",tes
2e950 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
2e960 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  _v2, 0  },.     
2e970 7b 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  { "test_sqlite3_
2e980 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65  log",         te
2e990 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20  st_sqlite3_log, 
2e9a0 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  0  },.#ifndef SQ
2e9b0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2e9c0 4e 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f  N.     { "print_
2e9d0 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c  explain_query_pl
2e9e0 61 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f  an", test_print_
2e9f0 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  eqp, 0  },.#endi
2ea00 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2ea10 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c  3_test_control",
2ea20 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
2ea30 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45  ol },.#if SQLITE
2ea40 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20  _OS_UNIX.     { 
2ea50 22 67 65 74 72 75 73 61 67 65 22 2c 20 74 65 73  "getrusage", tes
2ea60 74 5f 67 65 74 72 75 73 61 67 65 20 7d 2c 0a 23  t_getrusage },.#
2ea70 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f  endif.     { "lo
2ea80 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
2ea90 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61  ion", tclLoadSta
2eaa0 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20  ticExtensionCmd 
2eab0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
2eac0 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a   int bitmask_siz
2ead0 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  e = sizeof(Bitma
2eae0 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a  sk)*8;.  int i;.
2eaf0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2eb00 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
2eb10 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
2eb20 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  c_count;.  exter
2eb30 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  n int sqlite3_op
2eb40 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20  entemp_count;.  
2eb50 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2eb60 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20  e3_like_count;. 
2eb70 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2eb80 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
2eb90 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2eba0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
2ebb0 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  addb_count;.  ex
2ebc0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2ebd0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2ebe0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2ebf0 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2ec00 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23  _writej_count;.#
2ec10 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2ec20 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2ec30 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23  lite3_os_type;.#
2ec40 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2ec50 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65  ITE_DEBUG.  exte
2ec60 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
2ec70 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65  ereTrace;.  exte
2ec80 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53  rn int sqlite3OS
2ec90 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
2eca0 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72  int sqlite3WalTr
2ecb0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ace;.#endif.#ifd
2ecc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
2ecd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ece0 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72  BLE_FTS3.  exter
2ecf0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  n int sqlite3_ft
2ed00 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
2ed10 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65  heses;.#endif.#e
2ed20 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ndif..  for(i=0;
2ed30 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f   i<sizeof(aCmd)/
2ed40 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b  sizeof(aCmd[0]);
2ed50 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
2ed60 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
2ed70 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61  erp, aCmd[i].zNa
2ed80 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f  me, aCmd[i].xPro
2ed90 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
2eda0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2edb0 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
2edc0 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
2edd0 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
2ede0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
2edf0 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
2ee00 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
2ee10 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f   aObjCmd[i].xPro
2ee20 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c  c, aObjCmd[i].cl
2ee30 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  ientData, 0);.  
2ee40 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  }.  Tcl_LinkVar(
2ee50 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ee60 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a  search_count", .
2ee70 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2ee80 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
2ee90 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
2eea0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2eeb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2eec0 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a  _found_count", .
2eed0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2eee0 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
2eef0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2ef00 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2ef10 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ef20 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  sort_count", .  
2ef30 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2ef40 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20  te3_sort_count, 
2ef50 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2ef60 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2ef70 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61  erp, "sqlite3_ma
2ef80 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20  x_blobsize", .  
2ef90 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2efa0 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
2efb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2efc0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2efd0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
2efe0 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ike_count", .   
2eff0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2f000 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54  e3_like_count, T
2f010 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2f020 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2f030 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
2f040 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
2f050 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2f060 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
2f070 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2f080 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2f090 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f0a0 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
2f0b0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
2f0c0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
2f0d0 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
2f0e0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2f0f0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f100 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
2f110 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
2f120 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2f130 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
2f140 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
2f150 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
2f160 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2f170 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2f180 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2f190 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TYLE.  Tcl_LinkV
2f1a0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f1b0 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20  te_hostid_num", 
2f1c0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2f1d0 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2f1e0 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  m, TCL_LINK_INT)
2f1f0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
2f200 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f210 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
2f220 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
2f230 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66  har*)&sqlite3_xf
2f240 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  eropt_count, TCL
2f250 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2f260 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f270 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
2f280 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a  _readdb_count",.
2f290 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f2a0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
2f2b0 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
2f2c0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2f2d0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f2e0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2f2f0 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  itedb_count",.  
2f300 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2f310 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2f320 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
2f330 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2f340 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2f350 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2f360 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  tej_count",.    
2f370 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2f380 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2f390 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2f3a0 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
2f3b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
2f3c0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2f3d0 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
2f3e0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
2f3f0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
2f400 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
2f410 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
2f420 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
2f430 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f440 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
2f450 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f460 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
2f470 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
2f480 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
2f490 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
2f4a0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
2f4b0 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
2f4c0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
2f4d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
2f4e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2f4f0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
2f500 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
2f510 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
2f520 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ype, TCL_LINK_IN
2f530 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
2f540 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2f550 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
2f560 73 74 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70  st char *query_p
2f570 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f 4c  lan = "*** OBSOL
2f580 45 54 45 20 56 41 52 49 41 42 4c 45 20 2a 2a 2a  ETE VARIABLE ***
2f590 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 6e 6b 56  ";.    Tcl_LinkV
2f5a0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f5b0 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a  te_query_plan",.
2f5c0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 71         (char*)&q
2f5d0 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c  uery_plan, TCL_L
2f5e0 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c  INK_STRING|TCL_L
2f5f0 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
2f600 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
2f610 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2f620 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2f630 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65  erp, "sqlite_whe
2f640 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  re_trace",.     
2f650 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2f660 57 68 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f  WhereTrace, TCL_
2f670 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2f680 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2f690 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
2f6a0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
2f6b0 29 26 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65  )&sqlite3OSTrace
2f6c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f6d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f6e0 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c  OMIT_WAL.  Tcl_L
2f6f0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f700 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65  sqlite_wal_trace
2f710 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2f720 26 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65  &sqlite3WalTrace
2f730 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f740 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
2f750 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f760 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f  IT_DISKIO.  Tcl_
2f770 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2f780 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70  "sqlite_opentemp
2f790 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
2f7a0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
2f7b0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54  pentemp_count, T
2f7c0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2f7d0 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  ndif.  Tcl_LinkV
2f7e0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f7f0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
2f800 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68  alue",.      (ch
2f810 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
2f820 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54  ic_bind_value, T
2f830 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
2f840 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2f850 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2f860 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
2f870 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2f880 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  &sqlite_static_b
2f890 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c  ind_nbyte, TCL_L
2f8a0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
2f8b0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2f8c0 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72  "sqlite_temp_dir
2f8d0 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28  ectory",.      (
2f8e0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74  char*)&sqlite3_t
2f8f0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54  emp_directory, T
2f900 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
2f910 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2f920 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 64  nterp, "sqlite_d
2f930 61 74 61 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  ata_directory",.
2f940 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f950 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2f960 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
2f970 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
2f980 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62  nkVar(interp, "b
2f990 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20  itmask_size",.  
2f9a0 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d      (char*)&bitm
2f9b0 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  ask_size, TCL_LI
2f9c0 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f  NK_INT|TCL_LINK_
2f9d0 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63  READ_ONLY);.  Tc
2f9e0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f9f0 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63  , "sqlite_sync_c
2fa00 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2fa10 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e  ar*)&sqlite3_syn
2fa20 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
2fa30 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2fa40 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2fa50 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
2fa60 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2fa70 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c  ar*)&sqlite3_ful
2fa80 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  lsync_count, TCL
2fa90 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
2faa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2fab0 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64  NABLE_FTS3) && d
2fac0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2fad0 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  ST).  Tcl_LinkVa
2fae0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2faf0 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  e_fts3_enable_pa
2fb00 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20  rentheses",.    
2fb10 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2fb20 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
2fb30 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c  rentheses, TCL_L
2fb40 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
2fb50 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2fb60 3b 0a 7d 0a                                      ;.}.