/ Hex Artifact Content
Login

Artifact 0cd73ae82fdf7add76ca603e3575380ae7539ae2:


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 55 73 61 67 65 3a 20  }../*.** Usage: 
12d30 61 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69  add_test_utf16bi
12d40 6e 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74  n_collate <db pt
12d50 72 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75  r>.**.** Add a u
12d60 74 66 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20  tf-16 collation 
12d70 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22  sequence named "
12d80 75 74 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65  utf16bin" to the
12d90 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e   database.** han
12da0 64 6c 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74  dle. This collat
12db0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d  ion sequence com
12dc0 70 61 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20  pares arguments 
12dd0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20  in the same way 
12de0 61 73 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d  as the.** built-
12df0 69 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69  in collation "bi
12e00 6e 61 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  nary"..*/.static
12e10 20 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62   int test_utf16b
12e20 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28  in_collate_func(
12e30 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
12e40 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20    int nA, const 
12e50 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
12e60 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nB, const void *
12e70 7a 42 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70  zB.){.  int nCmp
12e80 20 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a   = (nA>nB ? nB :
12e90 20 6e 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20   nA);.  int res 
12ea0 3d 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c  = memcmp(zA, zB,
12eb0 20 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65   nCmp);.  if( re
12ec0 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20  s==0 ) res = nA 
12ed0 2d 20 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72  - nB;.  return r
12ee0 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
12ef0 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63   test_utf16bin_c
12f00 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
12f10 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12f20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12f30 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12f40 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12f50 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
12f60 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
12f70 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
12f80 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  2 ) goto bad_arg
12f90 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
12fa0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
12fb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12fc0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
12fd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
12fe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
12ff0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
13000 64 62 2c 20 22 75 74 66 31 36 62 69 6e 22 2c 20  db, "utf16bin", 
13010 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 30 2c  SQLITE_UTF16, 0,
13020 20 0a 20 20 20 20 20 20 74 65 73 74 5f 75 74 66   .      test_utf
13030 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75  16bin_collate_fu
13040 6e 63 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71  nc.  );.  if( sq
13050 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13060 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
13070 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13080 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
13090 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
130a0 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
130b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
130c0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
130d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
130e0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
130f0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
13100 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
13110 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
13120 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
13130 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
13140 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
13150 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
13160 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
13170 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
13180 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
13190 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
131a0 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
131b0 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
131c0 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
131d0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
131e0 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
131f0 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
13200 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
13210 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
13220 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
13230 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
13240 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
13250 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
13260 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
13270 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
13280 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
13290 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
132a0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
132b0 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
132c0 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
132d0 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
132e0 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
132f0 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
13300 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
13310 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
13320 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
13330 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
13340 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
13350 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
13360 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
13370 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
13380 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
13390 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
133a0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
133b0 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
133c0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
133d0 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45   ENC(db), SQLITE
133e0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29  _INT_TO_PTR(enc)
133f0 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
13400 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
13410 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
13420 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
13430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
13440 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13450 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
13460 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13480 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13490 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
134a0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
134b0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
134c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
134d0 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
134e0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
134f0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
13500 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
13510 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
13520 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
13530 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
13540 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
13550 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
13560 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
13570 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
13580 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
13590 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
135a0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
135b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
135c0 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
135d0 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
135e0 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
135f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
13600 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
13610 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13620 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
13630 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
13640 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
13650 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
13660 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
13670 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
13680 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
13690 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
136a0 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
136b0 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
136c0 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
136d0 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
136e0 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
136f0 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
13700 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
13710 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
13720 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
13730 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
13740 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
13750 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
13760 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
13770 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
13780 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
13790 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
137a0 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
137b0 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
137c0 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
137d0 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
137e0 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
137f0 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
13800 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
13810 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13820 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
13830 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
13840 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
13850 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
13860 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
13870 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
13880 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
13890 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
138a0 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
138b0 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
138c0 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
138d0 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
138e0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
138f0 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
13900 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
13910 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
13920 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
13930 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
13940 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
13950 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
13960 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
13970 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
13980 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
13990 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
139a0 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
139b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
139c0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
139d0 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
139e0 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
139f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13a00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13a10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13a20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
13a30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
13a40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
13a50 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
13a60 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
13a70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13a80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13a90 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13aa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13ab0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13ac0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13ad0 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
13ae0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
13af0 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
13b00 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
13b10 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13b20 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
13b30 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
13b40 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
13b50 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
13b60 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
13b70 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
13b80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
13ba0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13bb0 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
13bc0 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
13bd0 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
13be0 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
13bf0 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
13c00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13c10 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
13c20 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
13c30 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
13c40 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
13c50 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
13c60 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
13c70 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
13c80 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
13c90 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
13ca0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
13cb0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
13cc0 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
13cd0 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
13ce0 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
13cf0 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
13d00 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
13d10 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
13d20 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
13d30 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
13d40 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
13d50 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
13d60 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
13d70 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
13d80 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
13d90 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
13da0 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
13db0 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
13dc0 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
13dd0 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
13de0 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
13df0 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
13e00 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
13e10 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
13e20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
13e30 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
13e40 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
13e50 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
13e60 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
13e70 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
13e80 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
13e90 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
13ea0 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
13eb0 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
13ec0 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
13ed0 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
13ee0 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
13ef0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
13f00 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
13f10 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
13f20 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
13f30 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
13f40 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
13f50 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
13f60 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
13f70 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
13f80 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
13f90 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
13fa0 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
13fb0 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
13fc0 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
13fd0 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
13fe0 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
13ff0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14000 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
14010 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
14020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14030 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
14040 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
14050 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
14060 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
14070 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
14080 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
14090 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
140a0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
140b0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
140c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
140d0 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
140e0 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
140f0 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
14100 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
14110 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
14120 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
14130 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
14140 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
14150 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14160 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
14170 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14180 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
14190 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
141a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
141b0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
141c0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
141d0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
141e0 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
141f0 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
14200 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
14210 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
14220 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
14230 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
14240 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
14250 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
14260 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
14270 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14280 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
14290 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
142a0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
142b0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
142c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
142d0 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
142e0 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
142f0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
14300 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
14310 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
14320 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14330 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
14340 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
14350 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14360 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
14370 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
14380 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
14390 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
143a0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
143b0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
143c0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
143d0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
143e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
143f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
14400 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14410 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
14420 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
14430 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
14440 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
14450 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14460 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
14470 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
14480 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14490 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
144a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
144b0 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
144c0 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
144d0 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
144e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
144f0 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
14500 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14510 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14520 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14530 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
14540 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
14550 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
14560 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
14570 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
14580 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
14590 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
145a0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
145b0 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
145c0 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
145d0 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
145e0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
145f0 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
14600 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
14610 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
14620 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
14630 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
14640 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14650 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
14660 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
14670 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14680 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
14690 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
146a0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
146b0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
146c0 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
146d0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
146e0 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
146f0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14700 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14710 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14720 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14730 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
14740 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
14750 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
14760 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
14770 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
14780 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14790 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
147a0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
147b0 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
147c0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
147d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
147e0 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
147f0 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14800 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14810 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14820 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
14830 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
14840 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14850 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14860 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
14870 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
14880 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14890 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
148a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
148b0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
148c0 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
148d0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
148e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
148f0 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
14900 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14910 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
14920 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
14930 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
14940 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14950 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
14960 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
14970 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
14980 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14990 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
149a0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
149b0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
149c0 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
149d0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
149e0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
149f0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14a00 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
14a10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14a20 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
14a30 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
14a40 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
14a50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14a60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14a70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14a80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14a90 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
14aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
14ab0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
14ac0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
14ad0 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
14ae0 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
14af0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14b00 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14b10 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14b20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
14b30 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
14b40 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14b50 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14b60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
14b70 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14b80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14b90 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14ba0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14bb0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14bc0 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14bd0 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
14be0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14bf0 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
14c00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14c10 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14c20 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14c30 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
14c40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14c50 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
14c60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
14c70 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
14c80 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
14c90 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
14ca0 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
14cb0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14cc0 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
14cd0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
14ce0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14cf0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14d00 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
14d10 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14d20 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14d30 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14d40 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14d50 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14d60 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14d70 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
14d80 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
14d90 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
14da0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
14db0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
14dc0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
14dd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14de0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
14df0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
14e00 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
14e10 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14e20 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
14e30 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
14e40 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
14e50 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14e60 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
14e70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14e80 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
14e90 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ge:         sqli
14ea0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20  te3_test_errstr 
14eb0 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
14ec0 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
14ed0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
14ee0 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
14ef0 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
14f00 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
14f10 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
14f20 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
14f30 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
14f40 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
14f50 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
14f60 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
14f70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
14f80 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
14f90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
14fa0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
14fb0 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
14fc0 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
14fd0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
14fe0 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
14ff0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
15000 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
15010 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
15020 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
15030 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
15040 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
15050 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
15060 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
15070 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15080 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
15090 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
150a0 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
150b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
150c0 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
150d0 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
150e0 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
150f0 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
15100 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
15110 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
15120 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
15130 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
15140 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
15150 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15160 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
15170 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
15180 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
15190 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
151a0 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
151b0 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
151c0 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
151d0 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
151e0 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
151f0 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
15200 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
15210 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
15220 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
15230 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
15240 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
15250 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
15260 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
15270 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
15280 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
15290 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
152a0 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
152b0 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
152c0 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
152d0 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
152e0 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
152f0 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
15300 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
15310 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
15320 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
15330 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
15340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15350 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
15360 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
15370 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15380 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
15390 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
153a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
153b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
153c0 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
153d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
153e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
153f0 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
15400 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
15410 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
15420 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
15430 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
15440 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
15450 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
15460 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15470 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
15480 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
15490 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
154a0 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
154b0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
154c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
154d0 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
154e0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
154f0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15500 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15510 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15520 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
15530 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
15540 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
15550 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15560 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
15570 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
15580 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15590 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
155a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
155b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
155c0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
155d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
155e0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
155f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15600 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
15610 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15620 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
15630 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
15640 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15650 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15660 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15670 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15680 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15690 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
156a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
156b0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
156c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
156d0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
156e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
156f0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15700 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15710 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
15720 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15730 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
15740 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
15750 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
15760 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
15770 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
15780 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
15790 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
157a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
157b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
157c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
157d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
157e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
157f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15800 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15810 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
15820 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
15830 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
15840 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
15850 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
15860 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
15870 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
15880 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
15890 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
158a0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
158b0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
158c0 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
158d0 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
158e0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
158f0 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
15900 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15910 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15920 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15930 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15940 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15950 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
15960 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
15970 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
15980 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15990 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
159a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
159b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
159c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
159d0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
159e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
159f0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
15a00 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
15a10 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
15a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15a30 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15a40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15a50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15a60 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
15a70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15a80 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15a90 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15aa0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
15ab0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15ac0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15ad0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15ae0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
15af0 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
15b00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
15b10 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15b20 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
15b30 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
15b40 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
15b50 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
15b60 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
15b70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15b80 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
15b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15ba0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15bb0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15bc0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
15bd0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15be0 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
15bf0 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
15c00 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15c10 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
15c20 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15c30 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15c40 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15c50 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15c60 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15c70 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15c80 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15c90 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
15ca0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
15cb0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
15cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15cd0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
15ce0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15cf0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15d00 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15d10 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15d20 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15d30 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
15d40 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15d50 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  dx;.  Tcl_WideIn
15d60 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
15d70 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
15d80 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
15d90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15da0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15db0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15dc0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
15dd0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15de0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
15df0 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
15e00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15e10 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15e20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15e30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15e40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15e50 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15e60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15e70 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15e80 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15e90 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15ea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15eb0 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
15ec0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15ed0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
15ee0 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
15ef0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15f00 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15f10 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
15f20 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
15f30 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15f40 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15f50 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15f60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15f90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15fa0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
15fb0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
15fc0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15fd0 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
15fe0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
15ff0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
16000 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
16010 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
16020 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16030 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
16040 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
16050 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
16060 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
16070 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
16080 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
16090 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
160a0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
160b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
160c0 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a  st_bind_double(.
160d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
160e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
160f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16100 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16110 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16120 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
16130 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
16140 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c  dx;.  double val
16150 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
16160 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
16170 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
16180 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
16190 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
161a0 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
161b0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
161c0 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
161d0 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
161e0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
161f0 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
16200 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
16210 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
16220 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
16230 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
16240 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
16250 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
16260 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
16270 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
16280 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
16290 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
162a0 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
162b0 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
162c0 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
162d0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
162e0 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
162f0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
16300 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
16310 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
16320 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
16330 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
16340 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
16350 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
16360 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
16370 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
16380 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
16390 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
163a0 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
163b0 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
163c0 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
163d0 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
163e0 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
163f0 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
16400 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
16410 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
16420 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
16430 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16440 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16450 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16460 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16470 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16480 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16490 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
164a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
164b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
164c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
164d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
164e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
164f0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16500 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16510 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16520 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16530 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16540 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16550 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
16560 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
16570 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
16580 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
16590 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
165a0 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
165b0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
165c0 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
165d0 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
165e0 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
165f0 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
16600 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
16610 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
16620 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
16630 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
16640 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16650 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
16660 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
16670 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
16680 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
16690 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
166a0 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
166b0 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
166c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
166d0 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
166e0 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
166f0 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
16700 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
16710 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
16720 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
16730 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16740 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
16750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16760 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
16770 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
16780 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
16790 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
167a0 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
167b0 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
167c0 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
167d0 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
167e0 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
167f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16800 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
16810 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16820 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
16830 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
16840 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
16850 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
16860 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
16870 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
16880 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16890 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
168a0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
168b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
168c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
168d0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
168e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
168f0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16900 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
16910 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
16920 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
16930 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
16940 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16950 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16960 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16970 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16980 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16990 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
169a0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
169b0 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
169c0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
169d0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
169e0 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
169f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16a00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16a10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16a20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16a30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16a40 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16a50 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16a60 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
16a70 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
16a80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16a90 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16aa0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16ab0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16ac0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16ad0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16ae0 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
16af0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16b10 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16b20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16b30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16b40 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16b50 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16b60 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16b70 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16b80 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16b90 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
16ba0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
16bb0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
16bc0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16bd0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16be0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16bf0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16c00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16c10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16c20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16c30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16c40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16c50 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
16c60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16c70 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
16c80 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
16c90 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
16ca0 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
16cb0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16cc0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16cd0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16ce0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16cf0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16d00 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16d10 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16d20 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
16d30 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
16d40 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
16d50 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
16d60 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
16d70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16d80 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76  t_bind_text(.  v
16d90 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16da0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16db0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16dc0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16dd0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16de0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16df0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16e00 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
16e10 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
16e20 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
16e30 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
16e40 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16e50 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16e60 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16e70 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16e80 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16e90 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16ea0 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
16eb0 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
16ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16ed0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16ee0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
16ef0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16f00 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
16f10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16f20 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
16f30 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16f40 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16f50 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16f60 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
16f70 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
16f80 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
16f90 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73  (objv[3], &bytes
16fa0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
16fb0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16fc0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
16fd0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
16fe0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16ff0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
17000 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
17010 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
17020 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
17030 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
17040 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
17050 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
17060 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
17070 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
17080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17090 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
170a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
170b0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
170c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
170d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
170e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
170f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17100 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17110 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f  text16 ?-static?
17120 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
17130 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17140 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17150 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63  _text16 interfac
17160 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17170 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17180 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
17190 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
171a0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
171b0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
171c0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
171d0 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72  nds a UTF-16 str
171e0 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
171f0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
17200 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
17210 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
17220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17230 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a  st_bind_text16(.
17240 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17250 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17260 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17270 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17280 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17290 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
172a0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
172b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
172c0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
172d0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
172e0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
172f0 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44  rc;..  void (*xD
17300 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62  el)(void*) = (ob
17310 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41  jc==6?SQLITE_STA
17320 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53  TIC:SQLITE_TRANS
17330 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  IENT);.  Tcl_Obj
17340 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a   *oStmt    = obj
17350 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c  v[objc-4];.  Tcl
17360 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d  _Obj *oN       =
17370 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20   objv[objc-3];. 
17380 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e   Tcl_Obj *oStrin
17390 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  g  = objv[objc-2
173a0 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42  ];.  Tcl_Obj *oB
173b0 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  ytes   = objv[ob
173c0 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  jc-1];..  if( ob
173d0 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
173e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
173f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17400 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17410 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17420 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
17430 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
17440 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
17450 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
17460 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17470 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17480 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17490 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
174a0 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c  etString(oStmt),
174b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
174c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
174d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
174e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c  mObj(interp, oN,
174f0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
17500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
17510 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
17520 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
17530 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b  Obj(oString, 0);
17540 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17550 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17560 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29   oBytes, &bytes)
17570 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17580 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
17590 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
175a0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
175b0 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
175c0 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20  s, xDel);.  if( 
175d0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
175e0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
175f0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17600 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17610 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17630 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17640 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
17650 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
17660 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17670 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
17680 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
17690 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
176a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
176b0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
176c0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f  ite3_bind_blob ?
176d0 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20  -static? STMT N 
176e0 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  DATA BYTES.**.**
176f0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
17700 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65  3_bind_blob inte
17710 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17720 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17730 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17740 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17750 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
17760 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17770 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
17780 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74  * binds a BLOB t
17790 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
177a0 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54   The BLOB is BYT
177b0 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ES bytes in size
177c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
177d0 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a  test_bind_blob(.
177e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
177f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17800 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17810 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17820 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17830 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17840 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
17850 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
17860 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
17870 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17880 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74  te3_destructor_t
17890 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20  ype xDestructor 
178a0 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  = SQLITE_TRANSIE
178b0 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  NT;..  if( objc!
178c0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b  =5 && objc!=6 ){
178d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
178e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
178f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17900 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17910 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17920 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17930 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
17940 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
17950 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17960 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17970 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
17980 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
17990 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20  LITE_STATIC;.   
179a0 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   objv++;.  }..  
179b0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
179c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
179d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
179e0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
179f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17a00 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17a10 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17a20 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17a30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17a40 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
17a50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
17a60 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
17a70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17a80 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
17a90 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17aa0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17ab0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17ac0 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
17ad0 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17ae0 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
17af0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17b00 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17b10 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17b20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17b30 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
17b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17b60 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17b70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17b80 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
17b90 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17ba0 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
17bb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17bc0 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
17bd0 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
17be0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
17bf0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17c00 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17c10 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
17c20 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17c30 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17c40 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17c50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17c60 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17c70 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
17c80 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
17c90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17ca0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17cb0 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17cd0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17ce0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17cf0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17d00 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17d10 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17d20 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
17d30 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
17d40 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
17d50 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
17d60 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
17d70 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
17d80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17d90 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17da0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17db0 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
17dc0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17dd0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
17de0 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17df0 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
17e00 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
17e10 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
17e20 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
17e30 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
17e40 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
17e50 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
17e60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17e70 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
17e80 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
17e90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17ea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17eb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17ec0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17ed0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17ee0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17ef0 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
17f00 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
17f10 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17f20 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17f30 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
17f40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17f50 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
17f60 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17f70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17f80 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
17f90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17fa0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
17fb0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17fc0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
17fd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17fe0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17ff0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18000 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
18010 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
18020 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
18030 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
18040 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
18050 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18060 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18070 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
18080 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
18090 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
180a0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
180b0 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
180c0 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
180d0 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
180e0 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
180f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18100 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
18110 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
18120 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18130 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18140 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18150 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18160 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18170 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18180 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
18190 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
181a0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
181b0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
181c0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
181d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
181e0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
181f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18200 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18210 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18220 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18230 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
18240 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
18250 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
18260 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
18270 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18280 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
18290 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
182a0 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
182b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
182c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
182d0 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
182e0 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
182f0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
18300 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
18310 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ings(.  void * c
18320 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18330 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18340 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18350 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18360 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18370 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
18380 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18390 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
183a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
183b0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
183c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
183d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
183e0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
183f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18400 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18410 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18420 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
18430 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18440 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
18450 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
18460 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
18470 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18480 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18490 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
184a0 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e  sleep MILLISECON
184b0 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DS.*/.static int
184c0 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
184d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
184e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
184f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18500 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18510 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18520 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
18530 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18540 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18550 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
18560 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
18570 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18580 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18590 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
185a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
185b0 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
185c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
185d0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
185e0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
185f0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18600 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
18610 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18620 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18630 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
18640 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
18650 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
18660 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
18670 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18680 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18690 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
186a0 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
186b0 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
186c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
186d0 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  _ex_errcode(.  v
186e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
186f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18700 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18710 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18720 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18730 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18740 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18750 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18760 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18770 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18780 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18790 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
187a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
187b0 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
187c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
187d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
187e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
187f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18800 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18810 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18820 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18830 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
18840 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
18850 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18860 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
18870 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
18880 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18890 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
188a0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
188b0 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
188c0 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
188d0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
188e0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
188f0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
18900 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
18910 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
18920 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
18930 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
18940 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18950 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18960 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18970 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18980 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18990 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
189a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
189b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
189c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
189d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
189e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
189f0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18a00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18a10 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18a20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18a40 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18a50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18a60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18a70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
18a80 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
18a90 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18aa0 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18ab0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18ac0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18ad0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18ae0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18af0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18b00 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
18b10 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18b20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
18b30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18b40 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
18b50 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
18b60 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18b70 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
18b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18b90 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
18ba0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18bb0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18bc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18bd0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18be0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18bf0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18c00 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
18c10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18c20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18c30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18c40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18c50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18c60 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18c70 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
18c80 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
18c90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18ca0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
18cb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18cc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18cd0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18cf0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
18d00 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
18d10 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18d20 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
18d30 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
18d40 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18d50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18d60 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
18d70 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
18d80 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
18d90 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18da0 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
18db0 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
18dc0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
18dd0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18de0 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
18df0 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
18e00 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
18e10 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
18e20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
18e30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
18e40 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
18e50 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
18e60 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
18e70 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
18e80 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
18e90 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18ea0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18eb0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18ec0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18ed0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
18ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
18ef0 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
18f00 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
18f10 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20   *zErr;.  const 
18f20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62  char *z;.  int b
18f30 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
18f40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18f50 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18f60 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18f70 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18f80 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18f90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18fa0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18fb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18fc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18fd0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18fe0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18ff0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
19000 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
19010 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
19020 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
19030 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
19040 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45  rr ){.    z = zE
19050 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65  rr;.    for(byte
19060 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c  s=0; z[bytes] ||
19070 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74   z[bytes+1]; byt
19080 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54  es+=2){}.  }.  T
19090 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
190a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
190b0 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
190c0 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
190d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
190e0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
190f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
19100 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
19110 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
19120 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
19130 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
19140 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
19150 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
19160 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
19170 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
19180 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
19190 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
191a0 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
191b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
191c0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
191d0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
191e0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
191f0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
19200 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
19210 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
19220 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19230 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
19240 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
19250 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19260 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19270 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19280 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19290 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
192a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
192b0 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
192c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
192d0 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
192e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
192f0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
19300 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
19310 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
19320 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
19330 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19340 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19350 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19360 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19370 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19380 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19390 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
193a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
193b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
193c0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
193d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
193e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
193f0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19410 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
19420 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
19430 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19440 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19450 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
19460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19470 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
19480 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
19490 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
194a0 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
194b0 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
194c0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
194d0 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
194e0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
194f0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19500 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19510 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
19520 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
19530 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
19540 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
19550 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61  ytes - (int)(zTa
19560 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
19570 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72      if( (int)str
19580 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
19590 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
195a0 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
195b0 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
195c0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
195d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
195e0 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
195f0 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
19600 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
19610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19620 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
19630 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
19640 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
19650 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
19660 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19670 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
19680 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
19690 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
196a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
196b0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
196c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
196d0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
196e0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
196f0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
19710 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19720 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
19730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
19740 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19750 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
19760 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
19770 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
19780 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
19790 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
197a0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
197b0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
197c0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
197d0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
197e0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
197f0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19800 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19810 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19820 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19830 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19840 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
19850 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
19860 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
19870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19880 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
19890 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
198a0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
198b0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
198c0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
198d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
198e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
198f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19900 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
19910 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19920 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
19930 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19940 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
19950 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
19960 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
19970 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
19980 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19990 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
199a0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
199b0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
199c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
199d0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
199e0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
199f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19a00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19a10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19a20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19a30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19a40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
19a50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
19a60 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
19a70 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
19a80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19a90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
19aa0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
19ab0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19ac0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19ad0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
19ae0 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
19af0 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
19b00 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61  &zTail : 0);.  a
19b10 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
19b20 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
19b30 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
19b40 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
19b50 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
19b60 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
19b70 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
19b80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19b90 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
19ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
19bb0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
19bc0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
19bd0 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
19be0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
19bf0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
19c00 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
19c10 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
19c20 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
19c30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19c40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19c50 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
19c60 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
19c70 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
19c80 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
19c90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19ca0 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
19cb0 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
19cc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19cd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19ce0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
19cf0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
19d00 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
19d10 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
19d20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19d30 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
19d40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19d50 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
19d60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19d80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19d90 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a  _tkt3134 DB.**.*
19da0 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72 65  * Generate a pre
19db0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
19dc0 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20  for a zero-byte 
19dd0 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73 74  string as a test
19de0 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23  .** for ticket #
19df0 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e  3134.  The strin
19e00 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63  g should be prec
19e10 65 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  eeded by a zero 
19e20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
19e30 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19e40 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
19e50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19e60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19e70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19e80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19e90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19ea0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
19eb0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
19ec0 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
19ed0 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
19ee0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19ef0 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19f00 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19f10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19f20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19f30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19f40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19f50 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19f60 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19f70 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
19f80 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
19f90 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
19fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19fb0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19fc0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19fd0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19fe0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19ff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a000 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1a010 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
1a020 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
1a030 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
1a040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1a050 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
1a060 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1a070 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1a080 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1a090 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
1a0a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a0b0 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1a0c0 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
1a0d0 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
1a0e0 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
1a0f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a100 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
1a110 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
1a120 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a130 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1a140 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1a150 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1a160 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1a170 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1a180 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a190 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
1a1a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a1b0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
1a1c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a1e0 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1a1f0 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73  e16 DB sql bytes
1a200 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
1a210 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1a220 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1a230 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1a240 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1a250 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1a260 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1a270 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1a280 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1a290 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1a2a0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1a2b0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1a2c0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1a2d0 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1a2e0 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1a2f0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1a300 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
1a310 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
1a320 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a330 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a340 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1a350 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1a360 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1a370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1a380 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1a390 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1a3a0 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1a3b0 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1a3c0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1a3d0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1a3e0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1a3f0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a400 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1a410 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a430 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1a440 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1a450 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1a460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a470 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1a480 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1a490 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a4a0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a4b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a4c0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a4d0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a4e0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a4f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a500 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a510 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1a520 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a540 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1a550 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1a560 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1a570 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1a580 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1a590 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1a5a0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1a5b0 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1a5c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a5d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a5e0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1a5f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a600 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1a610 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
1a620 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1a630 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a640 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a650 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a660 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a670 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1a680 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a690 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1a6a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a6b0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1a6c0 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1a6d0 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1a6e0 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1a6f0 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1a700 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1a710 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1a720 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1a730 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1a740 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1a750 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1a760 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1a770 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1a780 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1a790 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1a7a0 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1a7b0 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1a7c0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1a7d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1a7e0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1a7f0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a800 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a810 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1a820 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a830 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1a840 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a850 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1a860 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1a870 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1a880 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a890 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a8a0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42  _prepare16_v2 DB
1a8b0 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1a8c0 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
1a8d0 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1a8e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1a8f0 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1a900 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1a910 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a920 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1a930 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1a940 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1a950 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1a960 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1a970 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1a980 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1a990 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1a9a0 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1a9b0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1a9c0 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
1a9d0 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  16_v2(.  void * 
1a9e0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a9f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1aa00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1aa10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1aa20 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1aa30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1aa40 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1aa50 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1aa60 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  zSql;.  const vo
1aa70 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  id *zTail = 0;. 
1aa80 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20   Tcl_Obj *pTail 
1aa90 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1aaa0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1aab0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1aac0 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
1aad0 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20  t bytes;        
1aae0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1aaf0 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64  nteger specified
1ab00 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69   as arg 3 */.  i
1ab10 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20  nt objlen;      
1ab20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ab30 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74  byte-array lengt
1ab40 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20  h of arg 2 */.. 
1ab50 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
1ab60 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
1ab70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ab80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1ab90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1aba0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1abb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1abc0 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1abd0 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c  ytes ?tailvar?",
1abe0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1abf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1ac00 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1ac10 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1ac20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1ac30 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1ac40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1ac50 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
1ac60 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1ac70 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
1ac80 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1ac90 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1aca0 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1acb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1acc0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1acd0 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1ace0 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1acf0 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1ad00 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1ad10 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1ad20 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1ad30 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1ad40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ad50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1ad60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ad70 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
1ad80 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
1ad90 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
1ada0 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
1adb0 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c  int)((u8 *)zTail
1adc0 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20  -(u8 *)zSql);.  
1add0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
1ade0 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  bjlen = 0;.    }
1adf0 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c  .    pTail = Tcl
1ae00 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1ae10 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
1ae20 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49  jlen);.    Tcl_I
1ae30 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
1ae40 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53  l);.    Tcl_ObjS
1ae50 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1ae60 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
1ae70 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
1ae80 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1ae90 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  );.  }..  if( pS
1aea0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1aeb0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1aec0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1aed0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1aee0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aef0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
1af00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1af10 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1af20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1af30 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1af40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1af50 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1af60 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65  e3_open filename
1af70 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a   ?options-list?.
1af80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1af90 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20  st_open(.  void 
1afa0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1afb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1afc0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1afd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1afe0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1aff0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1b000 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1b010 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1b020 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1b030 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26  !=3 && objc!=2 &
1b040 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
1b050 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b060 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1b070 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b080 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1b090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b0a0 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
1b0b0 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
1b0c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1b0d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b0e0 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f  .  zFilename = o
1b0f0 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53  bjc>1 ? Tcl_GetS
1b100 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a  tring(objv[1]) :
1b110 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70   0;.  sqlite3_op
1b120 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
1b130 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1b140 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1b150 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1b160 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1b170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b180 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b190 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1b1a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1b1b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b1c0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  e: sqlite3_open_
1b1d0 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  v2 FILENAME FLAG
1b1e0 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20  S VFS.*/.static 
1b1f0 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32  int test_open_v2
1b200 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b210 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b220 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b230 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b240 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b250 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1b260 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63   *zFilename;.  c
1b270 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
1b280 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1b290 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1b2a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1b2b0 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1b2c0 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c  int nFlag;.  Tcl
1b2d0 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20  _Obj **apFlag;. 
1b2e0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1b2f0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1b300 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1b310 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1b320 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20  "FILENAME FLAGS 
1b330 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  VFS");.    retur
1b340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b350 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
1b360 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b370 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20  v[1]);.  zVfs = 
1b380 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b390 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56  jv[3]);.  if( zV
1b3a0 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56  fs[0]==0x00 ) zV
1b3b0 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  fs = 0;..  rc = 
1b3c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
1b3d0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
1b3e0 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20  bjv[2], &nFlag, 
1b3f0 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20  &apFlag);.  if( 
1b400 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1b410 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  urn rc;.  for(i=
1b420 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29  0; i<nFlag; i++)
1b430 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b  {.    int iFlag;
1b440 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e  .    struct Open
1b450 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e  Flag {.      con
1b460 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a  st char *zFlag;.
1b470 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a        int flag;.
1b480 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20      } aFlag[] = 
1b490 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  {.      { "SQLIT
1b4a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22  E_OPEN_READONLY"
1b4b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1b4c0 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
1b4d0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1b4e0 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54  EADWRITE", SQLIT
1b4f0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b500 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b510 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22  ITE_OPEN_CREATE"
1b520 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
1b530 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  EATE },.      { 
1b540 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  "SQLITE_OPEN_DEL
1b550 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c  ETEONCLOSE", SQL
1b560 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1b570 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20  NCLOSE },.      
1b580 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  { "SQLITE_OPEN_E
1b590 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54  XCLUSIVE", SQLIT
1b5a0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1b5b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b5c0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1b5d0 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  XY", SQLITE_OPEN
1b5e0 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20  _AUTOPROXY },.  
1b5f0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b600 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c  EN_MAIN_DB", SQL
1b610 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1b620 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b630 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1b640 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1b650 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  EMP_DB },.      
1b660 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b670 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51  RANSIENT_DB", SQ
1b680 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1b690 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  ENT_DB },.      
1b6a0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1b6b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  AIN_JOURNAL", SQ
1b6c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1b6d0 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b6e0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b6f0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  EMP_JOURNAL", SQ
1b700 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1b710 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b720 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b730 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  UBJOURNAL", SQLI
1b740 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1b750 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b760 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1b770 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  R_JOURNAL", SQLI
1b780 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1b790 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b7a0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  { "SQLITE_OPEN_N
1b7b0 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  OMUTEX", SQLITE_
1b7c0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a  OPEN_NOMUTEX },.
1b7d0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b7e0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c  OPEN_FULLMUTEX",
1b7f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
1b800 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  LMUTEX },.      
1b810 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b820 48 41 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c  HAREDCACHE", SQL
1b830 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1b840 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b850 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  "SQLITE_OPEN_PRI
1b860 56 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49  VATECACHE", SQLI
1b870 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1b880 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b890 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  "SQLITE_OPEN_WAL
1b8a0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  ", SQLITE_OPEN_W
1b8b0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b8c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c  QLITE_OPEN_URI",
1b8d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
1b8e0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   },.      { 0, 0
1b8f0 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63   }.    };.    rc
1b900 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
1b910 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
1b920 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20  erp, apFlag[i], 
1b930 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46  aFlag, sizeof(aF
1b940 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  lag[0]), .      
1b950 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46    "flag", 0, &iF
1b960 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  lag.    );.    i
1b970 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1b980 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66  return rc;.    f
1b990 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46  lags |= aFlag[iF
1b9a0 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a  lag].flag;.  }..
1b9b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1b9c0 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65  pen_v2(zFilename
1b9d0 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  , &db, flags, zV
1b9e0 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  fs);.  if( sqlit
1b9f0 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1ba00 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1ba10 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
1ba20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1ba30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ba40 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1ba50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ba60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ba70 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20   sqlite3_open16 
1ba80 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1ba90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1baa0 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f  est_open16(.  vo
1bab0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1bac0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1bad0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1bae0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1baf0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1bb00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bb10 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20  T_UTF16.  const 
1bb20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  void *zFilename;
1bb30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1bb40 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1bb50 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1bb60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1bb70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1bb80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1bb90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1bba0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1bbb0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1bbc0 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1bbd0 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1bbe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bbf0 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1bc00 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
1bc10 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1bc20 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c  jv[1], 0);.  sql
1bc30 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c  ite3_open16(zFil
1bc40 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
1bc50 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1bc60 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1bc70 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1bc80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bc90 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1bca0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1bcb0 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1bcc0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1bcd0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1bce0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1bcf0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1bd00 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55  e3_complete16 <U
1bd10 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a  TF-16 string>.**
1bd20 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1bd30 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72 67  the supplied arg
1bd40 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c  ument is a compl
1bd50 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
1bd60 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74  t, or zero.** ot
1bd70 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1bd80 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70  ic int test_comp
1bd90 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  lete16(.  void *
1bda0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bdb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bdc0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bdd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bde0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64  objv[].){.#if !d
1bdf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1be00 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20  IT_COMPLETE) && 
1be10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1be20 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68  OMIT_UTF16).  ch
1be30 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28  ar *zBuf;..  if(
1be40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1be50 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1be60 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1be70 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22  , "<utf-16 sql>"
1be80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1be90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1bea0 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63  zBuf = (char*)Tc
1beb0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1bec0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1bed0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1bee0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1bef0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1bf00 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
1bf10 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f  Buf)));.#endif /
1bf20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
1bf30 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45  MPLETE && SQLITE
1bf40 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1bf50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bf60 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bf70 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d  sqlite3_step STM
1bf80 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  T.**.** Advance 
1bf90 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
1bfa0 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
1bfb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1bfc0 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a  t_step(.  void *
1bfd0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bfe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bff0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c000 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c010 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1c020 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1c030 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1c040 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c050 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c060 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c070 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c080 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c0a0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c  jv[0]), " STMT",
1c0b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c0c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c0d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c0e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c0f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c100 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c120 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1c130 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20  step(pStmt);..  
1c140 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  /* if( rc!=SQLIT
1c150 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51  E_DONE && rc!=SQ
1c160 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72  LITE_ROW ) retur
1c170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a  n TCL_ERROR; */.
1c180 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1c190 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1c1a0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1c1b0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1c1c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1c1d0 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20 20  int test_sql(.  
1c1e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c1f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c200 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c210 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1c220 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1c230 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c240 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1c250 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1c260 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1c270 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1c280 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
1c290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c2a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1c2b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c2c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c2d0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1c2e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c2f0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
1c300 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1c310 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c 28  r *)sqlite3_sql(
1c320 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41  pStmt), TCL_VOLA
1c330 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
1c340 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c350 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c360 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
1c370 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
1c380 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1c390 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
1c3a0 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
1c3b0 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
1c3c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c3d0 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
1c3e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c3f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c400 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c410 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c420 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c430 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c440 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1c450 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c460 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c470 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c480 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c490 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c4a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c4b0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c4c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c4d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c4e0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c4f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c500 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c510 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c530 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1c540 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c550 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1c560 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
1c570 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
1c580 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c590 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c5a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
1c5b0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1c5c0 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
1c5d0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
1c5e0 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1c5f0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1c600 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
1c610 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79  t test_column_ty
1c620 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1c630 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c640 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c650 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c660 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c670 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c680 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1c690 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70  nt col;.  int tp
1c6a0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c6b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c6c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c6d0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c6e0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c6f0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c700 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c710 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1c720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c730 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c740 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c750 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c760 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c770 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c780 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c790 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1c7a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1c7b0 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1c7c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c7d0 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65  ;..  tp = sqlite
1c7e0 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
1c7f0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69  tmt, col);.  swi
1c800 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63  tch( tp ){.    c
1c810 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1c820 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  ER: .      Tcl_S
1c830 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c840 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f   "INTEGER", TCL_
1c850 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1c860 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c870 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20  SQLITE_NULL:.   
1c880 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1c890 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c  (interp, "NULL",
1c8a0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1c8b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c8c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
1c8d0 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
1c8e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c8f0 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54  FLOAT", TCL_STAT
1c900 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c910 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c920 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54  TE_TEXT:.      T
1c930 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c940 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c  erp, "TEXT", TCL
1c950 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1c960 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c970 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
1c980 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1c990 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22  t(interp, "BLOB"
1c9a0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1c9b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c9c0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1c9d0 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
1c9e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c9f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ca00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ca10 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d  int64 STMT colum
1ca20 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1ca30 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1ca40 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1ca50 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1ca60 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65  st as an.** wide
1ca70 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65   (64-bit) intege
1ca80 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1ca90 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
1caa0 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
1cab0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1cac0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1cad0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1cae0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1caf0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1cb00 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1cb10 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56  nt col;.  i64 iV
1cb20 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1cb30 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1cb40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cb50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1cb60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1cb70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1cb80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1cb90 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1cba0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1cbb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cbc0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1cbd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1cbe0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cbf0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1cc00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cc10 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1cc20 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1cc30 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1cc40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1cc50 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71  OR;..  iVal = sq
1cc60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1cc70 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  64(pStmt, col);.
1cc80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1cc90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1cca0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61  ewWideIntObj(iVa
1ccb0 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1ccc0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ccd0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1cce0 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63  lumn_blob STMT c
1ccf0 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
1cd00 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1cd10 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
1cd20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1cd30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1cd40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1cd50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1cd60 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1cd70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1cd80 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74   int col;..  int
1cd90 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   len;.  const vo
1cda0 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66  id *pBlob;..  if
1cdb0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1cdc0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cdd0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1cde0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1cdf0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ce00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ce10 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1ce20 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1ce30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ce40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1ce50 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1ce60 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1ce70 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1ce80 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1ce90 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1cea0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1ceb0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cec0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1ced0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65  TCL_ERROR;..  le
1cee0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
1cef0 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
1cf00 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  col);.  pBlob = 
1cf10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1cf20 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  lob(pStmt, col);
1cf30 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1cf40 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1cf50 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1cf60 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20  pBlob, len));.  
1cf70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1cf80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1cf90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1cfa0 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  uble STMT column
1cfb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cfc0 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1cfd0 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1cfe0 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
1cff0 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  t as a double..*
1d000 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d010 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
1d020 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d030 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d040 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d050 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d060 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d070 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1d080 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1d090 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
1d0a0 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1d0b0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d0c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d0d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d0e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d0f0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d100 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d110 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d120 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d130 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d140 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d150 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d160 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d170 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d190 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d1a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d1b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d1c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d1d0 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
1d1e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1d1f0 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
1d200 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1d210 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1d220 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
1d230 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1d240 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d250 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
1d260 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
1d270 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1d280 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1d290 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
1d2a0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
1d2b0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
1d2c0 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  int test_data_co
1d2d0 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1d2e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d2f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d300 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d310 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d320 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1d330 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1d340 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1d350 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d370 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d380 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d390 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d3a0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d3b0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d3c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d3d0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d3e0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d3f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d400 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d410 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d420 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1d430 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d440 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1d450 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
1d460 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
1d470 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1d480 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d490 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d4a0 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1d4b0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1d4c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d4d0 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1d4e0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d4f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d500 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1d510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d520 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20  est_stmt_utf8(. 
1d530 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d540 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ta,        /* Po
1d550 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1d560 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1d570 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54  be invoke */.  T
1d580 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d590 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d5a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d5b0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d5c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d5d0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f  .  int col;.  co
1d5e0 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e  nst char *(*xFun
1d5f0 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1d600 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20  , int);.  const 
1d610 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78  char *zRet;..  x
1d620 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Func = (const ch
1d630 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f  ar *(*)(sqlite3_
1d640 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1d650 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1d660 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d670 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d680 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d690 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d6a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d6b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d6c0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d6d0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d6e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d6f0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d700 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d720 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d730 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d740 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1d750 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d760 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1d770 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1d780 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20  ERROR;.  zRet = 
1d790 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
1d7a0 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
1d7b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1d7c0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1d7d0 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d   *)zRet, 0);.  }
1d7e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d7f0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1d800 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
1d810 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
1d820 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d830 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d840 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d850 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d860 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1d870 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1d880 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a  CATED.  int rc;.
1d890 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
1d8a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d8b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d8c0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
1d8d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d8e0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1d8f0 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
1d900 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
1d910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1d920 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1d930 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1d940 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
1d950 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d960 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d970 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d980 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d990 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d9a0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1d9b0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1d9c0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d9d0 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
1d9e0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
1d9f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1da00 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
1da10 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1da20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1da30 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1da40 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1da50 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
1da60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1da70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1da80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1da90 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1daa0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1dab0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1dac0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1dad0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
1dae0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
1daf0 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
1db00 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
1db10 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1db20 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  );..  xFunc = (c
1db30 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73  onst void *(*)(s
1db40 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1db50 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1db60 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1db70 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1db80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1db90 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1dba0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1dbb0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1dbc0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1dbd0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1dbe0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1dbf0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1dc00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1dc10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1dc20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1dc30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1dc40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1dc50 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1dc60 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1dc70 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1dc80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1dc90 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63   zName16 = xFunc
1dca0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1dcb0 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20  if( zName16 ){. 
1dcc0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f     int n;.    co
1dcd0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e  nst char *z = zN
1dce0 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e  ame16;.    for(n
1dcf0 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b  =0; z[n] || z[n+
1dd00 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20  1]; n+=2){}.    
1dd10 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pRet = Tcl_NewBy
1dd20 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65  teArrayObj(zName
1dd30 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63  16, n+2);.    Tc
1dd40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1dd50 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
1dd60 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1dd70 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1dd80 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1dd90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1dda0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1ddb0 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d  n_int STMT colum
1ddc0 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1ddd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1dde0 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  tes STMT column.
1ddf0 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1de00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1de10 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  s16 STMT column.
1de20 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1de30 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a   test_stmt_int(.
1de40 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1de50 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ata,    /* Point
1de60 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
1de70 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
1de80 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
1de90 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1dea0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1deb0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1dec0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1ded0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1dee0 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1def0 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1df00 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20  _stmt*, int);.. 
1df10 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a   xFunc = (int (*
1df20 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1df30 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1df40 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1df50 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1df60 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1df70 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1df80 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1df90 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1dfa0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1dfb0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1dfc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1dfd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1dfe0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1dff0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1e000 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1e010 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1e020 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e030 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1e040 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1e050 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1e060 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e070 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1e080 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1e090 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63  _NewIntObj(xFunc
1e0a0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a  (pStmt, col)));.
1e0b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e0c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e0d0 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67    sqlite_set_mag
1e0e0 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55  ic  DB  MAGIC-NU
1e0f0 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  MBER.**.** Set t
1e100 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c  he db->magic val
1e110 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ue.  This is use
1e120 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20  d to test error 
1e130 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a  recovery logic..
1e140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1e150 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a  lite_set_magic(.
1e160 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1e170 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1e180 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e190 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1e1a0 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1e1b0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1e1c0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e1d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e1e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e1f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e200 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
1e210 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22       " DB MAGIC"
1e220 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e240 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1e250 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1e260 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1e270 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1e280 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1e290 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1e2a0 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20  _OPEN")==0 ){.  
1e2b0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1e2c0 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
1e2d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1e2e0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1e2f0 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1e300 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  D")==0 ){.    db
1e310 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1e320 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
1e330 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1e340 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1e350 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d  TE_MAGIC_BUSY")=
1e360 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1e370 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1e380 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  IC_BUSY;.  }else
1e390 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1e3a0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1e3b0 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b  IC_ERROR")==0 ){
1e3c0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e3d0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
1e3e0 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
1e3f0 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
1e400 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e  rp, argv[2], (in
1e410 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29  t*)&db->magic) )
1e420 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1e430 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1e440 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e450 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1e460 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20  lite3_interrupt 
1e470 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67   DB .**.** Trigg
1e480 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  er an interrupt 
1e490 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  on DB.*/.static 
1e4a0 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75  int test_interru
1e4b0 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pt(.  void * cli
1e4c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e4d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e4e0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1e4f0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1e500 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1e510 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1e520 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e530 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e540 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e550 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e560 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1e570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e580 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1e590 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e5a0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1e5b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e5c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  ;.  sqlite3_inte
1e5d0 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74  rrupt(db);.  ret
1e5e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1e5f0 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65  tatic u8 *sqlite
1e600 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1e610 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c   = 0;../*.** Fil
1e620 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68  l the stack with
1e630 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74   a known bitpatt
1e640 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ern..*/.static v
1e650 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f  oid prepStack(vo
1e660 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
1e670 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33 36  u32 bigBuf[65536
1e680 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
1e690 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f 73  sizeof(bigBuf)/s
1e6a0 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d 29  izeof(bigBuf[0])
1e6b0 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d  ; i++) bigBuf[i]
1e6c0 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20   = 0xdeadbeef;. 
1e6d0 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62   sqlite3_stack_b
1e6e0 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26  aseline = (u8*)&
1e6f0 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d  bigBuf[65536];.}
1e700 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1e710 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65  current stack de
1e720 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64  pth.  Used for d
1e730 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
1e740 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61  /.u64 sqlite3Sta
1e750 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20  ckDepth(void){. 
1e760 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20   u8 x;.  return 
1e770 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74  (u64)(sqlite3_st
1e780 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26  ack_baseline - &
1e790 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  x);.}../*.** Usa
1e7a0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ge:  sqlite3_sta
1e7b0 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a  ck_used DB SQL.*
1e7c0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73  *.** Try to meas
1e7d0 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ure the amount o
1e7e0 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73  f stack space us
1e7f0 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
1e800 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a  sqlite3_exec.*/.
1e810 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e820 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f  stack_used(.  vo
1e830 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e840 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e850 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1e860 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1e870 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1e880 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1e890 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1e8a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e8b0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e8c0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e8d0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e8e0 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53   .        " DB S
1e8f0 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
1e900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e910 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1e920 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1e930 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1e940 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e950 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20    prepStack();. 
1e960 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
1e970 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
1e980 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
1e990 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26  (i=65535; i>=0 &
1e9a0 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33  & ((u32*)sqlite3
1e9b0 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29  _stack_baseline)
1e9c0 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66  [-i]==0xdeadbeef
1e9d0 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53  ; i--){}.  Tcl_S
1e9e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e9f0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1ea00 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72  j(i*4));.  retur
1ea10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ea20 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1ea30 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
1ea40 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1ea50 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1ea60 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1ea70 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
1ea80 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1ea90 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
1eaa0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1eab0 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1eac0 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
1ead0 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
1eae0 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
1eaf0 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
1eb00 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1eb10 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1eb20 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
1eb30 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1eb40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1eb50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1eb60 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1eb70 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1eb80 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1eb90 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1eba0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1ebb0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ebc0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1ebd0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1ebe0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1ebf0 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1ec00 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1ec10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ec20 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ec30 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1ec40 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1ec50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ec60 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1ec70 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1ec80 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1ec90 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1eca0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1ecb0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1ecc0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1ecd0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1ece0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1ecf0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ed00 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ed10 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
1ed20 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
1ed30 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1ed40 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
1ed50 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
1ed60 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
1ed70 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1ed80 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
1ed90 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1eda0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1edb0 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
1edc0 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
1edd0 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1ede0 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1edf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1ee00 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
1ee10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ee20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ee30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ee40 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1ee50 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1ee60 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1ee70 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1ee80 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ee90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1eea0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1eeb0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1eec0 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1eed0 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1eee0 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1eef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ef00 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1ef10 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1ef20 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1ef30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ef40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1ef50 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1ef60 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
1ef70 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
1ef80 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1ef90 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1efa0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1efb0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1efc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1efd0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1efe0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1eff0 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
1f000 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1f010 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
1f020 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
1f030 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
1f040 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1f050 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
1f060 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63  ic int get_autoc
1f070 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  ommit(.  void * 
1f080 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f090 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f0a0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1f0b0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1f0c0 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1f0d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f0e0 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1f0f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1f100 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1f110 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1f120 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1f130 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1f140 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1f150 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f160 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1f170 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1f180 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1f190 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f1a0 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1f1b0 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1f1c0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1f1d0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1f1e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1f1f0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1f200 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f210 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1f220 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1f230 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1f240 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1f250 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1f260 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1f270 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1f280 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1f290 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1f2a0 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1f2b0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1f2c0 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1f2d0 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1f2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f2f0 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1f300 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1f310 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f320 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f330 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1f340 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1f350 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1f360 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1f370 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1f380 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f390 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1f3a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1f3b0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1f3c0 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1f3d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f3e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f3f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f400 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f410 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f420 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1f430 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1f440 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1f450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f460 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f470 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1f480 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1f490 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f4a0 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1f4b0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1f4c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f4d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c  *.** Usage:  tcl
1f4e0 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56  _variable_type V
1f4f0 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ARIABLENAME.**.*
1f500 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1f510 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  e of the interna
1f520 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
1f530 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75   for the.** valu
1f540 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76  e of the given v
1f550 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1f560 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61  ic int tcl_varia
1f570 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  ble_type(.  void
1f580 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f590 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f5a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f5b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f5c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1f5d0 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69  l_Obj *pVar;.  i
1f5e0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f5f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f600 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f610 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b  jv, "VARIABLE");
1f620 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f630 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61  ERROR;.  }.  pVa
1f640 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
1f650 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  x(interp, Tcl_Ge
1f660 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f670 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45  , 0, TCL_LEAVE_E
1f680 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70  RR_MSG);.  if( p
1f690 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Var==0 ) return 
1f6a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1f6b0 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29   pVar->typePtr )
1f6c0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1f6d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1f6e0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1f6f0 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
1f700 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
1f710 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f720 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f730 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1f740 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a  _memory ?N?.**.*
1f750 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * Attempt to rel
1f760 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
1f770 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e  ently held but n
1f780 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  ot actually requ
1f790 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74  ired..** The int
1f7a0 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75  eger N is the nu
1f7b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65  mber of bytes we
1f7c0 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1f7d0 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a  elease.  The .**
1f7e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f7f0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
1f800 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72  emory actually r
1f810 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  eleased..*/.stat
1f820 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65  ic int test_rele
1f830 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1f840 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f850 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f860 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f870 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f880 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1f890 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f8a0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1f8b0 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
1f8c0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f8d0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
1f8e0 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
1f8f0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1f900 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f910 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f920 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f930 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1f940 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f950 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1f960 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1f970 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1f980 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1f990 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1f9a0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
1f9b0 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
1f9c0 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
1f9d0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
1f9e0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1f9f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1fa00 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
1fa10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1fa20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1fa30 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1fa40 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1fa50 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
1fa60 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1fa70 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1fa80 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
1fa90 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
1faa0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1fab0 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
1fac0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
1fad0 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
1fae0 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
1faf0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
1fb00 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1fb10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1fb20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1fb30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fb40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fb50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1fb60 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1fb70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1fb80 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1fb90 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1fba0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1fbb0 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1fbc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fbd0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1fbe0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1fbf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fc00 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1fc10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fc20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62   rc = sqlite3_db
1fc30 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1fc40 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
1fc50 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1fc60 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
1fc70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1fc80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1fc90 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
1fca0 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e  _filename DB DBN
1fcb0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1fcc0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
1fcd0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1fce0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a  ith a database..
1fcf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1fd00 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a  st_db_filename(.
1fd10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1fd20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1fd30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fd40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fd50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1fd60 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1fd70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1fd80 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
1fd90 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1fda0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1fdb0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1fdc0 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
1fdd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fde0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1fdf0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1fe00 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1fe10 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1fe20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fe30 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
1fe40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1fe50 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
1fe60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fe70 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  , sqlite3_db_fil
1fe80 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d  ename(db, zDbNam
1fe90 65 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  e), (void*)0);. 
1fea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1feb0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fec0 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
1fed0 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a  only DB DBNAME.*
1fee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72  *.** Return 1 or
1fef0 20 30 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20   0 if DBNAME is 
1ff00 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e  readonly or not.
1ff10 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44    Return -1 if D
1ff20 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f  BNAME does.** no
1ff30 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  t exist..*/.stat
1ff40 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72  ic int test_db_r
1ff50 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  eadonly(.  void 
1ff60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ff70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ff80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ff90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ffa0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1ffb0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1ffc0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
1ffd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1ffe0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1fff0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
20000 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
20010 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
20020 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
20030 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
20040 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
20050 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
20060 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
20070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
20080 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
20090 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
200a0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
200b0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
200c0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
200d0 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c  _db_readonly(db,
200e0 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72   zDbName)));.  r
200f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20100 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20110 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
20120 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a  _limit ?N?.**.**
20130 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
20140 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69  e soft heap limi
20150 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
20160 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a  t thread.  The.*
20170 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20  * limit is only 
20180 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e  changed if the N
20190 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68   is present.  Th
201a0 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74  e previous limit
201b0 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
201c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
201d0 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
201e0 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
201f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
20200 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20210 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20220 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20230 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20240 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63  _int64 amt;.  Tc
20250 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31  l_WideInt N = -1
20260 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
20270 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
20280 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
20290 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
202a0 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20  jv, "?N?");.    
202b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
202c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
202d0 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
202e0 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
202f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
20300 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
20310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20320 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
20330 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
20340 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  t64(N);.  Tcl_Se
20350 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
20360 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
20370 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
20380 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20390 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
203a0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
203b0 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
203c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
203d0 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
203e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
203f0 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
20400 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  up(.  void * cli
20410 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20420 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20430 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
20440 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20450 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
20460 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
20470 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74  ATED.  sqlite3_t
20480 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b  hread_cleanup();
20490 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
204a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
204b0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
204c0 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
204d0 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ts  DB.**.** Ret
204e0 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75  urn a list of nu
204f0 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
20500 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e  the PagerRefcoun
20510 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67  t for all.** pag
20520 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61  ers on each data
20530 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
20540 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
20550 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
20560 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nts(.  void * cl
20570 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
20580 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20590 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
205a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
205b0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
205c0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
205d0 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63   int v, *a;.  Tc
205e0 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
205f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
20600 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20610 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20620 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20630 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
20640 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
20650 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
20660 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
20670 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20680 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20690 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
206a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
206b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
206c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
206d0 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c  _ERROR;.  pResul
206e0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
206f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
20700 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20710 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
20720 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pBt==0 ){.     
20730 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   v = -1;.    }el
20740 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
20750 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
20760 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
20770 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
20780 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 72  Stats(sqlite3Btr
20790 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
207a0 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20  i].pBt));.      
207b0 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  v = a[0];.      
207c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
207d0 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
207e0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
207f0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20800 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54  nt(0, pResult, T
20810 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
20820 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
20830 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20840 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74   pResult);.  ret
20850 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
20860 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
20870 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
20880 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c  t.**.** Some TCL
20890 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67   builds (ex: cyg
208a0 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70  win) do not supp
208b0 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ort 64-bit integ
208c0 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65  ers.  This.** le
208d0 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20  ads to a number 
208e0 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  of test failures
208f0 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63  .  The present c
20900 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68  ommand checks th
20910 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74  e.** TCL build t
20920 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
20930 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73   not it supports
20940 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
20950 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  .  It.** returns
20960 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73   TRUE if it does
20970 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
20980 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  t..**.** This co
20990 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
209a0 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74   warn users that
209b0 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64   their TCL build
209c0 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a   is defective.**
209d0 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72   and that the er
209e0 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65  rors they are se
209f0 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74  eing in the test
20a00 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62   scripts might b
20a10 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66  e.** a result of
20a20 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65   their defective
20a30 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e   TCL rather than
20a40 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c   problems in SQL
20a50 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ite..*/.static i
20a60 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  nt working_64bit
20a70 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  _int(.  ClientDa
20a80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
20a90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
20aa0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
20ab0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
20ac0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20ad0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
20ae0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
20af0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
20b00 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
20b10 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
20b20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
20b30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
20b40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20b50 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
20b60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
20b70 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74    Tcl_Obj *pTest
20b80 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69  Obj;.  int worki
20b90 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74  ng = 0;..  pTest
20ba0 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Obj = Tcl_NewWid
20bb0 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a  eIntObj(1000000*
20bc0 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29  (i64)1234567890)
20bd0 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74  ;.  working = st
20be0 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
20bf0 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31  ng(pTestObj), "1
20c00 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22  234567890000000"
20c10 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72  )==0;.  Tcl_Decr
20c20 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62  RefCount(pTestOb
20c30 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  j);.  Tcl_SetObj
20c40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20c50 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
20c60 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65  (working));.  re
20c70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20c80 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
20c90 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
20ca0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
20cb0 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74  command unregist
20cc0 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20  ers the primary 
20cd0 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67  VFS and then reg
20ce0 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63  isters.** it bac
20cf0 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69  k again.  This i
20d00 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
20d10 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
20d20 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20  gister a.** VFS 
20d30 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72  when none are pr
20d40 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
20d50 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69  red, and the abi
20d60 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65  lity to .** unre
20d70 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20  gister the only 
20d80 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20  available VFS.  
20d90 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a  Ticket #2738.*/.
20da0 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
20db0 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c  nlink_test(.  Cl
20dc0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
20dd0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
20de0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
20df0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
20e00 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
20e10 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
20e20 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
20e30 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20e40 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20e50 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
20e60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e70 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
20e80 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
20e90 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
20ea0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
20eb0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
20ec0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d   sqlite3_vfs *pM
20ed0 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ain;.  sqlite3_v
20ee0 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20  fs *apVfs[20];. 
20ef0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
20f00 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  , two;..  sqlite
20f10 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
20f20 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69  (0);   /* Unregi
20f30 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20  ster of NULL is 
20f40 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e  harmless */.  on
20f50 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
20f60 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d  ";.  two.zName =
20f70 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20   "__two";..  /* 
20f80 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
20f90 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
20fa0 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f  h 2nd argument o
20fb0 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  f 0 does not.  *
20fc0 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 66  * change the def
20fd0 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20  ault VFS.  */.  
20fe0 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pMain = sqlite3_
20ff0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73  vfs_find(0);.  s
21000 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21010 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20  ter(&one, 0);.  
21020 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
21030 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
21040 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
21050 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
21060 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30  register(&two, 0
21070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
21080 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
21090 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
210a0 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  (0) );..  /* We 
210b0 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62  can find a VFS b
210c0 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  y its name */.  
210d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
210e0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
210f0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
21100 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21110 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21120 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  &two );..  /* Ca
21130 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73  lling sqlite_vfs
21140 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 6e  _register with n
21150 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70  on-zero second p
21160 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73  arameter changes
21170 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
21180 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74  t VFS, even if t
21190 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65 72  he 1st parameter
211a0 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20 56   is an existig V
211b0 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  FS that is.  ** 
211c0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
211d0 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e  tered as the non
211e0 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20  -default..  */. 
211f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21200 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
21210 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21220 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
21230 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
21240 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21250 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
21260 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
21270 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21280 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b  find(0)==&one );
21290 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
212a0 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29  egister(&two, 1)
212b0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
212c0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
212d0 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
212e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
212f0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
21300 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
21310 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21320 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20  s_find(0)==&two 
21330 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29  );.  if( pMain )
21340 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
21350 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
21360 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
21370 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21380 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
21390 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
213a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
213b0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
213c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
213d0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
213e0 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
213f0 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  }.  .  /* Unlink
21400 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
21410 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
21420 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
21430 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67  e VFSes.  ** reg
21440 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  istered..  */.  
21450 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
21460 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
21470 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  apVfs[0]); i++){
21480 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
21490 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
214a0 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
214b0 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61  fs[i] ){.      a
214c0 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
214d0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
214e0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
214f0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
21500 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21510 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
21520 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
21530 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21540 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
21550 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
21560 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
21570 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
21580 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74  ;.  .  /* Regist
21590 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
215a0 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28  as non-default (
215b0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66  will be made def
215c0 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a  ault, since.  **
215d0 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e   it'll be the on
215e0 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65  ly one in existe
215f0 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  nce)..  */.  sql
21600 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21610 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61  r(pMain, 0);.  a
21620 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21630 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
21640 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d  n );.  .  /* Un-
21650 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  register the mai
21660 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72  n VFS again to r
21670 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20  estore an empty 
21680 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  VFS list */.  sq
21690 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
216a0 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61  ster(pMain);.  a
216b0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
216c0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
216d0 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c  ..  /* Relink al
216e0 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65 72  l VFSes in rever
216f0 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20  se order. */  . 
21700 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70   for(i=sizeof(ap
21710 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
21720 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  s[0])-1; i>=0; i
21730 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56  --){.    if( apV
21740 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  fs[i] ){.      s
21750 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21760 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29  ter(apVfs[i], 1)
21770 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21780 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
21790 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
217a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
217b0 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
217c0 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
217d0 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
217e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
217f0 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d  register out sam
21800 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20  ple VFSes. */.  
21810 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21820 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
21830 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21840 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20  gister(&two);.. 
21850 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e   /* Unregisterin
21860 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73 20  g a VFS that is 
21870 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
21880 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72 6d  gistered is harm
21890 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  less */.  sqlite
218a0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
218b0 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
218c0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
218d0 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74  (&two);.  assert
218e0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
218f0 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29  nd("__one")==0 )
21900 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21910 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21920 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  two")==0 );..  /
21930 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c  * We should be l
21940 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  eft with the ori
21950 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46  ginal default VF
21960 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20  S back as the.  
21970 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20  ** original */. 
21980 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21990 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
219a0 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ain );..  return
219b0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
219c0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
219d0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a  initfail_test.**
219e0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
219f0 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f  mand attempts to
21a00 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66   vfs_find and vf
21a10 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s_register when 
21a20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  the.** sqlite3_i
21a30 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65  nitialize() inte
21a40 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67  rface is failing
21a50 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f  .  All calls sho
21a60 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61  uld fail..*/.sta
21a70 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74  tic int vfs_init
21a80 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  fail_test(.  Cli
21a90 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21aa0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
21ab0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
21ac0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
21ad0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21ae0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21af0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21b00 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21b10 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21b20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21b30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21b40 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21b50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21b60 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21b70 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21b80 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
21b90 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e  fs one;.  one.zN
21ba0 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a  ame = "__one";..
21bb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
21bc0 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
21bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21be0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21bf0 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
21c00 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
21c10 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
21c20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
21c30 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21c40 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
21c50 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
21c60 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
21c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
21c80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21c90 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65  /*.** Saved VFSe
21ca0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  s.*/.static sqli
21cb0 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
21cc0 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  0];.static int n
21cd0 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Vfs = 0;../*.** 
21ce0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
21cf0 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
21d00 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c  ** Unregister al
21d10 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  l VFSes..*/.stat
21d20 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67  ic int vfs_unreg
21d30 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
21d40 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21d50 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
21d60 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
21d70 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
21d80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21d90 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21da0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21db0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21dc0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21dd0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21de0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21df0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21e00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21e10 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21e20 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21e30 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
21e40 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
21e50 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b  Size(apVfs); i++
21e60 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
21e70 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21e80 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
21e90 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65  pVfs[i]==0 ) bre
21ea0 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ak;.    sqlite3_
21eb0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
21ec0 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pVfs[i]);.  }.  
21ed0 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75  nVfs = i;.  retu
21ee0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
21ef0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
21f00 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _reregister_all.
21f10 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c  **.** Restore al
21f20 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65 72  l VFSes that wer
21f30 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20  e removed using 
21f40 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21f50 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ll.*/.static int
21f60 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
21f70 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
21f80 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21f90 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21fa0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21fb0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21fc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21fd0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21fe0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21ff0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22000 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22010 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22020 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22030 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22040 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22050 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22060 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22070 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
22080 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b  0; i<nVfs; i++){
22090 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
220a0 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  _register(apVfs[
220b0 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
220c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
220d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
220e0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
220f0 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
22100 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
22110 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
22120 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
22130 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
22140 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
22150 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
22160 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
22170 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
22180 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
22190 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
221a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
221b0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
221c0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
221d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
221e0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
221f0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
22200 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
22210 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
22220 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
22230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22240 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
22250 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
22260 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
22270 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
22280 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30  {.  int iArg = 0
22290 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
222a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
222b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
222c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
222d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
222e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
222f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
22300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
22310 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
22320 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
22330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22340 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22350 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22360 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22370 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
22380 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22390 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
223a0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
223b0 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b  b, 0, 0, &iArg);
223c0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
223d0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
223e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
223f0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22400 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22  , "notadatabase"
22410 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  , SQLITE_FCNTL_L
22420 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29  OCKSTATE, &iArg)
22430 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22440 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
22450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22460 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
22470 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72  "main", -1, &iAr
22480 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
22490 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
224a0 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  D );.  rc = sqli
224b0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
224c0 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c  (db, "temp", -1,
224d0 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
224e0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
224f0 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51  TFOUND || rc==SQ
22500 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
22510 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22520 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
22530 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
22540 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20  _lasterrno_test 
22550 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
22560 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
22570 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
22580 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
22590 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
225a0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
225b0 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
225c0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72  E_LAST_ERRNO ver
225d0 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
225e0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
225f0 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20  sterrno_test(.  
22600 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22610 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
22620 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
22630 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
22640 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
22650 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
22660 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
22670 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
22680 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
22690 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
226a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
226b0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
226c0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
226d0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
226e0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
226f0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
22700 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
22710 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
22720 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
22730 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22740 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22750 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
22760 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
22770 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
22780 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
22790 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
227a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
227b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
227c0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
227d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
227e0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
227f0 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
22800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22810 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
22820 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22830 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c  , NULL, SQLITE_L
22840 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67  AST_ERRNO, &iArg
22850 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
22860 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
22870 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
22880 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
22890 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
228a0 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69  _ERROR; .  }.  i
228b0 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20  f( iArg!=0 ) {. 
228c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
228d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65  ult(interp, "Une
228e0 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f  xpected non-zero
228f0 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20   errno: ",.     
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
22920 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f  mObj(Tcl_NewIntO
22930 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20  bj(iArg), 0), " 
22940 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
22950 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22960 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22970 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
22980 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
22990 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
229a0 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
229b0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
229c0 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
229d0 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
229e0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
229f0 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
22a00 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
22a10 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
22a20 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
22a30 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
22a40 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
22a50 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
22a60 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
22a70 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
22a80 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22a90 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22aa0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22ab0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22ac0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22ad0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22ae0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22af0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22b00 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22b10 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22b20 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22b30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22b40 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22b50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22b60 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22b70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22b80 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
22b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ba0 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69   /* New chunk si
22bb0 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
22bc0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22bd0 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
22be0 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
22bf0 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
22c00 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22c20 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
22c30 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
22c60 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
22c70 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
22c80 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
22c90 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
22ca0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
22cb0 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
22cc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22cd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22ce0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22cf0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22d00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22d10 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
22d20 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
22d30 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
22d40 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
22d50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22d60 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
22d70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
22d80 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
22d90 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
22da0 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
22db0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22dc0 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
22dd0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
22de0 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  ZE, (void *)&nSi
22df0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
22e00 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
22e10 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
22e20 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
22e30 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22e40 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
22e50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22e60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22e70 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22e80 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
22e90 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20  izehint_test DB 
22ea0 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a  DBNAME SIZE.**.*
22eb0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
22ec0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
22ed0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22ee0 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77   interface .** w
22ef0 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ith SQLITE_FCNTL
22f00 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74  _SIZE_HINT.*/.st
22f10 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
22f20 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
22f30 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22f40 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22f50 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22f60 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22f70 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22f80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22f90 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22fa0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22fb0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22fc0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22fd0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22fe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22ff0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
23000 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
23010 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
23020 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
23030 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
23040 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
23050 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
23060 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
23070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23080 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
23090 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
230a0 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
230b0 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
230c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
230d0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
230e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
23110 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
23120 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
23130 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
23140 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
23150 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
23160 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
23170 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23180 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
23190 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
231a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
231b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
231c0 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
231d0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
231e0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
231f0 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
23200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23210 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
23220 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23230 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
23240 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
23250 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
23260 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23270 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
23280 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
23290 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
232a0 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
232b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
232c0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
232d0 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
232e0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
232f0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
23300 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23310 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
23320 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
23330 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
23340 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
23350 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
23360 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
23370 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
23380 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
23390 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
233a0 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
233b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
233c0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
233d0 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
233e0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
233f0 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
23400 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23410 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
23420 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  y_test(.  Client
23430 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23440 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23450 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
23460 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
23470 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23480 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23490 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
234a0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
234b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
234c0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
234d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
234e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
234f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23500 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23510 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23520 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
23530 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
23540 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
23550 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23560 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
23570 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23590 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
235a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
235b0 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57 44 22  ], 0), " DB PWD"
235c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
235d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
235e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
235f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
23600 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23610 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65  ), &db) ){.   re
23620 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23630 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69    }.  .#if !defi
23640 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
23650 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29  E_LOCKING_STYLE)
23660 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f  .#  if defined(_
23670 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64  _APPLE__).#    d
23680 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
23690 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
236a0 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  E 1.#  else.#   
236b0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
236c0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
236d0 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  YLE 0.#  endif.#
236e0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
236f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23700 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
23710 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a  (__APPLE__).  {.
23720 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50 61      char *testPa
23730 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  th;.    int rc;.
23740 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20      int nPwd;.  
23750 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
23760 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  wd;.    char pro
23770 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
23780 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c   .    zPwd = Tcl
23790 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
237a0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64  j(objv[2], &nPwd
237b0 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f  );.    if( sizeo
237c0 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77  f(proxyPath)<nPw
237d0 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63  d+20 ){.      Tc
237e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
237f0 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20  nterp, "PWD too 
23800 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  big", (void*)0);
23810 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23820 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
23830 20 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79     sprintf(proxy
23840 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70  Path, "%s/test.p
23850 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20  roxy", zPwd);.  
23860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
23870 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
23880 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54  NULL, SQLITE_SET
23890 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
238a0 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
238b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
238c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
238d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
238e0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
238f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23900 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23910 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23920 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23930 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  LL, SQLITE_GET_L
23940 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74  OCKPROXYFILE, &t
23950 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66  estPath);.    if
23960 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50  ( strncmp(proxyP
23970 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29  ath,testPath,11)
23980 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
23990 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
239a0 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66  p, "Lock proxy f
239b0 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63  ile did not matc
239c0 68 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20  h the ".        
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239e0 20 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73         "previous
239f0 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75  ly assigned valu
23a00 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
23a10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23a20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23a30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
23a40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23a50 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23a60 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
23a70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23a80 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
23a90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23aa0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
23ab0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23ac0 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
23ad0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
23ae0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
23af0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23b00 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
23b10 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23b20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
23b30 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
23b40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
23b50 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
23b60 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
23b70 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
23b80 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
23b90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
23ba0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
23bb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23bc0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23bd0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
23be0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
23bf0 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
23c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23c10 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
23c20 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
23c30 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23c40 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23c50 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
23c60 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
23c70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23c80 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23c90 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23ca0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23cb0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23cc0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23cd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23ce0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23cf0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23d00 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23d10 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23d20 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23d30 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23d40 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
23d50 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
23d60 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
23d70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
23d80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
23d90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
23da0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
23db0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23dc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
23dd0 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
23de0 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
23df0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23e00 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23e10 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23e20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23e30 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
23e40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23e50 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
23e60 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
23e70 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
23e80 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
23e90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
23ea0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23eb0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23ec0 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
23ed0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23ee0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23ef0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23f00 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
23f10 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
23f20 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
23f30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23f40 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
23f50 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
23f60 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
23f70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23f80 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
23f90 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23fa0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
23fb0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23fc0 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
23fd0 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c  al DB PERSIST-FL
23fe0 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
23ff0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
24000 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
24010 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
24020 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
24030 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
24040 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a  ST_WAL opcode..*
24050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
24060 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
24070 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44  t_wal(.  ClientD
24080 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24090 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
240a0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
240b0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
240c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
240d0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
240e0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
240f0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
24100 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
24110 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
24120 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24130 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24140 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24150 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24160 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24170 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24180 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
24190 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72  bPersist;.  char
241a0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
241b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
241c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
241d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
241e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
241f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24200 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24210 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24220 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a  " DB FLAG", 0);.
24230 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24240 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
24250 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
24260 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
24270 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
24280 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
24290 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
242a0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
242b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
242c0 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73  bjv[2], &bPersis
242d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
242e0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
242f0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24300 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
24310 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
24320 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62  T_WAL, (void*)&b
24330 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69  Persist);.  sqli
24340 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
24350 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
24360 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74  d", rc, bPersist
24370 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
24380 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
24390 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
243a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
243b0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
243c0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
243d0 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
243e0 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a  te DB PSOW-FLAG.
243f0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
24400 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
24410 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24420 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
24430 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
24440 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
24450 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f  E_OVERWRITE opco
24460 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
24470 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
24480 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
24490 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
244a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
244b0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
244c0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
244d0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
244e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
244f0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24500 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24510 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24520 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24530 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24540 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24550 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24560 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24570 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24580 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24590 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
245a0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a  nt rc;.  int b;.
245b0 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a    char z[100];..
245c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
245d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
245e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
245f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
24600 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
24610 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
24620 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
24630 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22  , 0), " DB FLAG"
24640 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24650 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24660 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24670 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
24680 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24690 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
246a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
246b0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
246c0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
246d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
246e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
246f0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24700 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24710 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45  l(db,NULL,SQLITE
24720 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
24730 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64  _OVERWRITE,(void
24740 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)&b);.  sqlite3
24750 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
24760 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c  (z), z, "%d %d",
24770 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41   rc, b);.  Tcl_A
24780 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24790 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
247a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
247b0 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
247c0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
247d0 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42  ntrol_vfsname DB
247e0 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
247f0 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
24800 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
24810 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73  e stack of VFSes
24820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24830 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
24840 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
24850 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
24860 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
24870 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
24880 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24890 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
248a0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
248b0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
248c0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
248d0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
248e0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
248f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24900 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24910 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24920 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24930 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24940 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24960 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
24970 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20   char *zVfsName 
24980 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
24990 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
249a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
249b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
249c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
249d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
249e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
249f0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24a00 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24a10 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
24a20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24a30 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24a40 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24a50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24a60 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
24a70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24a80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24a90 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
24aa0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
24ab0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24ac0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
24ad0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24ae0 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
24af0 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f  CNTL_VFSNAME,(vo
24b00 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  id*)&zVfsName);.
24b10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24b20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e  lt(interp, zVfsN
24b30 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
24b40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24b50 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  VfsName);.  retu
24b60 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
24b70 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
24b80 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
24b90 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55  pfilename DB ?AU
24ba0 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  XDB?.**.** Retur
24bb0 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
24bc0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
24bd0 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  ilename.*/.stati
24be0 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
24bf0 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28  ol_tempfilename(
24c00 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24c10 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24c20 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
24c30 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
24c40 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
24c50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
24c60 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
24c70 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
24c80 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24c90 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24cb0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24cc0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24cd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24ce0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24cf0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24d00 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
24d10 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
24d20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72  = "main";.  char
24d30 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20   *zTName = 0;.. 
24d40 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
24d50 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
24d60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24d70 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
24d80 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24d90 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24da0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24db0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24dc0 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30  " DB ?AUXDB?", 0
24dd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24de0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24df0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24e00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24e10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24e20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
24e30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24e40 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
24e50 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  ){.    zDbName =
24e60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24e70 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73  bjv[2]);.  }.  s
24e80 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24e90 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c  rol(db, zDbName,
24ea0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
24eb0 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69  MPFILENAME, (voi
24ec0 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54  d*)&zTName);.  T
24ed0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24ee0 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20  interp, zTName, 
24ef0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c  (char*)0);.  sql
24f00 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65  ite3_free(zTName
24f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24f20 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
24f30 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
24f40 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a  3_vfs_list.**.**
24f50 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20     Return a tcl 
24f60 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
24f70 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
24f80 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27   registered vfs'
24f90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24fa0 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69   vfs_list(.  Cli
24fb0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24fc0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24fd0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24fe0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24ff0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25000 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
25010 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
25020 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
25030 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
25040 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
25050 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25060 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
25070 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
25080 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
25090 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
250a0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
250b0 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f  fs *pVfs;.  Tcl_
250c0 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
250d0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20  NewObj();.  if( 
250e0 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
250f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
25100 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
25110 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
25120 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25130 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74    for(pVfs=sqlit
25140 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20  e3_vfs_find(0); 
25150 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d  pVfs; pVfs=pVfs-
25160 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c  >pNext){.    Tcl
25170 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
25180 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
25190 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
251a0 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  gObj(pVfs->zName
251b0 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63  , -1));.  }.  Tc
251c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
251d0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
251e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
251f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25200 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  :   sqlite3_limi
25210 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a  t DB ID VALUE.**
25220 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
25230 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
25240 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65  lite3_limit inte
25250 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
25260 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
25270 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
25280 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
25290 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20  nt test_limit(. 
252a0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
252b0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
252c0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
252d0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
252e0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
252f0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25300 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25310 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25320 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25330 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25350 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25360 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25370 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25380 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25390 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
253a0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
253b0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
253c0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
253d0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
253e0 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64   int id;.  } aId
253f0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
25400 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
25410 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
25420 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
25430 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
25440 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
25450 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
25460 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  NGTH",          
25470 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
25480 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
25490 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
254a0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22  TE_LIMIT_COLUMN"
254b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
254c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
254d0 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
254e0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
254f0 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
25500 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
25510 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
25520 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
25530 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25540 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
25550 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c  SELECT",     SQL
25560 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
25570 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d  ND_SELECT      }
25580 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25590 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20  LIMIT_VDBE_OP", 
255a0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
255b0 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
255d0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
255e0 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
255f0 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  G",        SQLIT
25600 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
25610 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a  _ARG         },.
25620 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25630 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20  MIT_ATTACHED",  
25640 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
25650 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
25660 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
25670 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
25680 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
25690 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f  LENGTH", SQLITE_
256a0 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
256b0 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20  RN_LENGTH  },.  
256c0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
256d0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
256e0 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  R",     SQLITE_L
256f0 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
25700 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20  MBER      },.   
25710 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25720 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c  _TRIGGER_DEPTH",
25730 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
25740 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
25750 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  H        },.    
25760 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72  .    /* Out of r
25770 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20  ange test cases 
25780 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  */.    { "SQLITE
25790 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22  _LIMIT_TOOSMALL"
257a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
257d0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
257e0 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20  LIMIT_TOOBIG",  
257f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25800 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
25810 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20 7d 2c  _DEPTH+1      },
25820 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69  .  };.  int i, i
25830 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  d;.  int val;.  
25840 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
25850 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
25860 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
25870 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
25880 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
25890 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
258a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
258b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
258c0 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20  0], 0), " DB ID 
258d0 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
258e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
258f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
25900 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25910 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25920 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
25930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25940 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65  ;.  zId = Tcl_Ge
25950 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
25960 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
25970 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
25980 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  f(aId[0]); i++){
25990 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
259a0 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d  zId, aId[i].zNam
259b0 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
259c0 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20  d = aId[i].id;. 
259d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
259e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
259f0 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
25a00 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20  f(aId[0]) ){.   
25a10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25a20 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
25a30 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22  wn limit type: "
25a40 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29  , zId, (char*)0)
25a50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
25a60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
25a70 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
25a80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
25a90 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
25aa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25ab0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69   rc = sqlite3_li
25ac0 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29  mit(db, id, val)
25ad0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
25ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
25af0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
25b00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25b10 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
25b20 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f  cmd:  save_prng_
25b30 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65  state.**.** Save
25b40 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
25b50 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  e pseudo-random 
25b60 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
25b70 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65  ..** At the same
25b80 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68   time, verify th
25b90 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  at sqlite3_test_
25ba0 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76  control works ev
25bb0 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65  en when.** calle
25bc0 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  d with an out-of
25bd0 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a  -range opcode..*
25be0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
25bf0 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
25c00 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25c10 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25c20 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25c30 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25c40 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25c50 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25c60 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25c70 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25c80 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
25c90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
25ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25cb0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25cc0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25cd0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25ce0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25cf0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
25d00 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
25d10 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20  control(9999);. 
25d20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
25d30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
25d40 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31  _test_control(-1
25d50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
25d60 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
25d70 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
25d80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
25d90 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72  G_SAVE);.  retur
25da0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
25db0 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f  * tclcmd:  resto
25dc0 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f  re_prng_state.*/
25dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74  .static int rest
25de0 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ore_prng_state(.
25df0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25e00 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25e10 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25e20 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25e30 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25e40 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25e50 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25e60 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25e70 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25e80 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25ea0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25eb0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25ec0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25ed0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25ee0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25ef0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
25f00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
25f10 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a  _PRNG_RESTORE);.
25f20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25f30 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25f40 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
25f50 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
25f60 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
25f70 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25f80 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25f90 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25fa0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25fb0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25fc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25fd0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25fe0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25ff0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
26000 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
26010 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26020 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
26030 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
26040 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
26050 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
26060 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
26070 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
26080 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
26090 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b  TRL_PRNG_RESET);
260a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
260b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
260c0 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79  d:  database_may
260d0 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  _be_corrupt.**.*
260e0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
260f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
26100 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e  ight be corrupt.
26110 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
26120 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c  , set the normal
26130 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65  .** state of ope
26140 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
26150 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6d  c int database_m
26160 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a 20  ay_be_corrupt(. 
26170 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26180 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26190 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
261a0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
261b0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
261c0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
261d0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
261e0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
261f0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26200 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26220 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26230 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26240 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
26250 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26260 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26270 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
26280 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
26290 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 30  NEVER_CORRUPT, 0
262a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
262b0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
262c0 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e 65  md:  database_ne
262d0 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  ver_corrupt.**.*
262e0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
262f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
26300 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 66  re always well-f
26310 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e 61  ormed.  This ena
26320 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65 72  bles extra asser
26330 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
26340 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e 64  s that test cond
26350 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
26360 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72 20  always true for 
26370 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
26380 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bases..*/.static
26390 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e 65   int database_ne
263a0 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20 43  ver_corrupt(.  C
263b0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
263c0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
263d0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
263e0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
263f0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26400 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26410 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26420 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26430 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26440 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26450 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26460 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
26470 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
26480 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26490 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
264a0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
264b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
264c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
264d0 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29 3b  VER_CORRUPT, 1);
264e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
264f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
26500 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73  d:  pcache_stats
26510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
26520 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
26530 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26540 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26550 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26560 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26570 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
26580 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26590 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
265a0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
265b0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
265c0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265e0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
265f0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26600 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26610 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26620 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
26630 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d  t nMin;.  int nM
26640 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65  ax;.  int nCurre
26650 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63  nt;.  int nRecyc
26660 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a  lable;.  Tcl_Obj
26670 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74   *pRet;..  sqlit
26680 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e  e3PcacheStats(&n
26690 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20  Current, &nMax, 
266a0 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61  &nMin, &nRecycla
266b0 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20  ble);..  pRet = 
266c0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
266d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
266e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
266f0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
26700 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74  ringObj("current
26710 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26720 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26730 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26740 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
26750 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63  nCurrent));.  Tc
26760 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
26770 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
26780 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
26790 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29  ngObj("max", -1)
267a0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
267b0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
267c0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
267d0 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29  NewIntObj(nMax))
267e0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
267f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26800 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26810 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e  ewStringObj("min
26820 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26830 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26840 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26850 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
26860 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMin));.  Tcl_Li
26870 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26880 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26890 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
268a0 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20  j("recyclable", 
268b0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
268c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
268d0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
268e0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65  cl_NewIntObj(nRe
268f0 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54  cyclable));..  T
26900 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
26910 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
26920 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26930 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
26940 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
26950 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
26960 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  id test_unlock_n
26970 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a  otify_cb(void **
26980 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  aArg, int nArg){
26990 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
269a0 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20  (ii=0; ii<nArg; 
269b0 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45  ii++){.    Tcl_E
269c0 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72  valEx((Tcl_Inter
269d0 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75  p *)aArg[ii], "u
269e0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d  nlock_notify", -
269f0 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
26a00 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
26a10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26a20 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
26a30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   */../*.** tclcm
26a40 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  d:  sqlite3_unlo
26a50 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a  ck_notify db.*/.
26a60 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
26a70 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
26a80 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  FY.static int te
26a90 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
26aa0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26ab0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
26ac0 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
26ad0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26ae0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26af0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26b00 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26b10 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b30 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26b40 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26b50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26b60 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26b70 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26b80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
26b90 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
26ba0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
26bb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
26bc0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
26bd0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
26be0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
26bf0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26c00 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26c10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26c20 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
26c30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26c40 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
26c50 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
26c60 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  (db, test_unlock
26c70 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69  _notify_cb, (voi
26c80 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54  d *)interp);.  T
26c90 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26ca0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
26cb0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26cc0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26cd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
26ce0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ndif../*.** tclc
26cf0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
26d00 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f  _checkpoint db ?
26d10 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME?.*/.static 
26d20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
26d30 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
26d40 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26d50 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
26d60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26d70 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26d80 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26d90 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26da0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26db0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26dc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26dd0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26de0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26df0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26e00 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26e10 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
26e20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
26e30 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
26e40 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
26e50 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
26e60 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
26e70 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
26e80 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  "DB ?NAME?");.  
26e90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26ea0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
26eb0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26ec0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26ed0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26f00 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
26f10 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
26f20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
26f30 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
26f40 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
26f50 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54  nt(db, zDb);.  T
26f60 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26f70 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
26f80 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26f90 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26fa0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
26fb0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
26fc0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
26fd0 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20  oint_v2 db MODE 
26fe0 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  ?NAME?.**.** Thi
26ff0 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20  s command calls 
27000 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
27010 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  nt_v2() function
27020 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
27030 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75  ied.** mode argu
27040 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66  ment (passive, f
27050 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e  ull or restart).
27060 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65   If present, the
27070 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
27080 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64  * NAME is passed
27090 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
270a0 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63  rgument to wal_c
270b0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20  heckpoint_v2(). 
270c0 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d  If it the.** NAM
270d0 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  E argument is no
270e0 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c  t present, a NUL
270f0 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73  L pointer is pas
27100 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
27110 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70  ** If wal_checkp
27120 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e  oint_v2() return
27130 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
27140 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
27150 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  SY or.** SQLITE_
27160 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  OK, then this co
27170 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43  mmand returns TC
27180 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c  L_ERROR. The Tcl
27190 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a   result is set.*
271a0 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  * to the error m
271b0 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20  essage obtained 
271c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
271d0 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  msg()..**.** Oth
271e0 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d  erwise, this com
271f0 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c  mand returns a l
27200 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74  ist of three int
27210 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
27220 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31   integer.** is 1
27230 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
27240 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72  was returned, or
27250 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68   0 otherwise. Th
27260 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
27270 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
27280 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
27290 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70  ned via the outp
272a0 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62 79  ut parameters by
272b0 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
272c0 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75  v2() -.** the nu
272d0 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
272e0 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68  n the log and th
272f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
27300 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a  es in the log.**
27310 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
27320 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
27330 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
27340 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
27350 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
27360 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27370 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
27380 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27390 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
273a0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
273b0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
273c0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
273d0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
273e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
273f0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27400 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27410 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27420 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27430 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
27440 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
27450 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65  int rc;..  int e
27460 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67  Mode;.  int nLog
27470 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e   = -555;.  int n
27480 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54  Ckpt = -555;.  T
27490 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
274a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d   const char * aM
274b0 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69  ode[] = { "passi
274c0 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65  ve", "full", "re
274d0 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20 20 61  start", 0 };.  a
274e0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
274f0 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
27500 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27510 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
27520 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
27530 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
27540 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
27550 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 6f  T==2 );..  if( o
27560 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
27570 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
27580 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
27590 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d  , 1, objv, "DB M
275a0 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  ODE ?NAME?");.  
275b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
275c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
275d0 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44  bjc==4 ){.    zD
275e0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
275f0 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a  g(objv[3]);.  }.
27600 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
27610 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
27620 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
27630 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20 54 63  ), &db).   || Tc
27640 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
27650 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
27660 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22  ], aMode, "mode"
27670 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20  , 0, &eMode) .  
27680 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
27690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
276a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
276b0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
276c0 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20 26  b, zDb, eMode, &
276d0 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a 20  nLog, &nCkpt);. 
276e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
276f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
27700 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54 63 6c  _BUSY ){.    Tcl
27710 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
27720 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
27730 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54  e3_errmsg(db), T
27740 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
27750 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27760 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
27770 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
27780 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27790 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
277a0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
277b0 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54  IntObj(rc==SQLIT
277c0 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20  E_BUSY?1:0));.  
277d0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
277e0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
277f0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
27800 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54  tObj(nLog));.  T
27810 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27820 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27830 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
27840 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54  Obj(nCkpt));.  T
27850 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
27860 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
27870 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
27890 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  :  test_sqlite3_
278a0 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  log ?SCRIPT?.*/.
278b0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f  static struct Lo
278c0 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63  gCallback {.  Tc
278d0 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72  l_Interp *pInter
278e0 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
278f0 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63  bj;.} logcallbac
27900 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74  k = {0, 0};.stat
27910 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c  ic void xLogcall
27920 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65  back(void *unuse
27930 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72  d, int err, char
27940 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f   *zMsg){.  Tcl_O
27950 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44  bj *pNew = Tcl_D
27960 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63  uplicateObj(logc
27970 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
27980 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
27990 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c  t(pNew);.  Tcl_L
279a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
279b0 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e  ent(.      0, pN
279c0 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
279d0 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
279e0 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
279f0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27a00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
27a10 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
27a20 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
27a30 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
27a40 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
27a50 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
27a60 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
27a70 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
27a80 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
27a90 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
27aa0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
27ab0 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
27ac0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27ad0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
27ae0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27af0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27b00 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27b10 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27b20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27b30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b40 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27b50 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27b60 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27b70 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27b80 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
27b90 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
27ba0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27bb0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
27bc0 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
27bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27be0 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
27bf0 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
27c00 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
27c10 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27c20 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27c30 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
27c40 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
27c50 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
27c60 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
27c70 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
27c80 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
27c90 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
27ca0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
27cb0 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20   = objv[1];.    
27cc0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
27cd0 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27ce0 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27cf0 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e  ack.pInterp = in
27d00 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  terp;.    sqlite
27d10 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
27d20 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67  CONFIG_LOG, xLog
27d30 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20  callback, 0);.  
27d40 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
27d50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
27d60 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d  tcl_objproc COMM
27d70 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a  ANDNAME ARGS....
27d80 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20  **.** Run a TCL 
27d90 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74  command using it
27da0 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  s objProc interf
27db0 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65  ace.  Throw an e
27dc0 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  rror if.** the c
27dd0 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
27de0 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
27df0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
27e00 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76  unAsObjProc(.  v
27e10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
27e20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
27e30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
27e40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
27e50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
27e60 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
27e70 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Info;.  if( objc
27e80 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
27e90 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27ea0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d  p, 1, objv, "COM
27eb0 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
27ec0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c  ;.  }.  if( !Tcl
27ee0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
27ef0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27f00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27f10 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
27f20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27f30 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
27f40 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
27f50 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
27f60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27f70 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
27f80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27f90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ROR;.  }.  if( c
27fa0 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d  mdInfo.objProc==
27fb0 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
27fc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27fd0 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  , "command has n
27fe0 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20  o objProc: ",.  
27ff0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
28000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
28010 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
28020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28030 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
28040 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63  mdInfo.objProc(c
28050 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
28060 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
28070 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d  jc-1, objv+1);.}
28080 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28090 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
280a0 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65  .** WARNING: The
280b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
280c0 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69  ion, printExplai
280d0 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20  nQueryPlan() is 
280e0 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79  an exact.** copy
280f0 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65   of example code
28100 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71   from eqp.in (eq
28110 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73  p.html). If this
28120 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65   code is modifie
28130 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64  d,.** then the d
28140 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70  ocumentation cop
28150 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  y needs to be mo
28160 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a  dified as well..
28170 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  */./*.** Argumen
28180 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65  t pStmt is a pre
28190 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
281a0 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
281b0 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61  on compiles.** a
281c0 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
281d0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  PLAN command to 
281e0 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72  report on the pr
281f0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
28200 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20  ,.** and prints 
28210 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74  the report to st
28220 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74  dout using print
28230 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e  f()..*/.int prin
28240 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
28250 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  n(sqlite3_stmt *
28260 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  pStmt){.  const 
28270 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
28280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
28290 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72  ut SQL */.  char
282a0 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *zExplain;     
282b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
282c0 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20  QL with EXPLAIN 
282d0 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65  QUERY PLAN prepe
282e0 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nded */.  sqlite
282f0 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
28300 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
28310 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55  piled EXPLAIN QU
28320 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
28330 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
28340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28350 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28360 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
28370 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a  3_prepare_v2() *
28380 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  /..  zSql = sqli
28390 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  te3_sql(pStmt);.
283a0 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
283b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
283c0 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e  ROR;..  zExplain
283d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
283e0 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
283f0 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c  Y PLAN %s", zSql
28400 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69  );.  if( zExplai
28410 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
28420 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
28430 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
28440 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64  are_v2(sqlite3_d
28450 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c  b_handle(pStmt),
28460 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26   zExplain, -1, &
28470 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
28480 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
28490 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63  plain);.  if( rc
284a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
284b0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
284c0 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
284d0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
284e0 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74  lain) ){.    int
284f0 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c   iSelectid = sql
28500 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
28510 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
28520 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73    int iOrder = s
28530 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
28540 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
28550 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20      int iFrom = 
28560 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
28570 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b  nt(pExplain, 2);
28580 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28590 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73  *zDetail = (cons
285a0 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
285b0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
285c0 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20  plain, 3);..    
285d0 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64  printf("%d %d %d
285e0 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69   %s\n", iSelecti
285f0 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d  d, iOrder, iFrom
28600 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a  , zDetail);.  }.
28610 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
28620 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
28630 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ain);.}..static 
28640 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  int test_print_e
28650 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  qp(.  void * cli
28660 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28670 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28680 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28690 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
286a0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
286b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
286c0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
286d0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
286e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
286f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
28700 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
28710 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28720 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
28730 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
28740 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
28750 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
28760 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28770 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45  R;.  rc = printE
28780 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
28790 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69  pStmt);.  /* Thi
287a0 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57  s is needed on W
287b0 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61  indows so that a
287c0 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67   test case using
287d0 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
287e0 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20  tion can open a 
287f0 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65  read pipe and ge
28800 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a  t the output of.
28810 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69    ** printExplai
28820 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d  nQueryPlan() imm
28830 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
28840 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
28850 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
28860 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
28870 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
28880 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
28890 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
288a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
288b0 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
288c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
288d0 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e  ntrol VERB ARGS.
288e0 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
288f0 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
28900 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
28910 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28920 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28930 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28940 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28950 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56  [].){.  struct V
28960 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  erb {.    const 
28970 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
28980 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72   int i;.  } aVer
28990 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  b[] = {.    { "S
289a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
289b0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c  OCALTIME_FAULT",
289c0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
289d0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
289e0 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c 49   }, .    { "SQLI
289f0 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
28a00 45 52 5f 4d 4d 41 50 22 2c 20 53 51 4c 49 54 45  ER_MMAP", SQLITE
28a10 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
28a20 5f 4d 4d 41 50 20 7d 2c 20 0a 20 20 7d 3b 0a 20  _MMAP }, .  };. 
28a30 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e   int iVerb;.  in
28a40 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72  t iFlag;.  int r
28a50 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  c;..  if( objc<2
28a60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
28a70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
28a80 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20   1, objv, "VERB 
28a90 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  ARGS...");.    r
28aa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28ab0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c  .  }..  rc = Tcl
28ac0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
28ad0 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e  Struct(.      in
28ae0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61  terp, objv[1], a
28af0 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65  Verb, sizeof(aVe
28b00 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20  rb[0]), "VERB", 
28b10 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20  0, &iVerb.  );. 
28b20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
28b30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
28b40 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56  iFlag = aVerb[iV
28b50 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68  erb].i;.  switch
28b60 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63  ( iFlag ){.    c
28b70 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
28b80 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
28b90 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULT: {.      int
28ba0 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20   val;.      if( 
28bb0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
28bc0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28bd0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
28be0 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20  bjv, "ONOFF");. 
28bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
28c00 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
28c10 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
28c20 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
28c30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
28c40 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
28c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
28c60 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
28c70 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
28c80 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
28c90 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20  _FAULT, val);.  
28ca0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
28cb0 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
28cc0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
28cd0 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
28ce0 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73  int val;.      s
28cf0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
28d00 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
28d10 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
28d20 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
28d30 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c  , 2, objv, "DB L
28d40 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20  IMIT");.        
28d50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28d70 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
28d80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
28d90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
28da0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
28db0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
28dc0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
28dd0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
28de0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
28df0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
28e10 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
28e20 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
28e30 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c  ER_MMAP, db, val
28e40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
28e50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
28e60 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
28e70 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
28e80 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
28e90 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e  LITE_OS_UNIX.#in
28ea0 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
28eb0 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
28ec0 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74  /resource.h>..st
28ed0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65  atic int test_ge
28ee0 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20  trusage(.  void 
28ef0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
28f00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28f10 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
28f20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28f30 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
28f40 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73  r buf[1024];.  s
28f50 74 72 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a  truct rusage r;.
28f60 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20    memset(&r, 0, 
28f70 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65  sizeof(r));.  ge
28f80 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53  trusage(RUSAGE_S
28f90 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 70 72  ELF, &r);..  spr
28fa0 69 6e 74 66 28 62 75 66 2c 20 22 72 75 5f 75 74  intf(buf, "ru_ut
28fb0 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 73  ime=%d.%06d ru_s
28fc0 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f  time=%d.%06d ru_
28fd0 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a  minflt=%d ru_maj
28fe0 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20 28 69  flt=%d", .    (i
28ff0 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76  nt)r.ru_utime.tv
29000 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f  _sec, (int)r.ru_
29010 75 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a  utime.tv_usec, .
29020 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 73 74      (int)r.ru_st
29030 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74  ime.tv_sec, (int
29040 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75  )r.ru_stime.tv_u
29050 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72  sec, .    (int)r
29060 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74  .ru_minflt, (int
29070 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29  )r.ru_majflt.  )
29080 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
29090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
290a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75  _NewStringObj(bu
290b0 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72  f, -1));.  retur
290c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
290d0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
290e0 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f  S_WIN./*.** Info
290f0 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 66  rmation passed f
29100 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 68 72  rom the main thr
29110 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77 69 6e  ead into the win
29120 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72  dows file locker
29130 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  .** background t
29140 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  hread..*/.struct
29150 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
29160 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e 61 6d   {.  char *evNam
29170 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e;       /* Name
29180 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73 69 67   of event to sig
29190 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61 72 74  nal thread start
291a0 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68  up */.  HANDLE h
291b0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48  ;           /* H
291c0 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66 69 6c  andle of the fil
291d0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
291e0 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31 3b 20  /.  int delay1; 
291f0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79          /* Delay
29200 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20   before locking 
29210 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 32 3b  */.  int delay2;
29220 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61           /* Dela
29230 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69  y before unlocki
29240 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20  ng */.  int ok; 
29250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29260 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20  inished ok */.  
29270 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20 20 20  int err;        
29280 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
29290 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a  n error occurs *
292a0 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  /.};.#endif...#i
292b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
292c0 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63 65 73  #include <proces
292d0 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62  s.h>./*.** The b
292e0 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
292f0 20 74 68 61 74 20 64 6f 65 73 20 66 69 6c 65 20   that does file 
29300 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
29310 69 63 20 76 6f 69 64 20 77 69 6e 33 32 5f 66 69  ic void win32_fi
29320 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a  le_locker(void *
29330 70 41 70 70 44 61 74 61 29 7b 0a 20 20 73 74 72  pAppData){.  str
29340 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
29350 6b 65 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74  ker *p = (struct
29360 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
29370 2a 29 70 41 70 70 44 61 74 61 3b 0a 20 20 69 66  *)pAppData;.  if
29380 28 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20  ( p->evName ){. 
29390 20 20 20 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f     HANDLE ev = O
293a0 70 65 6e 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d  penEvent(EVENT_M
293b0 4f 44 49 46 59 5f 53 54 41 54 45 2c 20 46 41 4c  ODIFY_STATE, FAL
293c0 53 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a  SE, p->evName);.
293d0 20 20 20 20 69 66 20 28 20 65 76 20 29 7b 0a 20      if ( ev ){. 
293e0 20 20 20 20 20 53 65 74 45 76 65 6e 74 28 65 76       SetEvent(ev
293f0 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61  );.      CloseHa
29400 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a  ndle(ev);.    }.
29410 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c    }.  if( p->del
29420 61 79 31 20 29 20 53 6c 65 65 70 28 70 2d 3e 64  ay1 ) Sleep(p->d
29430 65 6c 61 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f  elay1);.  if( Lo
29440 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20  ckFile(p->h, 0, 
29450 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29  0, 100000000, 0)
29460 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 70 2d   ){.    Sleep(p-
29470 3e 64 65 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e  >delay2);.    Un
29480 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30  lockFile(p->h, 0
29490 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20  , 0, 100000000, 
294a0 30 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20  0);.    p->ok = 
294b0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
294c0 70 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a  p->err = 1;.  }.
294d0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d    CloseHandle(p-
294e0 3e 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b  >h);.  p->h = 0;
294f0 0a 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30  .  p->delay1 = 0
29500 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20  ;.  p->delay2 = 
29510 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
29520 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
29530 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77  *.**      lock_w
29540 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41  in32_file FILENA
29550 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32  ME DELAY1 DELAY2
29560 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78  .**.** Get an ex
29570 63 6c 75 73 69 76 65 20 6d 61 6e 64 69 74 6f 72  clusive manditor
29580 79 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66  y lock on file f
29590 6f 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73  or DELAY2 millis
295a0 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20  econds..** Wait 
295b0 44 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f  DELAY1 milliseco
295c0 6e 64 73 20 62 65 66 6f 72 65 20 61 63 71 75 69  nds before acqui
295d0 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  ring the lock..*
295e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
295f0 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20  32_file_lock(.  
29600 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
29610 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
29620 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
29630 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
29640 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
29650 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
29660 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
29670 78 20 3d 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c  x = { "win32_fil
29680 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30  e_lock", 0, 0, 0
29690 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73  , 0, 0 };.  cons
296a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
296b0 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32  e;.  char zBuf[2
296c0 30 30 5d 3b 0a 20 20 69 6e 74 20 72 65 74 72 79  00];.  int retry
296d0 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65   = 0;.  HANDLE e
296e0 76 3b 0a 20 20 44 57 4f 52 44 20 77 52 65 73 75  v;.  DWORD wResu
296f0 6c 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  lt;.  .  if( obj
29700 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=4 && objc!=1 
29710 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
29720 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
29730 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41  1, objv, "FILENA
29740 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32  ME DELAY1 DELAY2
29750 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
29760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29770 69 66 28 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20  if( objc==1 ){. 
29780 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29790 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
297a0 2c 20 7a 42 75 66 2c 20 22 25 64 20 25 64 20 25  , zBuf, "%d %d %
297b0 64 20 25 64 20 25 64 22 2c 0a 20 20 20 20 20 20  d %d %d",.      
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 78                 x
297d0 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65  .ok, x.err, x.de
297e0 6c 61 79 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20  lay1, x.delay2, 
297f0 78 2e 68 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  x.h);.    Tcl_Ap
29800 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29810 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  p, zBuf, (char*)
29820 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
29830 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69  CL_OK;.  }.  whi
29840 6c 65 28 20 78 2e 68 20 26 26 20 72 65 74 72 79  le( x.h && retry
29850 3c 33 30 20 29 7b 0a 20 20 20 20 72 65 74 72 79  <30 ){.    retry
29860 2b 2b 3b 0a 20 20 20 20 53 6c 65 65 70 28 31 30  ++;.    Sleep(10
29870 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e  0);.  }.  if( x.
29880 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  h ){.    Tcl_App
29890 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
298a0 2c 20 22 62 75 73 79 22 2c 20 28 63 68 61 72 2a  , "busy", (char*
298b0 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
298c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
298d0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
298e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
298f0 62 6a 76 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79  bjv[2], &x.delay
29900 31 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  1) ) return TCL_
29910 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
29920 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
29930 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
29940 26 78 2e 64 65 6c 61 79 32 29 20 29 20 72 65 74  &x.delay2) ) ret
29950 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29960 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
29970 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
29980 31 5d 29 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65  1]);.  x.h = Cre
29990 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d  ateFile(zFilenam
299a0 65 2c 20 47 45 4e 45 52 49 43 5f 52 45 41 44 7c  e, GENERIC_READ|
299b0 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20  GENERIC_WRITE,. 
299c0 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
299d0 45 5f 53 48 41 52 45 5f 52 45 41 44 7c 46 49 4c  E_SHARE_READ|FIL
299e0 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 20 30  E_SHARE_WRITE, 0
299f0 2c 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20  , OPEN_ALWAYS,. 
29a00 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49 4c               FIL
29a10 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
29a20 41 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 78  AL, 0);.  if( !x
29a30 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  .h ){.    Tcl_Ap
29a40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a50 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  p, "cannot open 
29a60 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61  file: ", zFilena
29a70 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
29a80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29a90 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20  ROR;.  }.  ev = 
29aa0 43 72 65 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c  CreateEvent(NULL
29ab0 2c 20 54 52 55 45 2c 20 46 41 4c 53 45 2c 20 78  , TRUE, FALSE, x
29ac0 2e 65 76 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  .evName);.  if (
29ad0 20 21 65 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f   !ev ){.    Tcl_
29ae0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29af0 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65  erp, "cannot cre
29b00 61 74 65 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e  ate event: ", x.
29b10 65 76 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  evName, (char*)0
29b20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
29b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f  L_ERROR;.  }.  _
29b40 62 65 67 69 6e 74 68 72 65 61 64 28 77 69 6e 33  beginthread(win3
29b50 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30  2_file_locker, 0
29b60 2c 20 28 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20  , (void*)&x);.  
29b70 53 6c 65 65 70 28 30 29 3b 0a 20 20 69 66 20 28  Sleep(0);.  if (
29b80 20 28 77 52 65 73 75 6c 74 20 3d 20 57 61 69 74   (wResult = Wait
29b90 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28  ForSingleObject(
29ba0 65 76 2c 20 31 30 30 30 30 29 29 21 3d 57 41 49  ev, 10000))!=WAI
29bb0 54 5f 4f 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20  T_OBJECT_0 ){.  
29bc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
29bd0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
29be0 20 7a 42 75 66 2c 20 22 30 78 25 78 22 2c 20 77   zBuf, "0x%x", w
29bf0 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c  Result);.    Tcl
29c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29c10 74 65 72 70 2c 20 22 77 61 69 74 20 66 61 69 6c  terp, "wait fail
29c20 65 64 3a 20 22 2c 20 7a 42 75 66 2c 20 28 63 68  ed: ", zBuf, (ch
29c30 61 72 2a 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73  ar*)0);.    Clos
29c40 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20  eHandle(ev);.   
29c50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29c60 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61  R;.  }.  CloseHa
29c70 6e 64 6c 65 28 65 76 29 3b 0a 20 20 72 65 74 75  ndle(ev);.  retu
29c80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
29c90 0a 2a 2a 20 20 20 20 20 20 65 78 69 73 74 73 5f  .**      exists_
29ca0 77 69 6e 33 32 5f 70 61 74 68 20 50 41 54 48 0a  win32_path PATH.
29cb0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f  **.** Returns no
29cc0 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70  n-zero if the sp
29cd0 65 63 69 66 69 65 64 20 70 61 74 68 20 65 78 69  ecified path exi
29ce0 73 74 73 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  sts, whose fully
29cf0 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a   qualified name.
29d00 2a 2a 20 6d 61 79 20 65 78 63 65 65 64 20 32 36  ** may exceed 26
29d10 30 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  0 characters if 
29d20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
29d30 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
29d40 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
29d50 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20 20 76  exists_path(.  v
29d60 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
29d70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29d80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
29d90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
29da0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
29db0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
29dc0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
29dd0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
29de0 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a 20 20  bjv, "PATH");.  
29df0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29e00 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
29e10 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
29e20 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
29e30 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65 74 46  nObj(.      GetF
29e40 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 20  ileAttributesW( 
29e50 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f  Tcl_GetUnicode(o
29e60 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41 4c 49  bjv[1]))!=INVALI
29e70 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
29e80 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  S ));.  return T
29e90 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
29ea0 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33 32 5f       find_win32_
29eb0 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a 2a 0a  file PATTERN.**.
29ec0 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c 69 73  ** Returns a lis
29ed0 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  t of entries in 
29ee0 61 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  a directory that
29ef0 20 6d 61 74 63 68 20 74 68 65 20 73 70 65 63 69   match the speci
29f00 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a 2a 2a  fied pattern,.**
29f10 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
29f20 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
29f30 65 78 63 65 65 64 20 32 34 38 20 63 68 61 72 61  exceed 248 chara
29f40 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
29f50 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a 2a 20  refixed with.** 
29f60 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
29f70 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69 6e 64  c int win32_find
29f80 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
29f90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
29fa0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29fb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
29fc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
29fd0 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  jv[].){.  HANDLE
29fe0 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56   hFindFile = INV
29ff0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
2a000 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f  E;.  WIN32_FIND_
2a010 44 41 54 41 57 20 66 69 6e 64 44 61 74 61 3b 0a  DATAW findData;.
2a020 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f    Tcl_Obj *listO
2a030 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  bj;.  DWORD last
2a040 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a  Errno;.  if( obj
2a050 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2a060 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2a070 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50  erp, 1, objv, "P
2a080 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20 72 65  ATTERN");.    re
2a090 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a0a0 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c 65 20    }.  hFindFile 
2a0b0 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 57  = FindFirstFileW
2a0c0 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28  (Tcl_GetUnicode(
2a0d0 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44  objv[1]), &findD
2a0e0 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46 69 6e  ata);.  if( hFin
2a0f0 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48  dFile==INVALID_H
2a100 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
2a110 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2a120 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2a130 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
2a140 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
2a150 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a160 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  RROR;.  }.  list
2a170 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
2a180 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
2a190 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b  fCount(listObj);
2a1a0 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f  .  do {.    Tcl_
2a1b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2a1c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
2a1d0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69  tObj, Tcl_NewUni
2a1e0 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20 20 20  codeObj(.       
2a1f0 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e   findData.cFileN
2a200 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ame, -1));.    T
2a210 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2a220 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2a230 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  listObj, Tcl_New
2a240 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20  WideIntObj(.    
2a250 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64 77 46      findData.dwF
2a260 69 6c 65 41 74 74 72 69 62 75 74 65 73 29 29 3b  ileAttributes));
2a270 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69 6e 64  .  } while( Find
2a280 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e 64 46  NextFileW(hFindF
2a290 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61 29 20  ile, &findData) 
2a2a0 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  );.  lastErrno =
2a2b0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
2a2c0 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f  .  if( lastErrno
2a2d0 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61  !=NO_ERROR && la
2a2e0 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e  stErrno!=ERROR_N
2a2f0 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a  O_MORE_FILES ){.
2a300 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46      FindClose(hF
2a310 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20 54 63  indFile);.    Tc
2a320 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_DecrRefCount(l
2a330 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c  istObj);.    Tcl
2a340 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2a350 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2a360 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2a370 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2a380 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a390 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28    }.  FindClose(
2a3a0 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63  hFindFile);.  Tc
2a3b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a3c0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b  nterp, listObj);
2a3d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a3e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2a3f0 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c  delete_win32_fil
2a400 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a  e FILENAME.**.**
2a410 20 44 65 6c 65 74 65 73 20 74 68 65 20 73 70 65   Deletes the spe
2a420 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68 6f  cified file, who
2a430 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2a440 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2a450 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72 61 63  ed 260.** charac
2a460 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2a470 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2a480 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2a490 74 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66  t win32_delete_f
2a4a0 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  ile(.  void *cli
2a4b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2a4c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2a4d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2a4e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2a4f0 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
2a500 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2a510 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2a520 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2a530 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  LENAME");.    re
2a540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a550 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c 65 74    }.  if( !Delet
2a560 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e  eFileW(Tcl_GetUn
2a570 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20  icode(objv[1])) 
2a580 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2a590 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2a5a0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2a5b0 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2a5c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2a5d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a5e0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2a5f0 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2a600 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2a610 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e  **      make_win
2a620 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59  32_dir DIRECTORY
2a630 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20 74  .**.** Creates t
2a640 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72  he specified dir
2a650 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75  ectory, whose fu
2a660 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2a670 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
2a680 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  8.** characters 
2a690 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
2a6a0 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
2a6b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2a6c0 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64  32_mkdir(.  void
2a6d0 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2a6e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a6f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2a700 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2a710 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2a720 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2a730 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2a740 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2a750 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
2a760 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a770 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2a780 21 43 72 65 61 74 65 44 69 72 65 63 74 6f 72 79  !CreateDirectory
2a790 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
2a7a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
2a7b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
2a7c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2a7d0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2a7e0 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2a7f0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2a800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2a810 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2a820 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
2a830 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2a840 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65 5f  .**      remove_
2a850 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54  win32_dir DIRECT
2a860 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  ORY.**.** Remove
2a870 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
2a880 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65  directory, whose
2a890 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
2a8a0 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64   name may exceed
2a8b0 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65   248.** characte
2a8c0 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
2a8d0 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
2a8e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a8f0 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20 76  win32_rmdir(.  v
2a900 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2a910 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a920 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2a930 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2a940 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2a950 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2a960 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2a970 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2a980 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22  bjv, "DIRECTORY"
2a990 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a9a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a9b0 66 28 20 21 52 65 6d 6f 76 65 44 69 72 65 63 74  f( !RemoveDirect
2a9c0 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  oryW(Tcl_GetUnic
2a9d0 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b  ode(objv[1])) ){
2a9e0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2a9f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2aa00 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2aa10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2aa20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2aa30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2aa40 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2aa50 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2aa60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2aa70 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70  .../*.**      op
2aa80 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
2aa90 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41  ol DB OPT BOOLEA
2aaa0 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f  N.**.** Enable o
2aab0 72 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20  r disable query 
2aac0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73  optimizations us
2aad0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
2aae0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a  test_control().*
2aaf0 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69  * interface.  Di
2ab00 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e  sable if BOOLEAN
2ab10 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e   is false and en
2ab20 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
2ab30 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20  is true..** OPT 
2ab40 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
2ab50 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2ab60 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a  to be disabled..
2ab70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
2ab80 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
2ab90 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
2aba0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2abb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2abc0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2abd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2abe0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  [].){.  int i;. 
2abf0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2ac00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74  const char *zOpt
2ac10 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20  ;.  int onoff;. 
2ac20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20   int mask = 0;. 
2ac30 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2ac40 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
2ac50 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b   char *zOptName;
2ac60 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20  .    int mask;. 
2ac70 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20   } aOpt[] = {.  
2ac80 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20 20    { "all",      
2ac90 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2aca0 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20 20 20  E_AllOpts       
2acb0 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22   },.    { "none"
2acc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2acd0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
2ace0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2acf0 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e 65 72  "query-flattener
2ad00 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 51 75  ",     SQLITE_Qu
2ad10 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a  eryFlattener },.
2ad20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61      { "column-ca
2ad30 63 68 65 22 2c 20 20 20 20 20 20 20 20 53 51 4c  che",        SQL
2ad40 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
2ad50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f     },.    { "gro
2ad60 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20 20  upby-order",    
2ad70 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42     SQLITE_GroupB
2ad80 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20 20  yOrder   },.    
2ad90 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61  { "factor-consta
2ada0 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54 45 5f  nts",    SQLITE_
2adb0 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d  FactorOutConst }
2adc0 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69 6e 63  ,.    { "distinc
2add0 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20 20 53  t-opt",        S
2ade0 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2adf0 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63  t    },.    { "c
2ae00 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22 2c 20  over-idx-scan", 
2ae10 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 76 65       SQLITE_Cove
2ae20 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a 20 20  rIdxScan   },.  
2ae30 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d 69 64    { "order-by-id
2ae40 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c 49 54  x-join",   SQLIT
2ae50 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69 6e  E_OrderByIdxJoin
2ae60 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e 73   },.    { "trans
2ae70 69 74 69 76 65 22 2c 20 20 20 20 20 20 20 20 20  itive",         
2ae80 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74 69   SQLITE_Transiti
2ae90 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  ve     },.    { 
2aea0 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f 75 74  "subquery-corout
2aeb0 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f 53 75  ine",  SQLITE_Su
2aec0 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d 2c 0a  bqCoroutine  },.
2aed0 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70      { "omit-noop
2aee0 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51 4c  -join",      SQL
2aef0 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
2af00 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61     },.    { "sta
2af10 74 33 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  t3",            
2af20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33 20     SQLITE_Stat3 
2af30 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
2af40 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
2af50 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2af60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2af70 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54  1, objv, "DB OPT
2af80 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20   BOOLEAN");.    
2af90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2afa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2afb0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2afc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2afd0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
2afe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2aff0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ;.  if( Tcl_GetB
2b000 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2b010 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
2b020 6f 6e 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20  onoff) ) return 
2b030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
2b040 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
2b050 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
2b060 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
2b070 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
2b080 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
2b090 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74   if( strcmp(zOpt
2b0a0 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61  , aOpt[i].zOptNa
2b0b0 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
2b0c0 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d  mask = aOpt[i].m
2b0d0 61 73 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ask;.      break
2b0e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2b0f0 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d  ( onoff ) mask =
2b100 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e   ~mask;.  if( i>
2b110 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  =sizeof(aOpt)/si
2b120 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b  zeof(aOpt[0]) ){
2b130 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2b140 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
2b150 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74  nknown optimizat
2b160 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  ion - should be 
2b170 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20  one of:",.      
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b190 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f  char*)0);.    fo
2b1a0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
2b1b0 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
2b1c0 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  t[0]); i++){.   
2b1d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2b1e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c  ult(interp, " ",
2b1f0 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d   aOpt[i].zOptNam
2b200 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2b210 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
2b220 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b230 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2b240 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2b250 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
2b260 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20  NS, db, mask);. 
2b270 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2b280 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
2b290 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b2a0 75 74 69 6e 65 73 20 73 71 6c 69 74 65 33 5f 61  utines sqlite3_a
2b2b0 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f 2a 0a  pi_routines;./*.
2b2c0 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74  **     load_stat
2b2d0 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 20  ic_extension DB 
2b2e0 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c  NAME ....**.** L
2b2f0 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  oad one or more 
2b300 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65  statically linke
2b310 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f  d extensions..*/
2b320 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 4c  .static int tclL
2b330 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69  oadStaticExtensi
2b340 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20  onCmd(.  void * 
2b350 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2b360 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2b370 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2b380 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2b390 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72  bjv[].){.  exter
2b3a0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d  n int sqlite3_am
2b3b0 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74 65  atch_init(sqlite
2b3c0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2b3d0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2b3e0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2b3f0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f   int sqlite3_clo
2b400 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  sure_init(sqlite
2b410 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2b420 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2b430 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2b440 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 7a   int sqlite3_fuz
2b450 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  zer_init(sqlite3
2b460 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2b470 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2b480 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2b490 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65 65 65  int sqlite3_ieee
2b4a0 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2b4b0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2b4c0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2b4d0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2b4e0 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61   sqlite3_nextcha
2b4f0 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  r_init(sqlite3*,
2b500 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2b510 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2b520 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2b530 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e  t sqlite3_percen
2b540 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  tile_init(sqlite
2b550 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2b560 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2b570 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2b580 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67   int sqlite3_reg
2b590 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  exp_init(sqlite3
2b5a0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2b5b0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2b5c0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2b5d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c  int sqlite3_spel
2b5e0 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65  lfix_init(sqlite
2b5f0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2b600 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2b610 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2b620 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74   int sqlite3_tot
2b630 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ype_init(sqlite3
2b640 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2b650 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2b660 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2b670 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c  int sqlite3_whol
2b680 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c  enumber_init(sql
2b690 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2b6a0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2b6b0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74 61  outines*);.  sta
2b6c0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2b6d0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
2b6e0 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20  r *zExtName;.   
2b6f0 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71   int (*pInit)(sq
2b700 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2b710 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2b720 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20  routines*);.  } 
2b730 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b  aExtension[] = {
2b740 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c  .    { "amatch",
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b760 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
2b770 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2b780 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73    },.    { "clos
2b790 75 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ure",           
2b7a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2b7b0 75 72 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ure_init        
2b7c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b7d0 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20 20  fuzzer",        
2b7e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b7f0 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20 20  fuzzer_init     
2b800 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2b810 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20 20   { "ieee754",   
2b820 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b830 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20 20  te3_ieee_init   
2b840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2b850 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61 72  .    { "nextchar
2b860 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2b870 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
2b880 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2b890 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72 63    },.    { "perc
2b8a0 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20 20  entile",        
2b8b0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72 63      sqlite3_perc
2b8c0 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20 20  entile_init     
2b8d0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b8e0 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20 20  regexp",        
2b8f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b900 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20 20  regexp_init     
2b910 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2b920 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c 20 20   { "spellfix",  
2b930 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b940 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69  te3_spellfix_ini
2b950 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t             },
2b960 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65 22 2c  .    { "totype",
2b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b980 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69  sqlite3_totype_i
2b990 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2b9a0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 68 6f 6c    },.    { "whol
2b9b0 65 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20  enumber",       
2b9c0 20 20 20 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c      sqlite3_whol
2b9d0 65 6e 75 6d 62 65 72 5f 69 6e 69 74 20 20 20 20  enumber_init    
2b9e0 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
2b9f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
2ba00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2ba10 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63  ;.  int i, j, rc
2ba20 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2ba30 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a  g = 0;.  if( obj
2ba40 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<3 ){.    Tcl_W
2ba50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2ba60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2ba70 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20 20   NAME ...");.   
2ba80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ba90 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2baa0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2bab0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2bac0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2bad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bae0 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a 3c  R;.  for(j=2; j<
2baf0 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  objc; j++){.    
2bb00 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
2bb10 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b 0a  tring(objv[j]);.
2bb20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
2bb30 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
2bb40 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ion); i++){.    
2bb50 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
2bb60 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69  me, aExtension[i
2bb70 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zExtName)==0 )
2bb80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2bb90 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
2bba0 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20 29  ze(aExtension) )
2bbb0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
2bbc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2bbd0 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e 73   "no such extens
2bbe0 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 28  ion: ", zName, (
2bbf0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
2bc00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2bc10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
2bc20 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
2bc30 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d 73  Init(db, &zErrMs
2bc40 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  g, 0);.    if( r
2bc50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
2bc60 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
2bc70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2bc80 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69 74 69  t(interp, "initi
2bc90 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20  alization of ", 
2bca0 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a  zName, " failed:
2bcb0 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20   ", zErrMsg,.   
2bcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcd0 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
2bce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bcf0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
2bd00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2bd10 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
2bd20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2bd30 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  .../*.** Registe
2bd40 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20  r commands with 
2bd50 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  the TCL interpre
2bd60 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69  ter..*/.int Sqli
2bd70 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c  tetest1_Init(Tcl
2bd80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
2bd90 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  {.  extern int s
2bda0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
2bdb0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2bdc0 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  t sqlite3_found_
2bdd0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2bde0 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  int sqlite3_inte
2bdf0 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  rrupt_count;.  e
2be00 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2be10 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
2be20 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2be30 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
2be40 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2be50 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2be60 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54  _time;.#if SQLIT
2be70 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66  E_OS_UNIX && def
2be80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2be90 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2bea0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2beb0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2bec0 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a  te3_hostid_num;.
2bed0 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20  #endif.  extern 
2bee0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f  int sqlite3_max_
2bef0 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65  blobsize;.  exte
2bf00 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74  rn int sqlite3Bt
2bf10 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
2bf20 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20  port(void*,.    
2bf30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf50 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
2bf60 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f  *,int,Tcl_Obj*CO
2bf70 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20  NST*);.  static 
2bf80 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
2bf90 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
2bfa0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
2bfb0 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
2bfc0 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
2bfd0 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
2bfe0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2bff0 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
2c000 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
2c010 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
2c020 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
2c030 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2c040 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
2c050 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2c060 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c070 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
2c080 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2c090 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c0a0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
2c0b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c0c0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
2c0d0 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
2c0e0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c0f0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
2c100 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c110 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22  e3_mprintf_long"
2c120 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
2c130 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c140 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20  _mprintf_long   
2c150 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c160 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
2c170 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2c180 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c190 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
2c1a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c1b0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
2c1c0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
2c1d0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c1e0 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
2c1f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c200 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
2c210 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
2c220 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c230 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
2c240 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c250 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
2c260 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
2c270 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c280 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
2c290 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c2a0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
2c2b0 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
2c2c0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2c2d0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
2c2e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c2f0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
2c300 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
2c310 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2c320 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
2c330 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c340 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
2c350 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
2c360 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
2c370 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
2c380 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c390 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
2c3a0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2c3b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
2c3c0 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
2c3d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c3e0 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
2c3f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2c400 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
2c410 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
2c420 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c430 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2c440 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
2c450 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
2c460 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
2c470 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2c480 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
2c490 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2c4a0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
2c4b0 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
2c4c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2c4d0 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20  ec_hex",        
2c4e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2c4f0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65  oc*)test_exec_he
2c500 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  x         },.   
2c510 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2c520 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
2c530 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2c540 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
2c550 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2c560 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2c570 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
2c580 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2c590 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
2c5a0 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
2c5b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
2c5c0 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
2c5d0 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
2c5e0 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
2c5f0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2c600 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
2c610 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
2c620 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2c630 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
2c640 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2c650 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
2c660 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
2c670 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
2c680 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  ose_v2",        
2c690 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2c6a0 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
2c6b0 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20  close_v2  },.   
2c6c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
2c6d0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
2c6e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2c6f0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
2c700 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
2c710 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2c720 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
2c730 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2c740 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
2c750 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
2c760 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
2c770 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
2c780 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
2c790 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
2c7a0 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
2c7b0 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2c7e0 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
2c7f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2c800 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20  "sqlite_bind",  
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2c830 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20  est_bind        
2c840 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2c850 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20  breakpoint",    
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2c880 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20  st_breakpoint   
2c890 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2c8a0 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20  qlite3_key",    
2c8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2c8c0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2c8d0 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  t_key           
2c8e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2c8f0 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20  lite3_rekey",   
2c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2c910 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2c920 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20  _rekey          
2c930 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c940 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20  ite_set_magic", 
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2c960 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2c970 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20  e_set_magic     
2c980 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c990 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20  te3_interrupt", 
2c9a0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2c9b0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
2c9c0 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20  nterrupt        
2c9d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c9e0 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
2c9f0 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  n",        (Tcl_
2ca00 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
2ca10 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d  function       }
2ca20 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ca30 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
2ca40 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
2ca50 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63  mdProc*)delete_c
2ca60 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c  ollation      },
2ca70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ca80 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22  _get_autocommit"
2ca90 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2caa0 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63  dProc*)get_autoc
2cab0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a  ommit        },.
2cac0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cad0 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20  stack_used",    
2cae0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2caf0 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b  Proc*)test_stack
2cb00 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20  _used       },. 
2cb10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2cb20 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20  usy_timeout",   
2cb30 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2cb40 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74  roc*)test_busy_t
2cb50 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20  imeout     },.  
2cb60 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20     { "printf",  
2cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb80 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2cb90 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20  oc*)test_printf 
2cba0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2cbb0 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72    { "sqlite3IoTr
2cbc0 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
2cbd0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2cbe0 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20  )test_io_trace  
2cbf0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2cc00 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65   "clang_sanitize
2cc10 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20  _address",      
2cc20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2cc30 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61  clang_sanitize_a
2cc40 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20  ddress },.  };. 
2cc50 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
2cc60 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
2cc70 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43  e;.     Tcl_ObjC
2cc80 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
2cc90 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74      void *client
2cca0 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d  Data;.  } aObjCm
2ccb0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
2ccc0 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69  sqlite3_connecti
2ccd0 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20  on_pointer",    
2cce0 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
2ccf0 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  er, 0 },.     { 
2cd00 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e  "sqlite3_bind_in
2cd10 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2cd20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20   test_bind_int, 
2cd30 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b       0 },.     {
2cd40 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a   "sqlite3_bind_z
2cd50 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  eroblob",       
2cd60 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f    test_bind_zero
2cd70 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20  blob, 0 },.     
2cd80 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2cd90 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
2cda0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
2cdb0 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  64,    0 },.    
2cdc0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2cdd0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
2cde0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f      test_bind_do
2cdf0 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20  uble,   0 },.   
2ce00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2ce10 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20  d_null",        
2ce20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e       test_bind_n
2ce30 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ull     ,0 },.  
2ce40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2ce50 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20  nd_text",       
2ce60 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2ce70 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20  text     ,0 },. 
2ce80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2ce90 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20  ind_text16",    
2cea0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2ceb0 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a  _text16   ,0 },.
2cec0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ced0 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20  bind_blob",     
2cee0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2cef0 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c  d_blob     ,0 },
2cf00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cf10 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2cf20 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69  count",  test_bi
2cf30 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
2cf40 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  nt, 0},.     { "
2cf50 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
2cf60 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20  ameter_name",   
2cf70 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
2cf80 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20  ter_name,  0},. 
2cf90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2cfa0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2cfb0 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64  dex",  test_bind
2cfc0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
2cfd0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2cfe0 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
2cff0 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65  ings",        te
2d000 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  st_clear_binding
2d010 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
2d020 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20  qlite3_sleep",  
2d030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2d040 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20  est_sleep,      
2d050 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2d060 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22  sqlite3_errcode"
2d070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d080 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20  test_errcode    
2d090 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2d0a0 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65  "sqlite3_extende
2d0b0 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20  d_errcode",     
2d0c0 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65   test_ex_errcode
2d0d0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2d0e0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
2d0f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d100 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20    test_errmsg   
2d110 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2d120 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
2d130 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  g16",           
2d140 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36     test_errmsg16
2d150 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2d160 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
2d170 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d180 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20      test_open   
2d190 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2d1a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
2d1b0 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  n16",           
2d1c0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36       test_open16
2d1d0 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2d1e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
2d1f0 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  en_v2",         
2d200 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f        test_open_
2d210 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  v2       ,0 },. 
2d220 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2d230 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20  omplete16",     
2d240 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70         test_comp
2d250 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a  lete16    ,0 },.
2d260 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d270 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20  _prepare",      
2d280 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
2d290 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d  epare       ,0 }
2d2a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d2b0 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20  3_prepare16",   
2d2c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
2d2d0 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20  repare16     ,0 
2d2e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2d2f0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  e3_prepare_v2", 
2d300 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2d310 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30  prepare_v2    ,0
2d320 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d330 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
2d340 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74  134",       test
2d350 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
2d360 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2d370 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
2d380 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  v2",          te
2d390 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  st_prepare16_v2 
2d3a0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2d3b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22  qlite3_finalize"
2d3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
2d3d0 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20  est_finalize    
2d3e0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2d3f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
2d400 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  tus",           
2d410 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73  test_stmt_status
2d420 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2d430 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c  "sqlite3_reset",
2d440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d450 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20   test_reset     
2d460 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2d470 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65   "sqlite3_expire
2d480 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
2d490 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20    test_expired  
2d4a0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2d4b0 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  { "sqlite3_trans
2d4c0 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20  fer_bindings",  
2d4d0 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72     test_transfer
2d4e0 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20  _bind ,0 },.    
2d4f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e   { "sqlite3_chan
2d500 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ges",           
2d510 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73      test_changes
2d520 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2d530 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65    { "sqlite3_ste
2d540 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
2d550 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20       test_step  
2d560 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2d570 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71     { "sqlite3_sq
2d580 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
2d590 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20        test_sql  
2d5a0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
2d5b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e      { "sqlite3_n
2d5c0 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20  ext_stmt",      
2d5d0 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74         test_next
2d5e0 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _stmt     ,0 },.
2d5f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2d600 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20  stmt_readonly", 
2d610 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
2d620 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c  t_readonly ,0 },
2d630 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d640 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20  _stmt_busy",    
2d650 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
2d660 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d  mt_busy     ,0 }
2d670 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73  ,.     { "uses_s
2d680 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20  tmt_journal",   
2d690 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f 73            uses_s
2d6a0 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d  tmt_journal ,0 }
2d6b0 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
2d6c0 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
2d6d0 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  y",        test_
2d6e0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20  release_memory, 
2d6f0 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2d700 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
2d710 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20  se_memory",     
2d720 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f  test_db_release_
2d730 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20  memory,  0},.   
2d740 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
2d750 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20  filename",      
2d760 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c       test_db_fil
2d770 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d  ename,        0}
2d780 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d790 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20  3_db_readonly", 
2d7a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
2d7b0 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20  b_readonly,     
2d7c0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2d7d0 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
2d7e0 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74  _limit",       t
2d7f0 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
2d800 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20  mit,    0},.    
2d810 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65   { "sqlite3_thre
2d820 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20  ad_cleanup",    
2d830 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f      test_thread_
2d840 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c  cleanup,     0},
2d850 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d860 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
2d870 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61  ",       test_pa
2d880 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20  ger_refcounts,  
2d890 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73    0},..     { "s
2d8a0 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
2d8b0 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74  nsion",        t
2d8c0 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  est_load_extensi
2d8d0 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  on,     0},.    
2d8e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
2d8f0 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
2d900 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  n", test_enable_
2d910 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c  load,        0},
2d920 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d930 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
2d940 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78  _codes", test_ex
2d950 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
2d960 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  des, 0},.     { 
2d970 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c  "sqlite3_limit",
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20   test_limit,    
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
2d9b0 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70  ..     { "save_p
2d9c0 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
2d9d0 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70            save_p
2d9e0 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20  rng_state,    0 
2d9f0 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f  },.     { "resto
2da00 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  re_prng_state", 
2da10 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f             resto
2da20 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30  re_prng_state, 0
2da30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65   },.     { "rese
2da40 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  t_prng_state",  
2da50 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
2da60 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  t_prng_state,   
2da70 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74  0 },.     { "dat
2da80 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
2da90 75 70 74 22 2c 20 20 20 20 20 20 20 20 64 61 74  upt",        dat
2daa0 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
2dab0 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  upt, 0},.     { 
2dac0 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65  "database_may_be
2dad0 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20  _corrupt",      
2dae0 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65   database_may_be
2daf0 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20  _corrupt, 0},.  
2db00 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69     { "optimizati
2db10 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20  on_control",    
2db20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69        optimizati
2db30 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23  on_control,0},.#
2db40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2db50 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69  .     { "lock_wi
2db60 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
2db70 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66           win32_f
2db80 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d  ile_lock,    0 }
2db90 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74 73  ,.     { "exists
2dba0 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20 20  _win32_path",   
2dbb0 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
2dbc0 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30 20  exists_path,  0 
2dbd0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64 5f  },.     { "find_
2dbe0 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20  win32_file",    
2dbf0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
2dc00 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30  _find_file,    0
2dc10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c 65   },.     { "dele
2dc20 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  te_win32_file", 
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
2dc40 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20  2_delete_file,  
2dc50 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b  0 },.     { "mak
2dc60 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20  e_win32_dir",   
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
2dc80 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20 20  32_mkdir,       
2dc90 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
2dca0 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c  move_win32_dir",
2dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
2dcc0 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20 20  n32_rmdir,      
2dcd0 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20    0 },.#endif.  
2dce0 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f     { "tcl_objpro
2dcf0 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
2dd00 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72        runAsObjPr
2dd10 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a  oc,       0 },..
2dd20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2dd30 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a  column_*() API *
2dd40 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
2dd50 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c  3_column_count",
2dd60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2dd70 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20  olumn_count  ,0 
2dd80 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2dd90 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20  e3_data_count", 
2dda0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2ddb0 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30  data_count    ,0
2ddc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ddd0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22  te3_column_type"
2dde0 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
2ddf0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c  _column_type   ,
2de00 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2de10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
2de20 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2de30 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20  t_column_blob   
2de40 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2de50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
2de60 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65  ble",         te
2de70 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
2de80 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2de90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2dea0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74  t64",          t
2deb0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
2dec0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2ded0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2dee0 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ext",   test_stm
2def0 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
2df00 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2df10 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ext },.     { "s
2df20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2df30 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  me",   test_stmt
2df40 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73  _utf8,  (void*)s
2df50 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
2df60 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  me },.     { "sq
2df70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2df80 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ",    test_stmt_
2df90 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
2dfa0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2dfb0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2dfc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2dfd0 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  s",  test_stmt_i
2dfe0 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c  nt,   (void*)sql
2dff0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2e000 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s},.#ifndef SQLI
2e010 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
2e020 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e030 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2e040 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
2e050 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
2e060 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d  column_decltype}
2e070 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
2e080 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2e090 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20  LUMN_METADATA.{ 
2e0a0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2e0b0 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74  database_name",t
2e0c0 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
2e0d0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2e0e0 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
2e0f0 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
2e100 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
2e110 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
2e120 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
2e130 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
2e140 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
2e150 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2e160 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
2e170 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
2e180 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
2e190 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69  ame},.#endif..#i
2e1a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2e1b0 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
2e1c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
2e1d0 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74  ytes16", test_st
2e1e0 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73  mt_int, (void*)s
2e1f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
2e200 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20  tes16 },.     { 
2e210 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2e220 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73  text16",  test_s
2e230 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2e240 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2e250 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b  _text16},.     {
2e260 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2e270 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f  _name16",  test_
2e280 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
2e290 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2e2a0 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20  n_name16},.     
2e2b0 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  { "add_alignment
2e2c0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
2e2d0 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  ", add_alignment
2e2e0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
2e2f0 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e  , 0      },.#ifn
2e300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e310 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20  DECLTYPE.     { 
2e320 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2e330 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74  decltype16",test
2e340 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69  _stmt_utf16,(voi
2e350 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2e360 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23  n_decltype16},.#
2e370 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2e380 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
2e390 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c  N_METADATA.{"sql
2e3a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
2e3b0 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20  base_name16",.  
2e3c0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2e3d0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2e3e0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
2e3f0 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
2e400 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
2e410 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74  name16", test_st
2e420 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
2e430 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2e440 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  table_name16},.{
2e450 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2e460 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20  origin_name16", 
2e470 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2e480 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2e490 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
2e4a0 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65  me16},.#endif.#e
2e4b0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2e4c0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
2e4d0 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ation_v2", test_
2e4e0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
2e4f0 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  _v2, 0 },.     {
2e500 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c   "sqlite3_global
2e510 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74  _recover",     t
2e520 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
2e530 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  er, 0   },.     
2e540 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  { "working_64bit
2e550 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2e560 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
2e570 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
2e580 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74   { "vfs_unlink_t
2e590 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  est",           
2e5a0 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
2e5b0 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
2e5c0 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69    { "vfs_initfai
2e5d0 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  l_test",        
2e5e0 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74    vfs_initfail_t
2e5f0 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  est,   0   },.  
2e600 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69     { "vfs_unregi
2e610 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
2e620 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
2e630 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
2e640 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67      { "vfs_rereg
2e650 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
2e660 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74      vfs_reregist
2e670 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
2e680 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
2e690 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  trol_test",     
2e6a0 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f       file_contro
2e6b0 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
2e6c0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2e6d0 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
2e6e0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
2e6f0 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
2e700 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
2e710 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2e720 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22  _lockproxy_test"
2e730 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  , file_control_l
2e740 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20  ockproxy_test,  
2e750 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2e760 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
2e770 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c  ksize_test", fil
2e780 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
2e790 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  ize_test,  0   }
2e7a0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2e7b0 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
2e7c0 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e  test",  file_con
2e7d0 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
2e7e0 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  st,   0   },.   
2e7f0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2e800 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
2e810 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2e820 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20  win32_av_retry, 
2e830 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e840 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
2e850 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66 69  sist_wal",    fi
2e860 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
2e870 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20 20  st_wal,     0   
2e880 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2e890 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
2e8a0 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69 6c  e_overwrite",fil
2e8b0 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
2e8c0 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d  afe_overwrite,0}
2e8d0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2e8e0 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c  ontrol_vfsname",
2e8f0 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
2e900 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20  trol_vfsname,   
2e910 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20        0   },.   
2e920 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2e930 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 22 2c  l_tempfilename",
2e940 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
2e950 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20 20 20  tempfilename,   
2e960 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e970 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
2e980 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66 73  ",           vfs
2e990 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20 7d  _list,     0   }
2e9a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e9b0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2e9c0 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61  n_v2", test_crea
2e9d0 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20  te_function_v2, 
2e9e0 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75  0 },..     /* Fu
2e9f0 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e  nctions from os.
2ea00 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  h */.#ifndef SQL
2ea10 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
2ea20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
2ea30 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20  collate",       
2ea40 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30   test_collate, 0
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ea60 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
2ea70 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c  collate_needed",
2ea80 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
2ea90 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20  eded, 0     },. 
2eaa0 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
2eab0 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
2eac0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20   test_function, 
2ead0 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  0           },. 
2eae0 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
2eaf0 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
2eb00 22 2c 20 20 20 20 74 65 73 74 5f 75 74 66 31 36  ",    test_utf16
2eb10 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  bin_collate, 0  
2eb20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
2eb30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2eb40 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
2eb50 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
2eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2eb70 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
2eb80 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
2eb90 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
2eba0 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
2ebb0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ebc0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2ebd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ebe0 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
2ebf0 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
2ec00 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
2ec10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ec20 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
2ec30 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
2ec40 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
2ec50 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
2ec60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ec70 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
2ec80 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
2ec90 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
2eca0 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
2ecb0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
2ecc0 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22  ETADATA.     { "
2ecd0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2ece0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
2ecf0 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
2ed00 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
2ed10 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
2ed20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2ed30 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71  RBLOB.     { "sq
2ed40 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
2ed50 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ,   test_blob_re
2ed60 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
2ed70 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
2ed80 72 69 74 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  rite",  test_blo
2ed90 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 20  b_write, 0  },. 
2eda0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2edb0 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73  lob_reopen", tes
2edc0 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30  t_blob_reopen, 0
2edd0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2ede0 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 22  ite3_blob_bytes"
2edf0 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74  ,  test_blob_byt
2ee00 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  es, 0  },.     {
2ee10 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63   "sqlite3_blob_c
2ee20 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  lose",  test_blo
2ee30 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d 2c 0a 23  b_close, 0  },.#
2ee40 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63  endif.     { "pc
2ee50 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20  ache_stats",    
2ee60 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73     test_pcache_s
2ee70 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64  tats, 0  },.#ifd
2ee80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ee90 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
2eea0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
2eeb0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74  nlock_notify", t
2eec0 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
2eed0 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  y, 0  },.#endif.
2eee0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2eef0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c  wal_checkpoint",
2ef00 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63     test_wal_chec
2ef10 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
2ef20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
2ef30 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22  l_checkpoint_v2"
2ef40 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70  ,test_wal_checkp
2ef50 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20  oint_v2, 0  },. 
2ef60 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c 69      { "test_sqli
2ef70 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20  te3_log",       
2ef80 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
2ef90 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  og, 0  },.#ifnde
2efa0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2efb0 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70 72  PLAIN.     { "pr
2efc0 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72  int_explain_quer
2efd0 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72  y_plan", test_pr
2efe0 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23  int_eqp, 0  },.#
2eff0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2f000 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2f010 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f 63  ol", test_test_c
2f020 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53 51  ontrol },.#if SQ
2f030 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20 20  LITE_OS_UNIX.   
2f040 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22 2c    { "getrusage",
2f050 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65 20   test_getrusage 
2f060 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2f070 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78   "load_static_ex
2f080 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61  tension", tclLoa
2f090 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e  dStaticExtension
2f0a0 43 6d 64 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  Cmd },.  };.  st
2f0b0 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
2f0c0 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
2f0d0 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74  itmask)*8;.  int
2f0e0 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   i;.  extern int
2f0f0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
2f100 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c  unt, sqlite3_ful
2f110 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65  lsync_count;.  e
2f120 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2f130 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
2f140 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2f150 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
2f160 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2f170 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
2f180 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2f190 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2f1a0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a  r_readdb_count;.
2f1b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2f1c0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2f1d0 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
2f1e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
2f1f0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
2f200 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  t;.#if SQLITE_OS
2f210 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e  _WIN.  extern in
2f220 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2f230 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e;.#endif.#ifdef
2f240 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2f250 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2f260 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
2f270 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2f280 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74  e3OSTrace;.  ext
2f290 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
2f2a0 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  alTrace;.#endif.
2f2b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2f2c0 53 54 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ST.#ifdef SQLITE
2f2d0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65  _ENABLE_FTS3.  e
2f2e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2f2f0 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
2f300 72 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69  rentheses;.#endi
2f310 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28  f.#endif..  for(
2f320 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43  i=0; i<sizeof(aC
2f330 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b  md)/sizeof(aCmd[
2f340 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
2f350 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
2f360 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d  (interp, aCmd[i]
2f370 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e  .zName, aCmd[i].
2f380 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
2f390 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
2f3a0 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73  izeof(aObjCmd)/s
2f3b0 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d  izeof(aObjCmd[0]
2f3c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
2f3d0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2f3e0 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d  d(interp, aObjCm
2f3f0 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  d[i].zName, .   
2f400 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e       aObjCmd[i].
2f410 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69  xProc, aObjCmd[i
2f420 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29  ].clientData, 0)
2f430 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ;.  }.  Tcl_Link
2f440 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2f450 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  ite_search_count
2f460 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2f470 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  )&sqlite3_search
2f480 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2f490 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2f4a0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2f4b0 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  lite_found_count
2f4c0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2f4d0 29 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  )&sqlite3_found_
2f4e0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2f4f0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2f500 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2f510 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c  ite_sort_count",
2f520 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2f530 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
2f540 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
2f550 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2f560 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2f570 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c  3_max_blobsize",
2f580 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2f590 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
2f5a0 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  size, TCL_LINK_I
2f5b0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2f5c0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f5d0 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20  te_like_count", 
2f5e0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2f5f0 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
2f600 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2f610 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2f620 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2f630 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22  interrupt_count"
2f640 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2f650 26 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75  &sqlite3_interru
2f660 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  pt_count, TCL_LI
2f670 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2f680 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f690 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
2f6a0 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
2f6b0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2f6c0 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c  open_file_count,
2f6d0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2f6e0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2f6f0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75  terp, "sqlite_cu
2f700 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20  rrent_time", .  
2f710 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2f720 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2f730 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f740 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
2f750 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f  NIX && defined(_
2f760 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2f770 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f780 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c  NG_STYLE.  Tcl_L
2f790 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f7a0 73 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75  sqlite_hostid_nu
2f7b0 6d 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  m", .      (char
2f7c0 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  *)&sqlite3_hosti
2f7d0 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  d_num, TCL_LINK_
2f7e0 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  INT);.#endif.  T
2f7f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2f800 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72  p, "sqlite3_xfer
2f810 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  opt_count",.    
2f820 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2f830 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c  3_xferopt_count,
2f840 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2f850 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2f860 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
2f870 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2f880 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
2f890 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
2f8a0 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43  readdb_count, TC
2f8b0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2f8c0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2f8d0 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65  p, "sqlite3_page
2f8e0 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22  r_writedb_count"
2f8f0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2f900 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2f910 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  itedb_count, TCL
2f920 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2f930 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f940 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
2f950 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a  _writej_count",.
2f960 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f970 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2f980 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ej_count, TCL_LI
2f990 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66  NK_INT);.#ifndef
2f9a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2f9b0 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
2f9c0 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67  (interp, "unalig
2f9d0 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
2f9e0 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  er",.      (char
2f9f0 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  *)&unaligned_str
2fa00 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c  ing_counter, TCL
2fa10 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
2fa20 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
2fa30 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54  E_OMIT_UTF16.  T
2fa40 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2fa50 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f  p, "sqlite_last_
2fa60 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e  needed_collation
2fa70 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2fa80 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  &pzNeededCollati
2fa90 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  on, TCL_LINK_STR
2faa0 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
2fab0 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  D_ONLY);.#endif.
2fac0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2fad0 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  N.  Tcl_LinkVar(
2fae0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2faf0 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20  os_type",.      
2fb00 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2fb10 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e  os_type, TCL_LIN
2fb20 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
2fb30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2fb40 54 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  T.  {.    static
2fb50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65   const char *que
2fb60 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f  ry_plan = "*** O
2fb70 42 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45  BSOLETE VARIABLE
2fb80 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c   ***";.    Tcl_L
2fb90 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2fba0 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61  sqlite_query_pla
2fbb0 6e 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72  n",.       (char
2fbc0 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54  *)&query_plan, T
2fbd0 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
2fbe0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
2fbf0 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  Y);.  }.#endif.#
2fc00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2fc10 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
2fc20 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2fc30 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
2fc40 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2fc50 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
2fc60 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2fc70 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2fc80 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
2fc90 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
2fca0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
2fcb0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2fcc0 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
2fcd0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54  ITE_OMIT_WAL.  T
2fce0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2fcf0 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74  p, "sqlite_wal_t
2fd00 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
2fd10 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54  ar*)&sqlite3WalT
2fd20 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2fd30 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  NT);.#endif.#end
2fd40 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
2fd50 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
2fd60 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2fd70 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
2fd80 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
2fd90 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2fda0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
2fdb0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2fdc0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
2fdd0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2fde0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
2fdf0 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
2fe00 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
2fe10 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
2fe20 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
2fe30 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
2fe40 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2fe50 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
2fe60 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
2fe70 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
2fe80 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
2fe90 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2fea0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2feb0 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
2fec0 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
2fed0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2fee0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2fef0 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
2ff00 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
2ff10 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2ff20 74 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  te_data_director
2ff30 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  y",.      (char*
2ff40 29 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  )&sqlite3_data_d
2ff50 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49  irectory, TCL_LI
2ff60 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63  NK_STRING);.  Tc
2ff70 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2ff80 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22  , "bitmask_size"
2ff90 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2ffa0 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43  bitmask_size, TC
2ffb0 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c  L_LINK_INT|TCL_L
2ffc0 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
2ffd0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2ffe0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79  terp, "sqlite_sy
2fff0 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  nc_count",.     
30000 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
30010 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sync_count, TCL
30020 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
30030 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
30040 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79  , "sqlite_fullsy
30050 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  nc_count",.     
30060 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
30070 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c  _fullsync_count,
30080 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
30090 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
300a0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
300b0 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
300c0 45 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69  E_TEST).  Tcl_Li
300d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
300e0 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c  qlite_fts3_enabl
300f0 65 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a  e_parentheses",.
30100 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
30110 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
30120 65 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54  e_parentheses, T
30130 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
30140 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
30150 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.