/ Hex Artifact Content
Login

Artifact ca2a9870a6654dd6d5b8fe5666e64ac31b6647f2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0240: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0250: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0260: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
0290: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02a0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02b0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02c0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
02d0: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
02e0: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
02f0: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0300: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0310: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0320: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0330: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0340: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0350: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0360: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
0370: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
0380: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
0390: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03b0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03c0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
03d0: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
03e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
03f0: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0400: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0410: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0420: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0430: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0440: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0450: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0460: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
0470: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
0480: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
0490: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04a0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04b0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04c0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
04d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
04e0: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
04f0: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0500: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0510: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0520: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0530: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0540: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0550: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0560: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
0570: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
0580: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
0590: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05a0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05c0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
05d0: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
05e0: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
05f0: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0600: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0610: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0620: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0630: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0640: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0650: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0660: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
0670: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
0680: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
0690: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06a0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06b0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06c0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
06d0: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
06e0: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
06f0: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0700: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0710: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0720: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0730: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0740: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0750: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0760: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
0770: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
0780: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
0790: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07b0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07c0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
07d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
07e0: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
07f0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0800: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0810: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0820: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0830: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0840: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0850: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0860: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
0870: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
0880: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
0890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08a0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08b0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08c0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
08d0: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
08e0: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
08f0: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0900: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0910: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0920: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0930: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0950: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0960: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
0970: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0980: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0990: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09a0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09b0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09c0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
09d0: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
09e0: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
09f0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a00: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a10: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a20: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a30: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a40: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a50: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a60: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0a70: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0a80: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0a90: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0aa0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ab0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0ac0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0ad0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 63 6f 6e 73 74  CL_OK;.}...const
0ae0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 54 65   char *sqlite3Te
0af0: 73 74 45 72 72 6f 72 4e 61 6d 65 28 69 6e 74 20  stErrorName(int 
0b00: 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  rc){.  const cha
0b10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20  r *zName = 0;.  
0b20: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
0b30: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b    case SQLITE_OK
0b40: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
0b50: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0b60: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
0b70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0b80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
0b90: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
0ba0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0bb0: 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20  TE_ERROR";      
0bc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0bd0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0be0: 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20  TERNAL:         
0bf0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c00: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
0c10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
0c30: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
0c40: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0c50: 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20  TE_PERM";       
0c60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0c70: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
0c80: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
0c90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ca0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
0cb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55    case SQLITE_BU
0cd0: 53 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  SY:             
0ce0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0cf0: 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20  TE_BUSY";       
0d00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d20: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
0d30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0d40: 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  TE_LOCKED";     
0d50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0d60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
0d70: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0d80: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
0d90: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
0da0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
0db0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0dc0: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
0dd0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0de0: 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  TE_NOMEM";      
0df0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
0e10: 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20  ADONLY:         
0e20: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e30: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
0e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0e50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
0e60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
0e70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0e80: 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20  TE_INTERRUPT";  
0e90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ea0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
0eb0: 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ERR:            
0ec0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0ed0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
0ee0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0ef0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
0f00: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
0f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f20: 54 45 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20  TE_CORRUPT";    
0f30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
0f50: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
0f60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0f70: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
0f80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0f90: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55    case SQLITE_FU
0fa0: 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  LL:             
0fb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
0fc0: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
0fd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
0fe0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
0ff0: 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20  NTOPEN:         
1000: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1010: 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20  TE_CANTOPEN";   
1020: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
1040: 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20  OTOCOL:         
1050: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1060: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
1070: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1080: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
1090: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
10a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
10b0: 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20  TE_EMPTY";      
10c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
10e0: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
10f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1100: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
1110: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
1130: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
1140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1150: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
1160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1170: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1180: 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20 20  NSTRAINT:       
1190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
11b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11c0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
11d0: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 3a  NSTRAINT_UNIQUE:
11e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
11f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e  TE_CONSTRAINT_UN
1200: 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  IQUE"; break;.  
1210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1220: 4e 53 54 52 41 49 4e 54 5f 52 41 49 53 45 3a 20  NSTRAINT_RAISE: 
1230: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
1240: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 41  TE_CONSTRAINT_RA
1250: 49 53 45 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ISE";  break;.  
1260: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
1270: 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
1280: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
12b0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12c0: 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b 20 62 72  _FOREIGNKEY"; br
12d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
12e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
12f0: 43 48 45 43 4b 3a 20 20 20 20 7a 4e 61 6d 65 20  CHECK:    zName 
1300: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
1310: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
1320: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1330: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
1340: 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20  PRIMARYKEY:.    
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
1370: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
1380: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
1390: 45 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EY"; break;.    
13a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
13b0: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20  TRAINT_NOTNULL: 
13c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
13d0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
13e0: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
13f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
1400: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
1410: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
1440: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
1450: 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 62 72 65 61  OMMITHOOK"; brea
1460: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1470: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
1480: 41 42 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  AB:     zName = 
1490: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
14a0: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
14b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
14c0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
14d0: 4e 43 54 49 4f 4e 3a 20 7a 4e 61 6d 65 20 3d 20  NCTION: zName = 
14e0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
14f0: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 62 72 65  NT_FUNCTION";bre
1500: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1510: 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20  ITE_MISMATCH:   
1520: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1530: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
1540: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
1550: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1560: 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20  ITE_MISUSE:     
1570: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1580: 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22   "SQLITE_MISUSE"
1590: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
15a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
15b0: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
15c0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
15d0: 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b   "SQLITE_NOLFS";
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
15f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1600: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
1610: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1620: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1640: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1650: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
1660: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1670: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
1680: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
1690: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
16a0: 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20  ITE_RANGE:      
16b0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
16c0: 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b   "SQLITE_RANGE";
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
16e0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
16f0: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
1700: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1710: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22   "SQLITE_NOTADB"
1720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
1730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1740: 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20  ITE_ROW:        
1750: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1760: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1780: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1790: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
17a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
17b0: 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20   "SQLITE_DONE"; 
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
17d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
17e0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
17f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1800: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
1810: 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65  EAD";        bre
1820: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1830: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1840: 52 45 41 44 3a 20 20 20 20 7a 4e 61 6d 65 20 3d  READ:    zName =
1850: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
1860: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
1870: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1880: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a  ITE_IOERR_WRITE:
1890: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
18a0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57   "SQLITE_IOERR_W
18b0: 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65  RITE";       bre
18c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
18d0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a  ITE_IOERR_FSYNC:
18e0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
18f0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
1900: 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65  SYNC";       bre
1910: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1920: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
1930: 59 4e 43 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  YNC:     zName =
1940: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
1950: 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65  IR_FSYNC";   bre
1960: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1970: 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
1980: 54 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  TE:      zName =
1990: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
19a0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
19b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
19c0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
19d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
19e0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
19f0: 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65  STAT";       bre
1a00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1a10: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
1a20: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
1a30: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
1a40: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
1a50: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1a60: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
1a70: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
1a80: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
1a90: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
1aa0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1ab0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
1ac0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
1ad0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44   "SQLITE_IOERR_D
1ae0: 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72 65  ELETE";      bre
1af0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1b00: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
1b10: 44 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  D:       zName =
1b20: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42   "SQLITE_IOERR_B
1b30: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65  LOCKED";     bre
1b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1b50: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
1b60: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
1b70: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e   "SQLITE_IOERR_N
1b80: 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65  OMEM";       bre
1b90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1ba0: 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1bb0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
1bc0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
1bd0: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      bre
1be0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1bf0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
1c00: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
1c30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
1c40: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
1c50: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
1c60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
1c70: 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20  RR_LOCK:        
1c80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1c90: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
1ca0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cb0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
1cc0: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
1cd0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1ce0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
1cf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
1d10: 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20  DONLY_RECOVERY: 
1d20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1d30: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
1d40: 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERY"; break;.   
1d50: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
1d60: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
1d70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1d80: 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c  E_READONLY_CANTL
1d90: 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  OCK"; break;.   
1da0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
1dd0: 45 5f 55 6e 6b 6e 6f 77 6e 22 3b 20 20 20 20 20  E_Unknown";     
1de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
1df0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
1e00: 0a 7d 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72  .}.#define t1Err
1e10: 6f 72 4e 61 6d 65 20 73 71 6c 69 74 65 33 54 65  orName sqlite3Te
1e20: 73 74 45 72 72 6f 72 4e 61 6d 65 0a 0a 2f 2a 0a  stErrorName../*.
1e30: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
1e40: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
1e50: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
1e60: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
1e70: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
1e80: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
1e90: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1ea0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
1eb0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
1ec0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
1ed0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
1ee0: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
1ef0: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
1f00: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
1f10: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
1f20: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
1f30: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1f40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f50: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
1f60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1f70: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1f80: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
1f90: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
1fa0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
1fb0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
1fc0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
1fd0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
1fe0: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
1ff0: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
2000: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
2010: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
2020: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
2030: 66 2c 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25  f, "error code %
2040: 73 20 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20  s (%d) does not 
2050: 6d 61 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72  match sqlite3_er
2060: 72 63 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a  rcode %s (%d)",.
2070: 20 20 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61         t1ErrorNa
2080: 6d 65 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72  me(rc), rc, t1Er
2090: 72 6f 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29  rorName(r2), r2)
20a0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
20b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
20c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
20e0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
20f0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63   0;.}../*.** Dec
2110: 6f 64 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ode a pointer to
2120: 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   an sqlite3_stmt
2130: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
2140: 69 63 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f  ic int getStmtPo
2150: 69 6e 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74  inter(.  Tcl_Int
2160: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20  erp *interp, .  
2170: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
2180: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ,  .  sqlite3_st
2190: 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20  mt **ppStmt.){. 
21a0: 20 2a 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69   *ppStmt = (sqli
21b0: 74 65 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65  te3_stmt*)sqlite
21c0: 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a  3TestTextToPtr(z
21d0: 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Arg);.  return T
21e0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
21f0: 47 65 6e 65 72 61 74 65 20 61 20 74 65 78 74 20  Generate a text 
2200: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2210: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  f a pointer that
2220: 20 63 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f   can be understo
2230: 6f 64 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74  od.** by the get
2240: 44 62 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65  DbPointer and ge
2250: 74 56 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69  tVmPointer routi
2260: 6e 65 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a  nes above..**.**
2270: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c   The problem is,
2280: 20 6f 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65   on some machine
2290: 73 20 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79  s (Solaris) if y
22a0: 6f 75 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77  ou do a printf w
22b0: 69 74 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20  ith.** "%p" you 
22c0: 63 61 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75  cannot turn arou
22d0: 6e 64 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e  nd and do a scan
22e0: 66 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  f with the same 
22f0: 22 25 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20  "%p" and.** get 
2300: 79 6f 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63  your pointer bac
2310: 6b 2e 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20  k.  You have to 
2320: 70 72 65 70 65 6e 64 20 61 20 22 30 78 22 20 62  prepend a "0x" b
2330: 65 66 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a  efore it will.**
2340: 20 77 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65   work.  Or at le
2350: 61 73 74 20 74 68 61 74 20 69 73 20 77 68 61 74  ast that is what
2360: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20   is reported to 
2370: 6d 65 20 28 64 72 68 29 2e 20 20 42 75 74 20 74  me (drh).  But t
2380: 68 69 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20  his.** behavior 
2390: 76 61 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68  varies from mach
23a0: 69 6e 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20  ine to machine. 
23b0: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73   The solution us
23c0: 65 64 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20  ed her is.** to 
23d0: 74 65 73 74 20 74 68 65 20 73 74 72 69 6e 67 20  test the string 
23e0: 72 69 67 68 74 20 61 66 74 65 72 20 69 74 20 69  right after it i
23f0: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73  s generated to s
2400: 65 65 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a  ee if it can be.
2410: 2a 2a 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79  ** understood by
2420: 20 73 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e   scanf, and if n
2430: 6f 74 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69  ot, try prependi
2440: 6e 67 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65  ng an "0x" to se
2450: 65 20 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c  e if.** that hel
2460: 70 73 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20  ps.  If nothing 
2470: 77 6f 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65  works, a fatal e
2480: 72 72 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65  rror is generate
2490: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
24a0: 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
24b0: 53 74 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  Str(Tcl_Interp *
24c0: 69 6e 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50  interp, char *zP
24d0: 74 72 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20  tr, void *p){.  
24e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24f0: 28 31 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22  (100, zPtr, "%p"
2500: 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , p);.  return T
2510: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2520: 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  The callback rou
2530: 74 69 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33  tine for sqlite3
2540: 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a  _exec_printf()..
2550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
2560: 65 63 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69  ec_printf_cb(voi
2570: 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67  d *pArg, int arg
2580: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20  c, char **argv, 
2590: 63 68 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20  char **name){.  
25a0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72  Tcl_DString *str
25b0: 20 3d 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a   = (Tcl_DString*
25c0: 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  )pArg;.  int i;.
25d0: 0a 20 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69  .  if( Tcl_DStri
25e0: 6e 67 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30  ngLength(str)==0
25f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2600: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
2610: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
2620: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
2630: 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d  r, name[i] ? nam
2640: 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  e[i] : "NULL");.
2650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
2660: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
2670: 29 7b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ){.    Tcl_DStri
2680: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
2690: 73 74 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61  str, argv[i] ? a
26a0: 72 67 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29  rgv[i] : "NULL")
26b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
26c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49  ;.}../*.** The I
26d0: 2f 4f 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62  /O tracing callb
26e0: 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66  ack..*/.#if !def
26f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2700: 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e  _TRACE) && defin
2710: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2720: 5f 49 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63  _IOTRACE).static
2730: 20 46 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66   FILE *iotrace_f
2740: 69 6c 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ile = 0;.static 
2750: 76 6f 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61  void io_trace_ca
2760: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61  llback(const cha
2770: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2780: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2790: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
27a0: 46 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69  Format);.  vfpri
27b0: 6e 74 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ntf(iotrace_file
27c0: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
27d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
27e0: 66 66 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66  fflush(iotrace_f
27f0: 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ile);.}.#endif..
2800: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f  /*.** Usage:  io
2810: 5f 74 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a  _trace FILENAME.
2820: 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74  **.** Turn I/O t
2830: 72 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  racing on or off
2840: 2e 20 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69  .  If FILENAME i
2850: 73 20 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73  s not an empty s
2860: 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72  tring,.** I/O tr
2870: 61 63 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69  acing begins goi
2880: 6e 67 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45  ng into FILENAME
2890: 2e 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73  . If FILENAME is
28a0: 20 61 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72   an empty.** str
28b0: 69 6e 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67  ing, I/O tracing
28c0: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a   is turned off..
28d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
28e0: 73 74 5f 69 6f 5f 74 72 61 63 65 28 0a 20 20 76  st_io_trace(.  v
28f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2900: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2910: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2920: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2930: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2940: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2950: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2970: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2980: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2990: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
29a0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
29b0: 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  */.){.#if !defin
29c0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
29d0: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
29e0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
29f0: 4f 54 52 41 43 45 29 0a 20 20 69 66 28 20 61 72  OTRACE).  if( ar
2a00: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
2a10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a20: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2a30: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2a40: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
2a50: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
2a60: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
2a70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a80: 20 20 7d 0a 20 20 69 66 28 20 69 6f 74 72 61 63    }.  if( iotrac
2a90: 65 5f 66 69 6c 65 20 29 7b 0a 20 20 20 20 69 66  e_file ){.    if
2aa0: 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d  ( iotrace_file!=
2ab0: 73 74 64 6f 75 74 20 26 26 20 69 6f 74 72 61 63  stdout && iotrac
2ac0: 65 5f 66 69 6c 65 21 3d 73 74 64 65 72 72 20 29  e_file!=stderr )
2ad0: 7b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 69  {.      fclose(i
2ae0: 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 20 20  otrace_file);.  
2af0: 20 20 7d 0a 20 20 20 20 69 6f 74 72 61 63 65 5f    }.    iotrace_
2b00: 66 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 71  file = 0;.    sq
2b10: 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
2b20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 76  ;.  }.  if( argv
2b30: 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  [1][0] ){.    if
2b40: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d  ( strcmp(argv[1]
2b50: 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30 20 29 7b  ,"stdout")==0 ){
2b60: 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66  .      iotrace_f
2b70: 69 6c 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  ile = stdout;.  
2b80: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2b90: 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 65  mp(argv[1],"stde
2ba0: 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rr")==0 ){.     
2bb0: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
2bc0: 73 74 64 65 72 72 3b 0a 20 20 20 20 7d 65 6c 73  stderr;.    }els
2bd0: 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65  e{.      iotrace
2be0: 5f 66 69 6c 65 20 3d 20 66 6f 70 65 6e 28 61 72  _file = fopen(ar
2bf0: 67 76 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20  gv[1], "w");.   
2c00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f   }.    sqlite3Io
2c10: 54 72 61 63 65 20 3d 20 69 6f 5f 74 72 61 63 65  Trace = io_trace
2c20: 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23  _callback;.  }.#
2c30: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
2c40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
2c50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
2c60: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
2c70: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
2c80: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
2c90: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
2ca0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
2cb0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
2cc0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
2cd0: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
2ce0: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
2cf0: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
2d00: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
2d10: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
2d20: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
2d30: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
2d40: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
2d50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2d60: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
2d70: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2d80: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2d90: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2da0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2db0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2dc0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2dd0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2de0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2df0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2e00: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2e10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2e20: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2e30: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2e40: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2e50: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2e60: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2e70: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2e80: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
2e90: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
2ea0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
2eb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2ec0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2ed0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2ee0: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2ef0: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
2f00: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
2f10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2f30: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2f40: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2f50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f60: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
2f70: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
2f80: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
2f90: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
2fa0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
2fb0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2fc0: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2fd0: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2fe0: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2ff0: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
3000: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
3010: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
3020: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3030: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
3040: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3050: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
3060: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
3070: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
3080: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
3090: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
30a0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
30b0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
30c0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
30d0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
30e0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
30f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
3100: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3110: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3120: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
3130: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
3140: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
3150: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
3160: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
3170: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
3180: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
3190: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
31a0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
31b0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
31c0: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
31d0: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
31e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
31f0: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
3200: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3210: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3220: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3230: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3240: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3250: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3260: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3270: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3280: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3290: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
32a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
32b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
32c0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
32d0: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
32e0: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
32f0: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
3300: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
3310: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
3320: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
3330: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
3340: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
3350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3360: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3370: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3380: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3390: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
33a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
33b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
33c0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
33d0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
33e0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
33f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
3400: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
3410: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
3420: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
3430: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
3440: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
3450: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
3460: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
3470: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
3480: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
3490: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
34a0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
34b0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
34c0: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
34d0: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
34e0: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
34f0: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
3500: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
3510: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
3520: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
3530: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
3540: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
3550: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
3560: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3570: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
3580: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3590: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
35a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
35b0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
35c0: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
35d0: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
35e0: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
35f0: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
3600: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
3610: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
3620: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
3630: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
3640: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
3650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
3660: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3670: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
3680: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
3690: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
36a0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
36b0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
36c0: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
36d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
36e0: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
36f0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3700: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3710: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3720: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3730: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3740: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3750: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3770: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3780: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
37a0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
37b0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
37c0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
37d0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
37e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
37f0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3800: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3810: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
3820: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
3830: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3840: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3850: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3860: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
3870: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
3880: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
3890: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
38a0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
38b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
38c0: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
38d0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
38e0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
38f0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3900: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3910: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3920: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3930: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3950: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3960: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3970: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3980: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3990: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
39a0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
39b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
39c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
39d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
39e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
39f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
3a00: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
3a10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
3a20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
3a30: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
3a40: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
3a50: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
3a60: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
3a70: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
3a80: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
3a90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3aa0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3ab0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
3ac0: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
3ad0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
3ae0: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
3af0: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
3b00: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
3b10: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
3b20: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3b30: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3b40: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3b50: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3b60: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3b70: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3b80: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
3b90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3ba0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
3bb0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3bd0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3be0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
3bf0: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
3c00: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
3c10: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
3c20: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
3c30: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
3c40: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
3c50: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
3c60: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3c70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3c80: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3c90: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3ca0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
3cb0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
3cc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3cd0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
3ce0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
3cf0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
3d00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3d10: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
3d20: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
3d30: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
3d40: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
3d50: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
3d60: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
3d70: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
3d80: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
3d90: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
3da0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
3db0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
3dc0: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
3dd0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
3de0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3df0: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
3e00: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
3e10: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
3e20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
3e30: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
3e40: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
3e50: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
3e60: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
3e70: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
3e80: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
3e90: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
3ea0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
3eb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3ec0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
3ed0: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
3ee0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
3ef0: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
3f00: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
3f10: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
3f20: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
3f30: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
3f40: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
3f50: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
3f60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3f70: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
3f80: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3f90: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
3fa0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
3fb0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3fc0: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3fd0: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3fe0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3ff0: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
4000: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
4010: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
4020: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
4030: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4040: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4050: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4060: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4070: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4080: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40a0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
40b0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
40c0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
40d0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
40e0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
40f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4100: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
4110: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
4120: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
4130: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4140: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4150: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4160: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
4170: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
4180: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4190: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
41a0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
41b0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
41c0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
41d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
41e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
41f0: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
4200: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
4210: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
4220: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
4230: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
4240: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
4250: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4260: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4270: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
4280: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
4290: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
42a0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
42b0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
42c0: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
42d0: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
42e0: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
42f0: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
4300: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
4310: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
4320: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
4330: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
4340: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
4350: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
4360: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
4370: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4380: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4390: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
43a0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
43b0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
43c0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
43d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
43e0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
43f0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4400: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4410: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4420: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
4430: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
4440: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
4450: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
4460: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
4470: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
4480: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
4490: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
44a0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
44b0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
44c0: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
44d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
44e0: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
44f0: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
4500: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
4510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4520: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
4530: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
4540: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
4550: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
4560: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
4570: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
4580: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
4590: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
45a0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
45b0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
45c0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
45d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
45e0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
45f0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4600: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4610: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4620: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4630: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4640: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4650: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4660: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4670: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4680: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
4690: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
46a0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
46b0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
46c0: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
46d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
46e0: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
46f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
4700: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
4710: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
4720: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4730: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
4740: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
4750: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
4760: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
4770: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
4780: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
4790: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
47a0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
47b0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
47c0: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
47d0: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
47e0: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
47f0: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
4800: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
4810: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
4820: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
4830: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
4840: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
4850: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
4860: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
4870: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
4880: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
4890: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
48a0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
48b0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
48c0: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
48d0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
48e0: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
48f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4910: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4920: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
4930: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
4940: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
4950: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
4960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
4970: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4980: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4990: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
49a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
49b0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
49c0: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
49d0: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
49e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
49f0: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
4a00: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
4a10: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
4a20: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
4a30: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
4a40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
4a50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
4a60: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
4a70: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
4a80: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
4a90: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
4aa0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
4ab0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
4ac0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
4ad0: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
4ae0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
4af0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4b00: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
4b10: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
4b20: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
4b30: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
4b40: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
4b50: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
4b60: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
4b70: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
4b80: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
4b90: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
4ba0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
4bb0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
4bc0: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
4bd0: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
4be0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
4bf0: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
4c00: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
4c10: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
4c20: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
4c30: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
4c40: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
4c50: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4c60: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4c70: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4c80: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4c90: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
4ca0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
4cb0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
4cc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4cd0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
4ce0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
4cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4d00: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4d10: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4d20: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
4d30: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
4d40: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
4d50: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
4d60: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
4d70: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
4d80: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
4d90: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
4da0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
4db0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
4dc0: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
4dd0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
4de0: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
4df0: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
4e00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
4e10: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
4e20: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
4e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
4e70: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
4e80: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
4e90: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4ea0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4eb0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4ec0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4ed0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4ee0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4ef0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
4f00: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
4f10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
4f20: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
4f30: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
4f40: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4f50: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
4f60: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
4f70: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
4f80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
4f90: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
4fa0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
4fb0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4fc0: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4fd0: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4fe0: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4ff0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
5000: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
5010: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
5020: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
5030: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
5040: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
5050: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
5060: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
5070: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
5080: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
5090: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
50a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
50b0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
50c0: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
50d0: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
50e0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
50f0: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
5100: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
5110: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
5120: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
5130: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5140: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
5150: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
5160: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
5170: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
5180: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5190: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
51a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
51b0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
51c0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
51d0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
51e0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
51f0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
5200: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
5210: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
5220: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
5230: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5240: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
5250: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
5260: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
5270: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
5280: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
5290: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
52a0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
52b0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
52c0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
52d0: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
52e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
52f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5300: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5310: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5320: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5330: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5340: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5350: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5360: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
5370: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
5380: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
5390: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
53a0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
53b0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
53c0: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
53d0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
53e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
53f0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5400: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5410: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
5420: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
5430: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5440: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
5450: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
5460: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
5470: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
5480: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
5490: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
54a0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
54b0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
54c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
54d0: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
54e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
54f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
5500: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
5510: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
5520: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
5530: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
5540: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
5550: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
5560: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
5570: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
5580: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
5590: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
55a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
55b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
55d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
55f0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
5600: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
5610: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
5620: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
5630: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5640: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
5650: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
5660: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
5670: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
5680: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
5690: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
56a0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
56b0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
56c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
56d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
56e0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
56f0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
5700: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
5710: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
5720: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
5730: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
5740: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
5750: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
5760: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
5770: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
5780: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
5790: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
57a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
57b0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
57c0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
57d0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
57e0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
57f0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
5800: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
5810: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
5820: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
5830: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
5840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5850: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5860: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
5870: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
5880: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
5890: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
58a0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
58b0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
58c0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
58d0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
58e0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
58f0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
5900: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5910: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
5920: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
5930: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5940: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5970: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5980: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
5990: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
59a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
59b0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
59c0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
59d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
59e0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
59f0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
5a00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
5a10: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
5a20: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
5a30: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
5a40: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
5a50: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
5a60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
5a70: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
5a80: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
5a90: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
5aa0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
5ab0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
5ac0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
5ad0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
5ae0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
5af0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5b00: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5b10: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
5b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
5b30: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
5b40: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
5b50: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
5b60: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
5b70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
5b80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
5b90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
5ba0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
5bb0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
5bc0: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
5bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
5be0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
5bf0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
5c00: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
5c10: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
5c20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
5c30: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
5c40: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
5c50: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
5c60: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
5c70: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
5c80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
5c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
5ca0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
5cb0: 20 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75   x_coalesce() fu
5cc0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  nction..** Retur
5cd0: 6e 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  n the first argu
5ce0: 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72  ment non-NULL ar
5cf0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
5d00: 63 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c  c void t1_ifnull
5d10: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
5d20: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
5d30: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
5d40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5d50: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
5d60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
5d70: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
5d80: 28 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  ( SQLITE_NULL!=s
5d90: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
5da0: 65 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20  e(argv[i]) ){.  
5db0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
5dc0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5dd0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  argv[i]);.      
5de0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5df0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68  ext(context, (ch
5e00: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5e10: 65 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c  e_text(argv[i]),
5e20: 0a 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51  .          n, SQ
5e30: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5e40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5e50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
5e60: 20 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20   These are test 
5e70: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65  functions.    he
5e80: 78 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20  x8() interprets 
5e90: 69 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a  its argument as.
5ea0: 2a 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75  ** UTF8 and retu
5eb0: 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69  rns a hex encodi
5ec0: 6e 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69  ng.  hex16le() i
5ed0: 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72  nterprets its ar
5ee0: 67 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46  gument.** as UTF
5ef0: 31 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73  16le and returns
5f00: 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e   a hex encoding.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 68 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33  hex8Func(sqlite3
5f30: 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  _context *p, int
5f40: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
5f50: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
5f60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5f70: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  har *z;.  int i;
5f80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30  .  char zBuf[200
5f90: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
5fa0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5fb0: 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [0]);.  for(i=0;
5fc0: 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f   i<sizeof(zBuf)/
5fd0: 32 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69  2 - 2 && z[i]; i
5fe0: 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ++){.    sprintf
5ff0: 28 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30  (&zBuf[i*2], "%0
6000: 32 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b  2x", z[i]&0xff);
6010: 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d  .  }.  zBuf[i*2]
6020: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6030: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28  result_text(p, (
6040: 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20  char*)zBuf, -1, 
6050: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
6060: 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  );.}.#ifndef SQL
6070: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
6080: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36  tatic void hex16
6090: 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Func(sqlite3_con
60a0: 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67  text *p, int arg
60b0: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
60c0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73   **argv){.  cons
60d0: 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74  t unsigned short
60e0: 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69   int *z;.  int i
60f0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30  ;.  char zBuf[40
6100: 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  0];.  z = sqlite
6110: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61  3_value_text16(a
6120: 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69  rgv[0]);.  for(i
6130: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75  =0; i<sizeof(zBu
6140: 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d  f)/4 - 4 && z[i]
6150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
6160: 6e 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20  ntf(&zBuf[i*4], 
6170: 22 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66  "%04x", z[i]&0xf
6180: 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69  f);.  }.  zBuf[i
6190: 2a 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  *4] = 0;.  sqlit
61a0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
61b0: 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d  , (char*)zBuf, -
61c0: 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
61d0: 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ENT);.}.#endif..
61e0: 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72  /*.** A structur
61f0: 65 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20  e into which to 
6200: 61 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e  accumulate text.
6210: 0a 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20  .*/.struct dstr 
6220: 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  {.  int nAlloc; 
6230: 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
6240: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73  ted */.  int nUs
6250: 65 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75  ed;   /* Space u
6260: 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  sed */.  char *z
6270: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61  ;     /* The spa
6280: 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ce */.};../*.** 
6290: 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61  Append text to a
62a0: 20 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20   dstr.*/.static 
62b0: 76 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28  void dstrAppend(
62c0: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20  struct dstr *p, 
62d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
62e0: 6e 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69  nt divider){.  i
62f0: 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
6300: 65 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e  en(z);.  if( p->
6310: 6e 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20  nUsed + n + 2 > 
6320: 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p->nAlloc ){.   
6330: 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20   char *zNew;.   
6340: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e   p->nAlloc = p->
6350: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32  nAlloc*2 + n + 2
6360: 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73  00;.    zNew = s
6370: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
6380: 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b  ->z, p->nAlloc);
6390: 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30  .    if( zNew==0
63a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
63b0: 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  3_free(p->z);.  
63c0: 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c      memset(p, 0,
63d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
63e0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
63f0: 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65  }.    p->z = zNe
6400: 77 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76  w;.  }.  if( div
6410: 69 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64  ider && p->nUsed
6420: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70  >0 ){.    p->z[p
6430: 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76  ->nUsed++] = div
6440: 69 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  ider;.  }.  memc
6450: 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65  py(&p->z[p->nUse
6460: 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70  d], z, n+1);.  p
6470: 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a  ->nUsed += n;.}.
6480: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66  ./*.** Invoked f
6490: 6f 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b  or each callback
64a0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65   from sqlite3Exe
64b0: 63 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20  cFunc.*/.static 
64c0: 69 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c  int execFuncCall
64d0: 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61  back(void *pData
64e0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
64f0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
6500: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75  NotUsed){.  stru
6510: 63 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74  ct dstr *p = (st
6520: 72 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61  ruct dstr*)pData
6530: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
6540: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
6550: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76  +){.    if( argv
6560: 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
6570: 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e  dstrAppend(p, "N
6580: 55 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20  ULL", ' ');.    
6590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74  }else{.      dst
65a0: 72 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b  rAppend(p, argv[
65b0: 69 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a  i], ' ');.    }.
65c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
65d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
65e0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78  ntation of the x
65f0: 5f 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66  _sqlite_exec() f
6600: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66  unction.  This f
6610: 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a  unction takes.**
6620: 20 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65   a single argume
6630: 6e 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20  nt and attempts 
6640: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20  to execute that 
6650: 61 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20  argument as SQL 
6660: 63 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  code..** This is
6670: 20 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f   illegal and sho
6680: 75 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49  uld set the SQLI
6690: 54 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f  TE_MISUSE flag o
66a0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
66b0: 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30  **.** 2004-Jan-0
66c0: 37 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e  7:  We have chan
66d0: 67 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65  ged this to make
66e0: 20 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c   it legal to cal
66f0: 6c 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  l sqlite3_exec()
6700: 0a 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  .** from within 
6710: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
6720: 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72    .** .** This r
6730: 6f 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73  outine simulates
6740: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68   the effect of h
6750: 61 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64  aving two thread
6760: 73 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  s attempt to.** 
6770: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6780: 61 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d  abase at the sam
6790: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e time..*/.stati
67a0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  c void sqlite3Ex
67b0: 65 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  ecFunc(.  sqlite
67c0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
67d0: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
67e0: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
67f0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ue **argv.){.  s
6800: 74 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20  truct dstr x;.  
6810: 6d 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69  memset(&x, 0, si
6820: 7a 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69  zeof(x));.  (voi
6830: 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28  d)sqlite3_exec((
6840: 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33  sqlite3*)sqlite3
6850: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
6860: 78 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72  xt),.      (char
6870: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6880: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20  text(argv[0]),. 
6890: 20 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c       execFuncCal
68a0: 6c 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20  lback, &x, 0);. 
68b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
68c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e  text(context, x.
68d0: 7a 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49  z, x.nUsed, SQLI
68e0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
68f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e   sqlite3_free(x.
6900: 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  z);.}../*.** Imp
6910: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
6920: 6b 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20  kt2213func(), a 
6930: 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
6940: 74 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74  that takes exact
6950: 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65  ly.** one argume
6960: 6e 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69  nt. It has two i
6970: 6e 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75  nteresting featu
6980: 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20  res:.**.** * It 
6990: 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61  calls sqlite3_va
69a0: 6c 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d  lue_text() 3 tim
69b0: 65 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65  es on the argume
69c0: 6e 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt sqlite3_value
69d0: 2a 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74  *..**   If the t
69e0: 68 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65  hree pointers re
69f0: 74 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74  turned are not t
6a00: 68 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65  he same an SQL e
6a10: 72 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a  rror is raised..
6a20: 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73  **.** * Otherwis
6a30: 65 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63  e it returns a c
6a40: 6f 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20  opy of the text 
6a50: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
6a60: 66 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75  f its .**   argu
6a70: 6d 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77  ment in such a w
6a80: 61 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72  ay as the VDBE r
6a90: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73  epresentation is
6aa0: 20 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a   a Mem* cell .**
6ab0: 20 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f     with the MEM_
6ac0: 54 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e  Term flag clear.
6ad0: 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23   .**.** Ticket #
6ae0: 32 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f  2213 can therefo
6af0: 72 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20  re be tested by 
6b00: 65 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66  evaluating the f
6b10: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20  ollowing.** SQL 
6b20: 65 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a  expression:.**.*
6b30: 2a 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28  *   tkt2213func(
6b40: 74 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73  tkt2213func('a s
6b50: 74 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61  tring'));.*/.sta
6b60: 74 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33  tic void tkt2213
6b70: 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  Function(.  sqli
6b80: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
6b90: 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67  text, .  int arg
6ba0: 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76  c,  .  sqlite3_v
6bb0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
6bc0: 20 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e   int nText;.  un
6bd0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
6be0: 74 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73  t *zText1;.  uns
6bf0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
6c00: 20 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69   *zText2;.  unsi
6c10: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
6c20: 2a 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78  *zText3;..  nTex
6c30: 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  t = sqlite3_valu
6c40: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6c50: 3b 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c  ;.  zText1 = sql
6c60: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6c70: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
6c80: 74 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t2 = sqlite3_val
6c90: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6ca0: 3b 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c  ;.  zText3 = sql
6cb0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6cc0: 61 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28  argv[0]);..  if(
6cd0: 20 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20   zText1!=zText2 
6ce0: 7c 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74  || zText2!=zText
6cf0: 33 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  3 ){.    sqlite3
6d00: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
6d10: 6e 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20  ntext, "tkt2213 
6d20: 69 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d  is not fixed", -
6d30: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
6d40: 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28   char *zCopy = (
6d50: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d  char *)sqlite3_m
6d60: 61 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20  alloc(nText);.  
6d70: 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20    memcpy(zCopy, 
6d80: 7a 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a  zText1, nText);.
6d90: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
6da0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
6db0: 20 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73   zCopy, nText, s
6dc0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
6dd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  }.}../*.** The f
6de0: 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e  ollowing SQL fun
6df0: 63 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72  ction takes 4 ar
6e00: 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e  guments.  The 2n
6e10: 64 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67  d and.** 4th arg
6e20: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e  ument must be on
6e30: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e  e of these strin
6e40: 67 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65  gs:  'text', 'te
6e50: 78 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c  xt16',.** or 'bl
6e60: 6f 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ob' correspondin
6e70: 67 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f  g to API functio
6e80: 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71  ns.**.**      sq
6e90: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ea0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
6eb0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6ec0: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6ed0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a  3_value_blob().*
6ee0: 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
6ef0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72  rgument is a str
6f00: 69 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74  ing, either 'byt
6f10: 65 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27  es' or 'bytes16'
6f20: 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63   or 'noop',.** c
6f30: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6f40: 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  APIs:.**.**     
6f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
6f60: 79 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73  ytes().**      s
6f70: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6f80: 65 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e  es16().**      n
6f90: 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50  oop.**.** The AP
6fa0: 49 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79  Is designated by
6fb0: 20 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68   the 2nd through
6fc0: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61   4th arguments a
6fd0: 72 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f  re applied.** to
6fe0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
6ff0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49  ent in order.  I
7000: 66 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72  f the pointers r
7010: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a  eturned by the.*
7020: 2a 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75  * second and fou
7030: 72 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e  rth are differen
7040: 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
7050: 72 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65  returns 1.  Othe
7060: 72 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72  rwise,.** this r
7070: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
7080: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
7090: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
70a0: 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
70b0: 6e 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  n returned point
70c0: 65 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  ers from.** the 
70d0: 5f 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36  _text(), _text16
70e0: 28 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41  () and _blob() A
70f0: 50 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  PIs become inval
7100: 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
7110: 63 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75  c void ptrChngFu
7120: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
7130: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7140: 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c  xt, .  int argc,
7150: 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c    .  sqlite3_val
7160: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ue **argv.){.  c
7170: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a  onst void *p1, *
7180: 70 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p2;.  const char
7190: 20 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72   *zCmd;.  if( ar
71a0: 67 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a  gc!=4 ) return;.
71b0: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
71c0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
71d0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
71e0: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
71f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7200: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65   strcmp(zCmd,"te
7210: 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  xt")==0 ){.    p
7220: 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  1 = (const void*
7230: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
7240: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  ext(argv[0]);.#i
7250: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7260: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
7270: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
7280: 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b   "text16")==0 ){
7290: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
72a0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
72b0: 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76  alue_text16(argv
72c0: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
72d0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
72e0: 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30  zCmd, "blob")==0
72f0: 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f   ){.    p1 = (co
7300: 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65  nst void*)sqlite
7310: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
7320: 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  v[0]);.  }else{.
7330: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7340: 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20    zCmd = (const 
7350: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
7360: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d  lue_text(argv[2]
7370: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
7380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7390: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79   strcmp(zCmd,"by
73a0: 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
73b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
73c0: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69  tes(argv[0]);.#i
73d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
73e0: 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20  T_UTF16.  }else 
73f0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
7400: 20 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29   "bytes16")==0 )
7410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
7420: 6c 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76  lue_bytes16(argv
7430: 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  [0]);.#endif.  }
7440: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
7450: 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30  zCmd, "noop")==0
7460: 20 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f   ){.    /* do no
7470: 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65  thing */.  }else
7480: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7490: 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73  }.  zCmd = (cons
74a0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
74b0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
74c0: 33 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d  3]);.  if( zCmd=
74d0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
74e0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22  f( strcmp(zCmd,"
74f0: 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  text")==0 ){.   
7500: 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69   p2 = (const voi
7510: 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  d*)sqlite3_value
7520: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
7530: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7540: 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73  MIT_UTF16.  }els
7550: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
7560: 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20  d, "text16")==0 
7570: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
7580: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
7590: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
75a0: 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20  gv[0]);.#endif. 
75b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
75c0: 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d  p(zCmd, "blob")=
75d0: 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28  =0 ){.    p2 = (
75e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
75f0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
7600: 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65  rgv[0]);.  }else
7610: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
7620: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  }.  sqlite3_resu
7630: 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20  lt_int(context, 
7640: 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p1!=p2);.}.../*.
7650: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
7660: 65 5f 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  e_test_create_fu
7670: 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20  nction DB.**.** 
7680: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7690: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
76a0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
76b0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
76c0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
76d0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
76e0: 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20  d "x_coalesce". 
76f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
7700: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69  oes the same thi
7710: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f  ng.** as the "co
7720: 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e  alesce" function
7730: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7740: 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20   also registers 
7750: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a  an SQL function.
7760: 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69  ** named "x_sqli
7770: 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e  te_exec" that in
7780: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78  vokes sqlite3_ex
7790: 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20  ec().  Invoking 
77a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
77b0: 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73  * in this way is
77c0: 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69   illegal recursi
77d0: 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61  on and should ra
77e0: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
77f0: 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54  SUSE error..** T
7800: 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d  he effect is sim
7810: 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74  ilar to trying t
7820: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
7830: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7840: 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74  on from.** two t
7850: 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61  hreads at the sa
7860: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  me time..**.** T
7870: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
7880: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
7890: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
78a0: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
78b0: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
78c0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75  eate_function fu
78d0: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
78e0: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
78f0: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
7900: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
7910: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
7920: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ion logic..*/.st
7930: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
7940: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
7950: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
7960: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
7970: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
7980: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
7990: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
79a0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
79b0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
79c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
79d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
79e0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
79f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
7a00: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
7a10: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
7a20: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
7a30: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
7a40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7a50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7a60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7a70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7a80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7a90: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
7aa0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7ab0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
7ac0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7ad0: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
7ae0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7af0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7b00: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7b10: 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65  (db, "x_coalesce
7b20: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 41 4e  ", -1, SQLITE_AN
7b30: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74  Y, 0, .        t
7b40: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c  1_ifnullFunc, 0,
7b50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
7b60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7b70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7b80: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7b90: 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49   "hex8", 1, SQLI
7ba0: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7bb0: 20 20 20 20 20 20 68 65 78 38 46 75 6e 63 2c 20        hex8Func, 
7bc0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  0, 0);.  }.#ifnd
7bd0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7be0: 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d 53  TF16.  if( rc==S
7bf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7c00: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7c10: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7c20: 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51 4c   "hex16", 1, SQL
7c30: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20  ITE_ANY, 0, .   
7c40: 20 20 20 20 20 20 20 68 65 78 31 36 46 75 6e 63         hex16Func
7c50: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
7c60: 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
7c70: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7c80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7c90: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7ca0: 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31  "tkt2213func", 1
7cb0: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7cc0: 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32   .          tkt2
7cd0: 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  213Function, 0, 
7ce0: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
7cf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7d00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
7d10: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7d20: 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61  db, "pointer_cha
7d30: 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  nge", 4, SQLITE_
7d40: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
7d50: 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69     ptrChngFuncti
7d60: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  on, 0, 0);.  }..
7d70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d80: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55  MIT_UTF16.  /* U
7d90: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  se the sqlite3_c
7da0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7db0: 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69  () API here. Mai
7dc0: 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74  nly for fun, but
7dd0: 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61   also .  ** beca
7de0: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65  use it is not te
7df0: 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c  sted anywhere el
7e00: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  se. */.  if( rc=
7e10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7e20: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55    const void *zU
7e30: 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65  tf16;.    sqlite
7e40: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
7e50: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
7e60: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
7e70: 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71  );.    pVal = sq
7e80: 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62  lite3ValueNew(db
7e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
7ea0: 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
7eb0: 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78  -1, "x_sqlite_ex
7ec0: 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  ec", SQLITE_UTF8
7ed0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
7ee0: 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73  ;.    zUtf16 = s
7ef0: 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
7f00: 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46  pVal, SQLITE_UTF
7f10: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69  16NATIVE);.    i
7f20: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
7f30: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  led ){.      rc 
7f40: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7f50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7f60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7f70: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28  eate_function16(
7f80: 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20  db, zUtf16, .   
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20               1, 
7fa0: 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62  SQLITE_UTF16, db
7fb0: 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  , sqlite3ExecFun
7fc0: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  c, 0, 0);.    }.
7fd0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
7fe0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20  Free(pVal);.    
7ff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
8000: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8010: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
8020: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
8030: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
8040: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
8050: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
8060: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
8070: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
8080: 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
8090: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
80a0: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  ../*.** Routines
80b0: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
80c0: 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72  e x_count() aggr
80d0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a  egate function..
80e0: 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20  **.** x_count() 
80f0: 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65  counts the numbe
8100: 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72  r of non-null ar
8110: 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68  guments.  But th
8120: 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20  ere are.** some 
8130: 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74 69  twists for testi
8140: 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a  ng purposes..**.
8150: 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  ** If the argume
8160: 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20  nt to x_count() 
8170: 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54 46  is 40 then a UTF
8180: 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  -8 error is repo
8190: 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  rted.** on the s
81a0: 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  tep function.  I
81b0: 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73  f x_count(41) is
81c0: 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54   seen, then a UT
81d0: 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73  F-16 error.** is
81e0: 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65   reported on the
81f0: 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20   step function. 
8200: 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f   If the total co
8210: 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a  unt is 42, then.
8220: 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72  ** a UTF-8 error
8230: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
8240: 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e  the finalize fun
8250: 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65  ction..*/.typede
8260: 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74  f struct t1Count
8270: 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a  Ctx t1CountCtx;.
8280: 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74  struct t1CountCt
8290: 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a  x {.  int n;.};.
82a0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f  static void t1Co
82b0: 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  untStep(.  sqlit
82c0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
82d0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
82e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
82f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43   **argv.){.  t1C
8300: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
8310: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
8320: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
8330: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
8340: 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30  ;.  if( (argc==0
8350: 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21   || SQLITE_NULL!
8360: 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  =sqlite3_value_t
8370: 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26  ype(argv[0]) ) &
8380: 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b  & p ){.    p->n+
8390: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  +;.  }.  if( arg
83a0: 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76  c>0 ){.    int v
83b0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
83c0: 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20  _int(argv[0]);. 
83d0: 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a     if( v==40 ){.
83e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
83f0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8400: 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30  xt, "value of 40
8410: 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75   handed to x_cou
8420: 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65  nt", -1);.#ifnde
8430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
8440: 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  F16.    }else if
8450: 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20  ( v==41 ){.     
8460: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66   const char zUtf
8470: 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30  16ErrMsg[] = { 0
8480: 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c  , 0x61, 0, 0x62,
8490: 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20   0, 0x63, 0, 0, 
84a0: 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0};.      sqlite
84b0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36  3_result_error16
84c0: 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31  (context, &zUtf1
84d0: 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45  6ErrMsg[1-SQLITE
84e0: 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29  _BIGENDIAN], -1)
84f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
8500: 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76   }.}   .static v
8510: 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c  oid t1CountFinal
8520: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8530: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8540: 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a   t1CountCtx *p;.
8550: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67    p = sqlite3_ag
8560: 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28  gregate_context(
8570: 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28  context, sizeof(
8580: 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  *p));.  if( p ){
8590: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34  .    if( p->n==4
85a0: 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
85b0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
85c0: 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e  context, "x_coun
85d0: 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c  t totals to 42",
85e0: 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   -1);.    }else{
85f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
8600: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
8610: 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29  t, p ? p->n : 0)
8620: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23  ;.    }.  }.}..#
8630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8640: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73 74  IT_DEPRECATED.st
8650: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
8660: 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c  CountStep(.  sql
8670: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
8680: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67  ntext,.  int arg
8690: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  c,.  sqlite3_val
86a0: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f  ue **argv.){.  /
86b0: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74  * no-op */.}..st
86c0: 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79  atic void legacy
86d0: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71  CountFinalize(sq
86e0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
86f0: 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74  ontext){.  sqlit
8700: 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f  e3_result_int(co
8710: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61  ntext, sqlite3_a
8720: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63  ggregate_count(c
8730: 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e 64  ontext));.}.#end
8740: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
8750: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
8760: 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a  _aggregate DB.**
8770: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
8780: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8790: 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20  tion API on the 
87a0: 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 69  given database i
87b0: 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72  n order.** to cr
87c0: 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20  eate a function 
87d0: 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e  named "x_count".
87e0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
87f0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
8800: 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f   the built-in co
8810: 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20  unt() function, 
8820: 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63 69  with a few speci
8830: 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f 72  al quirks.** for
8840: 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c   testing the sql
8850: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8860: 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20  r() APIs..**.** 
8870: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
8880: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
8890: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
88a0: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
88b0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
88c0: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20  reate_aggregate 
88d0: 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61  function while a
88e0: 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f   query is in pro
88f0: 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a  gress in order.*
8900: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51  * to test the SQ
8910: 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65  LITE_MISUSE dete
8920: 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65  ction logic.  Se
8930: 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a  e misuse.test..*
8940: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8950: 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74 65  e was later exte
8960: 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  nded to test the
8970: 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f   use of sqlite3_
8980: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a  result_error().*
8990: 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67 61  * within aggrega
89a0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  te functions..**
89b0: 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69 73  .** Later: It is
89c0: 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e 64   now also extend
89d0: 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20 74  ed to register t
89e0: 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  he aggregate fun
89f0: 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63 79  ction.** "legacy
8a00: 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20 74  _count()" with t
8a10: 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74 61  he supplied data
8a20: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
8a30: 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20  s is used.** to 
8a40: 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63 61  test the depreca
8a50: 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72  ted sqlite3_aggr
8a60: 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50  egate_count() AP
8a70: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  I..*/.static int
8a80: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67   test_create_agg
8a90: 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  regate(.  void *
8aa0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8ab0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8ac0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8ad0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8ae0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8af0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8b00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8b10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8b20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8b30: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8b40: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8b50: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8b60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8b70: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
8b80: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8b90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8ba0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8bb0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8bc0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8bd0: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
8be0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
8bf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8c00: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
8c10: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
8c20: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
8c30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8c40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
8c50: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
8c60: 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30 2c  b, "x_count", 0,
8c70: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
8c80: 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75 6e   0,.      t1Coun
8c90: 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e  tStep,t1CountFin
8ca0: 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  alize);.  if( rc
8cb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8cc0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
8cd0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8ce0: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 31  db, "x_count", 1
8cf0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8d00: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31 43  , 0,.        t1C
8d10: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
8d20: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23  Finalize);.  }.#
8d30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8d40: 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
8d50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
8d60: 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
8d70: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
8d80: 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61 63  ction(db, "legac
8d90: 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  y_count", 0, SQL
8da0: 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a 20  ITE_ANY, 0, 0,. 
8db0: 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f 75         legacyCou
8dc0: 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43 6f  ntStep, legacyCo
8dd0: 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20 20  untFinalize.    
8de0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
8df0: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
8e00: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
8e10: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
8e20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
8e30: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
8e40: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
8e50: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
8e60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8e70: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
8e80: 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a 2a  :  printf TEXT.*
8e90: 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75 74  *.** Send output
8ea0: 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73 65   to printf.  Use
8eb0: 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68 61   this rather tha
8ec0: 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65 20  n puts to merge 
8ed0: 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69 6e  the output.** in
8ee0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65 71   the correct seq
8ef0: 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75 67  uence with debug
8f00: 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e 73  ging printfs ins
8f10: 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f 64  erted into C cod
8f20: 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73 20  e..** Puts uses 
8f30: 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66 65  a separate buffe
8f40: 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  r and debugging 
8f50: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c 20  statements will 
8f60: 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65 71  be out of.** seq
8f70: 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20 75  uence if it is u
8f80: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
8f90: 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28 0a  nt test_printf(.
8fa0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
8fb0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
8fc0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
8fd0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
8fe0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
8ff0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9000: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9010: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9020: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9030: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9040: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9050: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9060: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 61  nt */.){.  if( a
9070: 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
9080: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9090: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
90a0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
90b0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
90c0: 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c 20       " TEXT\"", 
90d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
90e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
90f0: 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20 61  printf("%s\n", a
9100: 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75 72  rgv[1]);.  retur
9110: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  n TCL_OK;.}..../
9120: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9130: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
9140: 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20   FORMAT INTEGER 
9150: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a  INTEGER INTEGER.
9160: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9170: 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69 6e  tf with three in
9180: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a  teger arguments.
9190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
91a0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
91b0: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
91c0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
91d0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
91e0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
91f0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9200: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
9210: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
9220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9230: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
9240: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
9250: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
9260: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9270: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9280: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
9290: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
92a0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
92b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
92c0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
92d0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
92e0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
92f0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9300: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
9310: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9320: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
9330: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
9340: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
9350: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
9360: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
9370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9380: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
9390: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
93a0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
93b0: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
93c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
93d0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
93e0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
93f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9400: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9410: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
9420: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
9430: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
9440: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
9450: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
9460: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
9470: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
9480: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
9490: 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20  printf_int64(.  
94a0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
94b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
94c0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
94d0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
94e0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
94f0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
9500: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
9510: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9520: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
9530: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
9540: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
9550: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
9560: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
9570: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61    sqlite_int64 a
9580: 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [3];.  char *z;.
9590: 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
95a0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
95b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
95c0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
95d0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
95e0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
95f0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54  RMAT INT INT INT
9600: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9610: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9620: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
9630: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  5; i++){.    if(
9640: 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61   sqlite3Atoi64(a
9650: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c  rgv[i], &a[i-2],
9660: 20 31 30 30 30 30 30 30 2c 20 53 51 4c 49 54 45   1000000, SQLITE
9670: 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20  _UTF8) ){.      
9680: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9690: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65  (interp, "argume
96a0: 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  nt is not a vali
96b0: 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  d 64-bit integer
96c0: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
96d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
96e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73     }.  }.  z = s
96f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9700: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9710: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
9720: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9730: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
9740: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
9750: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
9760: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
9770: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
9780: 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e  f_long FORMAT IN
9790: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e  TEGER INTEGER IN
97a0: 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TEGER.**.** Call
97b0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68   mprintf with th
97c0: 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72  ree long integer
97d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68   arguments.   Th
97e0: 69 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a  is might be the.
97f0: 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  ** same as sqlit
9800: 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f  e3_mprintf_int o
9810: 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  r sqlite3_mprint
9820: 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69  f_int64, dependi
9830: 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72  ng on.** platfor
9840: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
9850: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9860: 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e  _long(.  void *N
9870: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9880: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9890: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
98a0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
98b0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
98c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98e0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
98f0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9900: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9910: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9920: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9930: 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20    int i;.  long 
9940: 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20  int a[3];.  int 
9950: 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  b[3];.  char *z;
9960: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
9970: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9990: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
99a0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
99b0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
99c0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
99d0: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
99e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
99f0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9a00: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
9a10: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
9a20: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62  erp, argv[i], &b
9a30: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
9a40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61  TCL_ERROR;.    a
9a50: 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e  [i-2] = (long in
9a60: 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b  t)b[i-2];.    a[
9a70: 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34 29 31  i-2] &= (((u64)1
9a80: 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a  )<<(sizeof(int)*
9a90: 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d  8))-1;.  }.  z =
9aa0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9ab0: 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20  (argv[1], a[0], 
9ac0: 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54  a[1], a[2]);.  T
9ad0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9ae0: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9af0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9b00: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9b10: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9b20: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9b30: 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20 49  ntf_str FORMAT I
9b40: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53  NTEGER INTEGER S
9b50: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
9b60: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
9b70: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
9b80: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69  nts and one stri
9b90: 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  ng argument.*/.s
9ba0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9bb0: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20  3_mprintf_str(. 
9bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9c90: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
9ca0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c  ;.  if( argc<4 |
9cb0: 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20  | argc>5 ){.    
9cc0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9cd0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9ce0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9cf0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9d00: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9d10: 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f  INT INT ?STRING?
9d20: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9d40: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
9d50: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
9d60: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9d70: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
9d80: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
9d90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9da0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9db0: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9dc0: 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20  ], a[1], argc>4 
9dd0: 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c  ? argv[4] : NULL
9de0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
9df0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
9e00: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
9e10: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
9e20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9e30: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
9e40: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 49  3_snprintf_str I
9e50: 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49 4e  NTEGER FORMAT IN
9e60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54  TEGER INTEGER ST
9e70: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
9e80: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f  mprintf with two
9e90: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
9ea0: 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e  ts and one strin
9eb0: 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74  g argument.*/.st
9ec0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
9ed0: 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a 20  _snprintf_str(. 
9ee0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9ef0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9f00: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9f10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9f20: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9f30: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9f40: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9f60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9f70: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9f90: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9fa0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9fb0: 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a  3], i;.  int n;.
9fc0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9fd0: 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63 3e   argc<5 || argc>
9fe0: 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  6 ){.    Tcl_App
9ff0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a000: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
a010: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
a020: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
a030: 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e 54  " INT FORMAT INT
a040: 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22   INT ?STRING?\""
a050: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a060: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a070: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
a080: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
a090: 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
a0a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
a0b0: 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  n<0 ){.    Tcl_A
a0c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a0d0: 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20 6e  rp, "N must be n
a0e0: 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30 29  on-negative", 0)
a0f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a100: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
a110: 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=3; i<5; i++)
a120: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
a130: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
a140: 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20 29  v[i], &a[i-3]) )
a150: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a160: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a170: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31  ite3_malloc( n+1
a180: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   );.  sqlite3_sn
a190: 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72 67  printf(n, z, arg
a1a0: 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[2], a[0], a[1]
a1b0: 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b  , argc>4 ? argv[
a1c0: 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63  5] : NULL);.  Tc
a1d0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a1e0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
a1f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
a200: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a210: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
a220: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
a230: 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54  tf_double FORMAT
a240: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
a250: 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61   DOUBLE.**.** Ca
a260: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
a270: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
a280: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f  ments and one do
a290: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  uble argument.*/
a2a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a2b0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
a2c0: 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  le(.  void *NotU
a2d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a2e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a2f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a300: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a310: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a320: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a330: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a340: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a350: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a360: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a370: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a380: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
a390: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f  nt a[3], i;.  do
a3a0: 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a  uble r;.  char *
a3b0: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
a3c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a3d0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a3e0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a3f0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
a400: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
a410: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
a420: 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20  DOUBLE\"", 0);. 
a430: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a440: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
a450: 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20  =2; i<4; i++){. 
a460: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
a470: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
a480: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
a490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a4a0: 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
a4b0: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20  tDouble(interp, 
a4c0: 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72  argv[4], &r) ) r
a4d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a4e0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
a4f0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
a500: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a  a[0], a[1], r);.
a510: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a520: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a530: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a540: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a550: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a560: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a570: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46 4f  printf_scaled FO
a580: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
a590: 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  LE.**.** Call mp
a5a0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5b0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a5c0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65  ent which is the
a5d0: 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a   product of the.
a5e0: 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73  ** two arguments
a5f0: 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54   given above.  T
a600: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  his is used to g
a610: 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77  enerate overflow
a620: 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a   and underflow.*
a630: 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73  * doubles to tes
a640: 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  t that they are 
a650: 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72  converted proper
a660: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
a670: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
a680: 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69 64  f_scaled(.  void
a690: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
a6a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a6b0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6c0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6d0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6e0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
a6f0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
a700: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a710: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a720: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a730: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a740: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a750: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f  ){.  int i;.  do
a760: 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61  uble r[2];.  cha
a770: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
a780: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
a790: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a7a0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
a7b0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
a7c0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
a7d0: 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c    " FORMAT DOUBL
a7e0: 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b  E DOUBLE\"", 0);
a7f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a800: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
a810: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
a820: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
a830: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
a840: 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29  rgv[i], &r[i-2])
a850: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
a860: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
a870: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
a880: 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31  rgv[1], r[0]*r[1
a890: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
a8a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a8b0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a8c0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a8d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a8e0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
a8f0: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
a900: 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47  ly FORMAT STRING
a910: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
a920: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
a930: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
a940: 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20 70  t which is the p
a950: 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a  roduct of the.**
a960: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67   two arguments g
a970: 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69  iven above.  Thi
a980: 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e  s is used to gen
a990: 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61  erate overflow a
a9a0: 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20  nd underflow.** 
a9b0: 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20  doubles to test 
a9c0: 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63 6f  that they are co
a9d0: 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79  nverted properly
a9e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a9f0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
aa00: 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  stronly(.  void 
aa10: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
aa20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
aa30: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
aa40: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
aa50: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
aa60: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
aa70: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
aa80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
aa90: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
aaa0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
aab0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
aac0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
aad0: 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
aae0: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
aaf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ab00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
ab10: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
ab20: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
ab30: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
ab40: 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b  T STRING\"", 0);
ab50: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ab60: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d  ERROR;.  }.  z =
ab70: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
ab80: 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32  (argv[1], argv[2
ab90: 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
aba0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
abb0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
abc0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
abd0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
abe0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
abf0: 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
ac00: 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58 0a  uble FORMAT HEX.
ac10: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
ac20: 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65  tf with a single
ac30: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
ac40: 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76 65   which is derive
ac50: 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68 65  d from the.** he
ac60: 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64 69  xadecimal encodi
ac70: 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64 6f  ng of an IEEE do
ac80: 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
ac90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
aca0: 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a 20  ntf_hexdouble(. 
acb0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
acc0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
acd0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
ace0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
acf0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
ad00: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
ad10: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
ad20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ad30: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
ad40: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
ad50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
ad60: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
ad70: 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  t */.){.  char *
ad80: 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  z;.  double r;. 
ad90: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 31   unsigned int x1
ada0: 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f 75  , x2;.  sqlite_u
adb0: 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20 61  int64 d;.  if( a
adc0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
add0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ade0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
adf0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
ae00: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
ae10: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
ae20: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
ae30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ae40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73 63  R;.  }.  if( ssc
ae50: 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25 30  anf(argv[2], "%0
ae60: 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26 78  8x%08x", &x2, &x
ae70: 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  1)!=2 ){.    Tcl
ae80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ae90: 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75 6d  terp, "2nd argum
aea0: 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31 36  ent should be 16
aeb0: 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20 68  -characters of h
aec0: 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ex", 0);.    ret
aed0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aee0: 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20 64   }.  d = x2;.  d
aef0: 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31 3b   = (d<<32) + x1;
af00: 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26 64  .  memcpy(&r, &d
af10: 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  , sizeof(r));.  
af20: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
af30: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29 3b  ntf(argv[1], r);
af40: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
af50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
af60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
af70: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
af80: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
af90: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
afa0: 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63  nable_shared_cac
afb0: 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a  he ?BOOLEAN?.**.
afc0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
afd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
afe0: 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69 63  ED_CACHE).static
aff0: 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65   int test_enable
b000: 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e  _shared(.  Clien
b010: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
b020: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
b030: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
b040: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
b050: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
b060: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
b070: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
b080: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
b090: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
b0a0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
b0b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
b0d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
b0e0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
b0f0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
b100: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
b110: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74  nt enable;.  int
b120: 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28   ret = 0;..  if(
b130: 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
b140: 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
b150: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b160: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42  rp, 1, objv, "?B
b170: 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72  OOLEAN?");.    r
b180: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b190: 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c  .  }.  ret = sql
b1a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
b1b0: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
b1c0: 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  led;..  if( objc
b1d0: 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
b1e0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
b1f0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b200: 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29  v[1], &enable) )
b210: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  {.      return T
b220: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
b230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b240: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
b250: 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20  ache(enable);.  
b260: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b270: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
b280: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b290: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
b2a0: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43  e3ErrStr(rc), TC
b2b0: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  L_STATIC);.     
b2c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b2d0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  R;.    }.  }.  T
b2e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
b2f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
b300: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b  ooleanObj(ret));
b310: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b320: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a  ;.}.#endif..../*
b330: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
b340: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
b350: 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20  lt_codes   DB   
b360: 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73   BOOLEAN.**.*/.s
b370: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
b380: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
b390: 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  odes(.  ClientDa
b3a0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b3b0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b3c0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b3d0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b3e0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b3f0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b400: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b410: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b420: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b430: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b440: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b450: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b460: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b470: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b480: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b490: 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20    int enable;.  
b4a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
b4b0: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
b4c0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b4d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b4e0: 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e  bjv, "DB BOOLEAN
b4f0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b500: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
b510: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
b520: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
b530: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
b540: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
b550: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
b560: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
b570: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
b580: 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20  jv[2], &enable) 
b590: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b5a0: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  OR;.  sqlite3_ex
b5b0: 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
b5c0: 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b  des(db, enable);
b5d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b5e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
b5f0: 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  : sqlite3_libver
b600: 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a  sion_number.**.*
b610: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
b620: 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  t_libversion_num
b630: 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ber(.  ClientDat
b640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
b650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
b660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
b670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
b680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b730: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b740: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b750: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
b760: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
b770: 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  r()));.  return 
b780: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b790: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b7a0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
b7b0: 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65 20  adata DB dbname 
b7c0: 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a  tblname colname.
b7d0: 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  **.*/.#ifdef SQL
b7e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
b7f0: 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61 74 69  N_METADATA.stati
b800: 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65  c int test_table
b810: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b820: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b830: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
b840: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
b850: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
b860: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
b870: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
b880: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
b890: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
b8a0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
b8b0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
b8e0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
b8f0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
b900: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
b910: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
b920: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
b930: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
b940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
b950: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b960: 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zCol;.  int rc;.
b970: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
b980: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
b990: 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e  zDatatype;.  con
b9a0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65  st char *zCollse
b9b0: 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c  q;.  int notnull
b9c0: 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b  ;.  int primaryk
b9d0: 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e  ey;.  int autoin
b9e0: 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20  crement;..  if( 
b9f0: 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
ba00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ba10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ba20: 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e   "DB dbname tbln
ba30: 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20  ame colname");. 
ba40: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ba50: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
ba60: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
ba70: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ba80: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
ba90: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
baa0: 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c  ROR;.  zDb = Tcl
bab0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
bac0: 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63  2]);.  zTbl = Tc
bad0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
bae0: 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54  [3]);.  zCol = T
baf0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
bb00: 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73 74  v[4]);..  if( st
bb10: 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a  rlen(zDb)==0 ) z
bb20: 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  Db = 0;..  rc = 
bb30: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
bb40: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64 62  lumn_metadata(db
bb50: 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f  , zDb, zTbl, zCo
bb60: 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74 61  l, .      &zData
bb70: 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c  type, &zCollseq,
bb80: 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d   &notnull, &prim
bb90: 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63  arykey, &autoinc
bba0: 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20  rement);..  if( 
bbb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bbc0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
bbd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
bbe0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
bbf0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
bc00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
bc10: 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  .  pRet = Tcl_Ne
bc20: 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69  wObj();.  Tcl_Li
bc30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bc40: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
bc50: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61  NewStringObj(zDa
bc60: 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20  tatype, -1));.  
bc70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bc80: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
bc90: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bca0: 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29  bj(zCollseq, -1)
bcb0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
bcc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
bcd0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
bce0: 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a  tObj(notnull));.
bcf0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bd00: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
bd10: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
bd20: 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a  j(primarykey));.
bd30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bd40: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
bd50: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
bd60: 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  j(autoincrement)
bd70: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
bd80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
bd90: 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
bda0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
bdb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bdc0: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73  OMIT_INCRBLOB..s
bdd0: 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61  tatic int blobHa
bde0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54  ndleFromObj(.  T
bdf0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
be00: 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  p, .  Tcl_Obj *p
be10: 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  Obj,.  sqlite3_b
be20: 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a  lob **ppBlob.){.
be30: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
be40: 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47   n;..  z = Tcl_G
be50: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
be60: 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28  pObj, &n);.  if(
be70: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70   n==0 ){.    *pp
be80: 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Blob = 0;.  }els
be90: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  e{.    int notUs
bea0: 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ed;.    Tcl_Chan
beb0: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20  nel channel;.   
bec0: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
bed0: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20  anceData;.    . 
bee0: 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c     channel = Tcl
bef0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
bf00: 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29  rp, z, &notUsed)
bf10: 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e  ;.    if( !chann
bf20: 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  el ) return TCL_
bf30: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f  ERROR;..    Tcl_
bf40: 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a  Flush(channel);.
bf50: 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61      Tcl_Seek(cha
bf60: 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45  nnel, 0, SEEK_SE
bf70: 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63  T);..    instanc
bf80: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
bf90: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
bfa0: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20  ta(channel);.   
bfb0: 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71   *ppBlob = *((sq
bfc0: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
bfd0: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d  stanceData);.  }
bfe0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
bff0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  K;.}../*.** sqli
c000: 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 20 20  te3_blob_bytes  
c010: 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69  CHANNEL.*/.stati
c020: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
c030: 62 79 74 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  bytes(.  ClientD
c040: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c050: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
c060: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c070: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
c080: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
c090: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
c0a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
c0b0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
c0c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c0d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
c0e0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
c0f0: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
c100: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
c110: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  ){.  sqlite3_blo
c120: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
c130: 6e 42 79 74 65 3b 0a 20 20 0a 20 20 69 66 28 20  nByte;.  .  if( 
c140: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
c150: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
c160: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
c170: 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20   "CHANNEL");.   
c180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c190: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
c1a0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
c1b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
c1c0: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
c1d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 6e  n TCL_ERROR;.  n
c1e0: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
c1f0: 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62 29  lob_bytes(pBlob)
c200: 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
c210: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
c220: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74 65  _NewIntObj(nByte
c230: 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43  ));..  return TC
c240: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73  L_OK;.}../*.** s
c250: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73  qlite3_blob_clos
c260: 65 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74  e  CHANNEL.*/.st
c270: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c  atic int test_bl
c280: 6f 62 5f 63 6c 6f 73 65 28 0a 20 20 43 6c 69 65  ob_close(.  Clie
c290: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c2a0: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
c2b0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c2c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c2d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c2e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c2f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c300: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c310: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c320: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c330: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c340: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c350: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c360: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
c370: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 0a  blob *pBlob;.  .
c380: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
c390: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
c3a0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
c3b0: 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 22   objv, "CHANNEL"
c3c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c3d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c3e0: 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  if( blobHandleFr
c3f0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c400: 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29  jv[1], &pBlob) )
c410: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c420: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  R;.  sqlite3_blo
c430: 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
c440: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
c450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
c460: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43 48  e3_blob_read  CH
c470: 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a 2a  ANNEL OFFSET N.*
c480: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d  *.**   This comm
c490: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
c4a0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
c4b0: 62 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20 77  blob_read() in w
c4c0: 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68  ays that.**   th
c4d0: 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e  e Tcl channel in
c4e0: 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74  terface does not
c4f0: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
c500: 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20  ment should.**  
c510: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
c520: 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20  a valid channel 
c530: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b  created by the [
c540: 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64  incrblob] method
c550: 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62  .**   of a datab
c560: 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73  ase handle. This
c570: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   function calls 
c580: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
c590: 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61 64  d().**   to read
c5a0: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66   N bytes from of
c5b0: 66 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f 6d  fset OFFSET from
c5c0: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
c5d0: 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f 62  SQLite.**   blob
c5e0: 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20   handle..**.**  
c5f0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20 62   On success, a b
c600: 79 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63 74  yte-array object
c610: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c620: 72 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a 2a  read data is .**
c630: 20 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20     returned. On 
c640: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e 74  failure, the int
c650: 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74 20  erpreter result 
c660: 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
c670: 20 20 20 74 65 78 74 20 72 65 70 72 65 73 65 6e     text represen
c680: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  tation of the re
c690: 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f 64  turned error cod
c6a0: 65 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f  e (i.e. "SQLITE_
c6b0: 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e 64  NOMEM").**   and
c6c0: 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e   a Tcl exception
c6d0: 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73   is thrown..*/.s
c6e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
c6f0: 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69 65  lob_read(.  Clie
c700: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c710: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
c720: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c730: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c740: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c750: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c760: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c770: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c780: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c790: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c7a0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c7b0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c7c0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c7d0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
c7e0: 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69  blob *pBlob;.  i
c7f0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
c800: 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69 67  iOffset;.  unsig
c810: 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 20 3d  ned char *zBuf =
c820: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
c830: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
c840: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
c850: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c860: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
c870: 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20 20   OFFSET N");.   
c880: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c890: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c  R;.  }..  if( bl
c8a0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
c8b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
c8c0: 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72   &pBlob) ) retur
c8d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
c8e0: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
c8f0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c900: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
c910: 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54 43  Offset).   || TC
c920: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
c930: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
c940: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65 29  objv[3], &nByte)
c950: 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  .  ){ .    retur
c960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c970: 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 30 20  ..  if( nByte>0 
c980: 29 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 28 75  ){.    zBuf = (u
c990: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 54  nsigned char *)T
c9a0: 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29 3b  cl_Alloc(nByte);
c9b0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c9c0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 42  te3_blob_read(pB
c9d0: 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74 65  lob, zBuf, nByte
c9e0: 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69 66  , iOffset);.  if
c9f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ca00: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
ca10: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
ca20: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
ca30: 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65 29  Obj(zBuf, nByte)
ca40: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ca50: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
ca60: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
ca70: 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61  lite3TestErrorNa
ca80: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41  me(rc), TCL_VOLA
ca90: 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  TILE);.  }.  Tcl
caa0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 7a 42  _Free((char *)zB
cab0: 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28  uf);..  return (
cac0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
cad0: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
cae0: 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71  OR);.}../*.** sq
caf0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
cb00: 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20   CHANNEL OFFSET 
cb10: 44 41 54 41 20 3f 4e 44 41 54 41 3f 0a 2a 2a 0a  DATA ?NDATA?.**.
cb20: 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  **   This comman
cb30: 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  d is used to tes
cb40: 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c  t the sqlite3_bl
cb50: 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20 77 61  ob_write() in wa
cb60: 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74 68 65  ys that.**   the
cb70: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74   Tcl channel int
cb80: 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e  erface does not.
cb90: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
cba0: 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20  ent should.**   
cbb0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  be the name of a
cbc0: 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63   valid channel c
cbd0: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 5b 69  reated by the [i
cbe0: 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a  ncrblob] method.
cbf0: 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61 62 61  **   of a databa
cc00: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
cc10: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73  function calls s
cc20: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
cc30: 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72 69 74  e().**   to writ
cc40: 65 20 74 68 65 20 44 41 54 41 20 62 79 74 65 2d  e the DATA byte-
cc50: 61 72 72 61 79 20 74 6f 20 74 68 65 20 75 6e 64  array to the und
cc60: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 20 62  erlying SQLite b
cc70: 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20  lob handle..**  
cc80: 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46 53 45   at offset OFFSE
cc90: 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75  T..**.**   On su
cca0: 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74 79 20  ccess, an empty 
ccb0: 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
ccc0: 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  ed. On failure, 
ccd0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 0a  the interpreter.
cce0: 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73 20 73  **   result is s
ccf0: 65 74 20 74 6f 20 74 68 65 20 74 65 78 74 20 72  et to the text r
cd00: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
cd10: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65 72   the returned er
cd20: 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20 20 28  ror code .**   (
cd30: 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d  i.e. "SQLITE_NOM
cd40: 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c 20 65  EM") and a Tcl e
cd50: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
cd60: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
cd70: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74  t test_blob_writ
cd80: 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
cd90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
cda0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
cdb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
cdc0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
cdd0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
cde0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
cdf0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
ce00: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
ce10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ce20: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
ce30: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
ce40: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
ce50: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
ce60: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
ce70: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Blob;.  int iOff
ce80: 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  set;.  int rc;..
ce90: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
cea0: 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e 42 75  *zBuf;.  int nBu
ceb0: 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  f;.  .  if( objc
cec0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35 20 29  !=4 && objc!=5 )
ced0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
cee0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
cef0: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
cf00: 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f 4e 44   OFFSET DATA ?ND
cf10: 41 54 41 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ATA?");.    retu
cf20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cf30: 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e  }..  if( blobHan
cf40: 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dleFromObj(inter
cf50: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c  p, objv[1], &pBl
cf60: 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ob) ) return TCL
cf70: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 43  _ERROR;.  if( TC
cf80: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
cf90: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
cfa0: 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65  objv[2], &iOffse
cfb0: 74 29 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  t) ){ .    retur
cfc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cfd0: 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63 6c 5f 47  ..  zBuf = Tcl_G
cfe0: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
cff0: 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 75  bj(objv[3], &nBu
d000: 66 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  f);.  if( objc==
d010: 35 20 26 26 20 54 63 6c 5f 47 65 74 49 6e 74 46  5 && Tcl_GetIntF
d020: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
d030: 62 6a 76 5b 34 5d 2c 20 26 6e 42 75 66 29 20 29  bjv[4], &nBuf) )
d040: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
d050: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
d060: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
d070: 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a 42 75  write(pBlob, zBu
d080: 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73 65 74  f, nBuf, iOffset
d090: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d0a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
d0b0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d0c0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
d0d0: 74 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65  te3TestErrorName
d0e0: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
d0f0: 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  LE);.  }..  retu
d100: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
d110: 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  K ? TCL_OK : TCL
d120: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74  _ERROR);.}..stat
d130: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
d140: 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c 69 65 6e  _reopen(.  Clien
d150: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
d160: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
d170: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
d180: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
d190: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
d1a0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
d1b0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
d1c0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
d1d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d1e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
d1f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
d200: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
d210: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
d220: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49  /.){.  Tcl_WideI
d230: 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c  nt iRowid;.  sql
d240: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
d250: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
d260: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
d270: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d280: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
d290: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 52 4f 57  jv, "CHANNEL ROW
d2a0: 49 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ID");.    return
d2b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d2c0: 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c  .  if( blobHandl
d2d0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
d2e0: 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62   objv[1], &pBlob
d2f0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
d300: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
d310: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
d320: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
d330: 5d 2c 20 26 69 52 6f 77 69 64 29 20 29 20 72 65  ], &iRowid) ) re
d340: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d350: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d360: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f  blob_reopen(pBlo
d370: 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  b, iRowid);.  if
d380: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d390: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
d3a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
d3b0: 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65 73 74  ar *)sqlite3Test
d3c0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
d3d0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
d3e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
d3f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c  =SQLITE_OK ? TCL
d400: 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29  _OK : TCL_ERROR)
d410: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
d420: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d430: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
d440: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
d450: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
d460: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
d470: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
d480: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
d490: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
d4a0: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
d4b0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
d4c0: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
d4d0: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
d4e0: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
d4f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
d500: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
d510: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
d520: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
d530: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
d540: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
d550: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
d560: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
d570: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
d580: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
d590: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
d5a0: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
d5b0: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
d5c0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
d5d0: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
d5e0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
d5f0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
d600: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
d610: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
d620: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
d630: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
d640: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
d650: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
d660: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d670: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
d680: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
d690: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
d6a0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
d6b0: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
d6c0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
d6d0: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
d6e0: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
d6f0: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
d700: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
d710: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
d720: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
d730: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
d740: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
d750: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
d760: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
d770: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
d780: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d790: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
d7a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d7b0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
d7c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
d7d0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
d7e0: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
d7f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
d800: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
d810: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
d820: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
d830: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
d840: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
d850: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
d860: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
d870: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
d880: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
d890: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
d8a0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
d8b0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
d8c0: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
d8d0: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
d8e0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
d8f0: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
d900: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
d910: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
d920: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
d930: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
d940: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
d950: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
d960: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d970: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
d980: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
d990: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
d9a0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
d9b0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
d9c0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
d9d0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d9f0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
da00: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
da10: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
da20: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
da30: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
da40: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
da50: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
da60: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
da70: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
da80: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
da90: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
daa0: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
dab0: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
dac0: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
dad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
dae0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
daf0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
db00: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
db10: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
db20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
db30: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
db40: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
db50: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
db60: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
db70: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
db80: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
db90: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
dba0: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
dbb0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
dbc0: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
dbd0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
dbe0: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
dbf0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
dc00: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
dc10: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
dc20: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
dc30: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
dc40: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
dc50: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
dc60: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
dc70: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dc80: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
dc90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dca0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
dcb0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
dcc0: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
dcd0: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
dce0: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
dcf0: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
dd00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
dd20: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
dd30: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
dd40: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
dd50: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
dd60: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
dd70: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
dd80: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
dd90: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
dda0: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
ddb0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ddc0: 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c  /*.** USAGE: sql
ddd0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
dde0: 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20  tion_v2 DB NAME 
ddf0: 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48  NARG ENC ?SWITCH
de00: 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ES?.**.** Availa
de10: 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65  ble switches are
de20: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20  :.**.**   -func 
de30: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
de40: 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a  step    SCRIPT.*
de50: 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52  *   -final   SCR
de60: 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f  IPT.**   -destro
de70: 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65  y SCRIPT.*/.type
de80: 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74  def struct Creat
de90: 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61  eFunctionV2 Crea
dea0: 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74  teFunctionV2;.st
deb0: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
dec0: 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e  ionV2 {.  Tcl_In
ded0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
dee0: 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20  Tcl_Obj *pFunc; 
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75  /* Script for fu
df10: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
df20: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
df30: 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  pStep;          
df40: 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74         /* Script
df50: 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69   for agg. step i
df60: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
df70: 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20  cl_Obj *pFinal; 
df80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df90: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67  * Script for agg
dfa0: 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69  . finalization i
dfb0: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
dfc0: 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79  cl_Obj *pDestroy
dfd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
dfe0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72  * Destructor scr
dff0: 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  ipt */.};.static
e000: 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71   void cf2Func(sq
e010: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
e020: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
e030: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
e040: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
e050: 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74  id cf2Step(sqlit
e060: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
e070: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
e080: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
e090: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
e0a0: 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  cf2Final(sqlite3
e0b0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
e0c0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66  }.static void cf
e0d0: 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  2Destroy(void *p
e0e0: 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46  User){.  CreateF
e0f0: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28  unctionV2 *p = (
e100: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
e110: 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28   *)pUser;..  if(
e120: 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d   p->interp && p-
e130: 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >pDestroy ){.   
e140: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
e150: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
e160: 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20  p, p->pDestroy, 
e170: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
e180: 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63  TCL_OK ) Tcl_Bac
e190: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
e1a0: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
e1b0: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
e1c0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
e1d0: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
e1e0: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
e1f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
e200: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
e210: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
e220: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
e230: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
e240: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
e250: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
e260: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20  ->pDestroy); .  
e270: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
e280: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
e290: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
e2a0: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
e2b0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
e2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
e2d0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
e2e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e2f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e300: 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e   invoking TCL in
e310: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
e320: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e340: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
e350: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
e360: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
e370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
e380: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
e390: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
e3a0: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
e3b0: 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20  r *zFunc;.  int 
e3c0: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b  nArg;.  int enc;
e3d0: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
e3e0: 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  nV2 *p;.  int i;
e3f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74  .  int rc;..  st
e400: 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a  ruct EncTable {.
e410: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e420: 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e  zEnc;.    int en
e430: 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20  c;.  } aEnc[] = 
e440: 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20  {.    {"utf8",  
e450: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c    SQLITE_UTF8 },
e460: 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20  .    {"utf16",  
e470: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c   SQLITE_UTF16 },
e480: 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c  .    {"utf16le",
e490: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
e4a0: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65  },.    {"utf16be
e4b0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
e4c0: 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c  E },.    {"any",
e4d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20       SQLITE_ANY 
e4e0: 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d  },.    {"0", 0 }
e4f0: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
e500: 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d  c<5 || (objc%2)=
e510: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =0 ){.    Tcl_Wr
e520: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
e530: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
e540: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57  NAME NARG ENC SW
e550: 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20  ITCHES...");.   
e560: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e570: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
e580: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
e590: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
e5a0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
e5b0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
e5c0: 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63  OR;.  zFunc = Tc
e5d0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e5e0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
e5f0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
e600: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
e610: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
e620: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
e630: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
e640: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
e650: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c  , objv[4], aEnc,
e660: 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29   sizeof(aEnc[0])
e670: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e  , .          "en
e680: 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63  coding", 0, &enc
e690: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
e6a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e6b0: 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e  .  enc = aEnc[en
e6c0: 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73  c].enc;..  p = s
e6d0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
e6e0: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
e6f0: 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72  ionV2));.  asser
e700: 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74  t( p );.  memset
e710: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72  (p, 0, sizeof(Cr
e720: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29  eateFunctionV2))
e730: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
e740: 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69  interp;..  for(i
e750: 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32  =5; i<objc; i+=2
e760: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74  ){.    int iSwit
e770: 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ch;.    const ch
e780: 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d  ar *azSwitch[] =
e790: 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65   {"-func", "-ste
e7a0: 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d  p", "-final", "-
e7b0: 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20  destroy", 0};.  
e7c0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
e7d0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
e7e0: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69  , objv[i], azSwi
e7f0: 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30  tch, "switch", 0
e800: 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20  , &iSwitch) ){. 
e810: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
e820: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
e830: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e840: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
e850: 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   iSwitch ){.    
e860: 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75    case 0: p->pFu
e870: 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  nc = objv[i+1]; 
e880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e890: 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74    case 1: p->pSt
e8a0: 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  ep = objv[i+1]; 
e8b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e8c0: 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69    case 2: p->pFi
e8d0: 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b  nal = objv[i+1];
e8e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e8f0: 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65    case 3: p->pDe
e900: 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31  stroy = objv[i+1
e910: 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ];   break;.    
e920: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
e930: 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20  Func ) p->pFunc 
e940: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
e950: 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  bj(p->pFunc); . 
e960: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e970: 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44  p->pStep = Tcl_D
e980: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
e990: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
e9a0: 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69  >pFinal ) p->pFi
e9b0: 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  nal = Tcl_Duplic
e9c0: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c  ateObj(p->pFinal
e9d0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
e9e0: 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74  stroy ) p->pDest
e9f0: 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  roy = Tcl_Duplic
ea00: 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72  ateObj(p->pDestr
ea10: 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e  oy); ..  if( p->
ea20: 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72  pFunc ) Tcl_Incr
ea30: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
ea40: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
ea50: 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  tep ) Tcl_IncrRe
ea60: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
ea70: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
ea80: 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  al ) Tcl_IncrRef
ea90: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
eaa0: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
eab0: 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52  troy ) Tcl_IncrR
eac0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
ead0: 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73  roy); ..  rc = s
eae0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
eaf0: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
eb00: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
eb10: 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20  (void *)p, .    
eb20: 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66    (p->pFunc ? cf
eb30: 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20  2Func : 0),.    
eb40: 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66    (p->pStep ? cf
eb50: 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20  2Step : 0),.    
eb60: 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63    (p->pFinal ? c
eb70: 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20  f2Final : 0),.  
eb80: 20 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20      cf2Destroy. 
eb90: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
eba0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
ebb0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
ebc0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
ebd0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ebe0: 65 72 70 2c 20 73 71 6c 69 74 65 33 54 65 73 74  erp, sqlite3Test
ebf0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
ec00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
ec20: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ec30: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ec40: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
ec50: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
ec60: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
ec70: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
ec80: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
ec90: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
eca0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
ecb0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
ecc0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
ecd0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
ece0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
ecf0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
ed00: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ed20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ed30: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
ed40: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
ed50: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
ed60: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
ed70: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
ed80: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
ed90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
eda0: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
edb0: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
edc0: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
edd0: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
ede0: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
edf0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
ee00: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ee10: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ee20: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
ee30: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
ee40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ee50: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
ee60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ee70: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
ee80: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
ee90: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
eea0: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
eeb0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
eec0: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
eed0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
eee0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
eef0: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
ef00: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
ef10: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
ef20: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
ef30: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
ef40: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
ef50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ef60: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
ef70: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
ef80: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
ef90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
efa0: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
efb0: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
efc0: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
efd0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
efe0: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
eff0: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
f000: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
f010: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
f020: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
f030: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
f040: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
f050: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
f060: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
f070: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
f080: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
f090: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
f0a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
f0b0: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
f0c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
f0d0: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
f0e0: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
f0f0: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
f100: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
f110: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
f120: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
f130: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
f140: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
f150: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
f160: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f170: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
f180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
f190: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
f1a0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
f1b0: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
f1c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
f1d0: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
f1e0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
f1f0: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
f200: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
f210: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
f220: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
f230: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
f240: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
f250: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
f260: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
f270: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
f280: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
f290: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
f2a0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
f2b0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
f2c0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
f2d0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
f2e0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
f2f0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
f300: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
f310: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
f320: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
f330: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
f340: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
f350: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
f360: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
f370: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
f380: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
f390: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f3a0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
f3b0: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
f3c0: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
f3d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f3e0: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
f3f0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f400: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
f410: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
f420: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
f430: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
f440: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
f450: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
f460: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
f470: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
f480: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f490: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
f4a0: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
f4b0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
f4c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f4d0: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
f4e0: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
f4f0: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
f500: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
f510: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
f520: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
f530: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
f540: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
f550: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f560: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
f570: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
f580: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
f590: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
f5a0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
f5b0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
f5c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
f5d0: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
f5e0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
f5f0: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
f600: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
f610: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
f620: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
f630: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
f640: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f650: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f660: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
f670: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
f680: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
f690: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
f6a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
f6b0: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
f6c0: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
f6d0: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
f6e0: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
f6f0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
f700: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
f710: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
f720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f730: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
f740: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
f750: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f760: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
f770: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
f780: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
f790: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
f7a0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
f7b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
f7c0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
f7d0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
f7e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
f7f0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
f800: 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e   */.){.#if defin
f810: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f  ed(_MSC_VER).  /
f820: 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74  * We do this, ot
f830: 68 65 72 77 69 73 65 20 74 68 65 20 74 65 73 74  herwise the test
f840: 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20   will halt with 
f850: 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a  a popup message.
f860: 20 20 20 2a 20 74 68 61 74 20 77 65 20 68 61 76     * that we hav
f870: 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20  e to click away 
f880: 62 65 66 6f 72 65 20 74 68 65 20 74 65 73 74 20  before the test 
f890: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  will continue.. 
f8a0: 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72    */.  _set_abor
f8b0: 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f  t_behavior( 0, _
f8c0: 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54  CALL_REPORTFAULT
f8d0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69   );.#endif.  exi
f8e0: 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74  t(255);.  assert
f8f0: 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20  ( interp==0 );  
f900: 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   /* This will al
f910: 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72  ways fail */.  r
f920: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f930: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
f940: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
f950: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53  a user-defined S
f960: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73  QL function whos
f970: 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20  e purpose.** is 
f980: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
f990: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20  te_set_result() 
f9a0: 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  API..*/.static v
f9b0: 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c  oid testFunc(sql
f9c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
f9d0: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
f9e0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
f9f0: 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28  *argv){.  while(
fa00: 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
fa10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
fa20: 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  0 = (char*)sqlit
fa30: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
fa40: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
fa50: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
fa60: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
fa70: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
fa80: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
fa90: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
faa0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
fab0: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
fac0: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
fad0: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
fae0: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
faf0: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
fb00: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
fb10: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
fb20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
fb30: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
fb40: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
fb50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
fb60: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
fb70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
fb80: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
fb90: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
fba0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
fbb0: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31  ext(argv[1]), -1
fbc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,.            SQ
fbd0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
fbe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
fbf0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
fc00: 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d  zArg0,"double")=
fc10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
fc20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
fc30: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ble(context, sql
fc40: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
fc50: 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  e(argv[1]));.   
fc60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
fc70: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
fc80: 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  0,"null")==0 ){.
fc90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
fca0: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
fcb0: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
fcc0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
fcd0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75  ICmp(zArg0,"valu
fce0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
fcf0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
fd00: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
fd10: 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c  argv[sqlite3_val
fd20: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d  ue_int(argv[1])]
fd30: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
fd40: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
fd50: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
fd60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
fd70: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
fd80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20  .    }.    argc 
fd90: 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b  -= 2;.    argv +
fda0: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
fdb0: 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  n;..error_out:. 
fdc0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
fdd0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66  error(context,"f
fde0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
fdf0: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
fe00: 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74  ".      "int int
fe10: 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65  64 string double
fe20: 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31   null value", -1
fe30: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
fe40: 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69  e:   sqlite_regi
fe50: 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
fe60: 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a  on  DB  NAME.**.
fe70: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
fe80: 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f  test SQL functio
fe90: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
fea0: 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e  e DB under the n
feb0: 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61  ame NAME..*/.sta
fec0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67  tic int test_reg
fed0: 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f  ister_func(.  vo
fee0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
fef0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ff00: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ff10: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ff20: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ff30: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
ff40: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
ff50: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ff60: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
ff70: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
ff80: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
ff90: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
ffa0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
ffb0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
ffc0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
ffd0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ffe0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
fff0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
10000 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
10010 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
10020 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20  FUNCTION-NAME", 
10030 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10040 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10050 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
10060 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
10070 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
10080 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
10090 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
100a0 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
100b0 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
100c0 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20  E_UTF8, 0, .    
100d0 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30    testFunc, 0, 0
100e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
100f0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10100 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
10110 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
10120 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10130 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10140 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
10150 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
10160 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
10170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
10180 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10190 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
101a0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
101b0 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e   STMT .**.** Fin
101c0 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
101d0 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
101e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e  tic int test_fin
101f0 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
10200 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10210 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10220 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10230 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10240 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10250 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10260 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10270 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
10280 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10290 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
102a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
102b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
102c0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
102d0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
102e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
102f0 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
10300 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10310 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
10320 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10330 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10340 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10350 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
10360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
10370 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
10380 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
10390 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
103a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
103b0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
103c0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
103d0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
103e0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
103f0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
10400 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
10410 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
10420 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
10430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10440 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10450 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10460 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
10470 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
10480 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
10490 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
104a0 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
104b0 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
104c0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
104d0 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61  nt test_stmt_sta
104e0 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tus(.  void * cl
104f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10500 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10510 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10520 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10530 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61  v[].){.  int iVa
10540 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70  lue;.  int i, op
10550 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63  , resetFlag;.  c
10560 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
10570 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  me;.  sqlite3_st
10580 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74  mt *pStmt;..  st
10590 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
105a0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
105b0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
105c0 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d  nt op;.  } aOp[]
105d0 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
105e0 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
105f0 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20  LLSCAN_STEP",   
10600 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
10610 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
10620 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
10630 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
10640 52 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RT",            
10650 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
10660 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20  S_SORT          
10670 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
10680 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
10690 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  TOINDEX",       
106a0 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
106b0 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20  S_AUTOINDEX     
106c0 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20    },.  };.  if( 
106d0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
106e0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
106f0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10700 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52   "STMT PARAMETER
10710 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20   RESETFLAG");.  
10720 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10730 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
10740 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10750 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10760 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10770 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10780 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61  L_ERROR;.  zOpNa
10790 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
107a0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
107b0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
107c0 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aOp); i++){.
107d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
107e0 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70  Op[i].zName, zOp
107f0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
10800 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70    op = aOp[i].op
10810 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
10820 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
10830 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29  >=ArraySize(aOp)
10840 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
10850 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
10860 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
10870 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  op) ) return TCL
10880 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
10890 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
108a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
108b0 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46  objv[3], &resetF
108c0 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  lag) ) return TC
108d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75  L_ERROR;.  iValu
108e0 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e = sqlite3_stmt
108f0 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f  _status(pStmt, o
10900 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  p, resetFlag);. 
10910 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10920 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10930 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29  wIntObj(iValue))
10940 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10950 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10960 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
10970 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
10980 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10990 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
109a0 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
109b0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
109c0 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73   int test_next_s
109d0 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tmt(.  void * cl
109e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
109f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10a00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10a10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10a20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10a30 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
10a40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
10a50 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
10a60 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
10a70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10a80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10a90 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10aa0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
10ab0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
10ac0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10ad0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54  [0], 0), " DB ST
10ae0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
10af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10b00 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
10b10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10b20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10b30 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b50 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10b60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10b70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10b80 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  2]), &pStmt) ) r
10b90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ba0 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
10bb0 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c  e3_next_stmt(db,
10bc0 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70   pStmt);.  if( p
10bd0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
10be0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
10bf0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
10c00 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
10c10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10c20 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
10c30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10c40 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
10c50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10c60 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10c70 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
10c80 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  donly  STMT.**.*
10c90 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10ca0 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20   STMT is a NULL 
10cb0 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69  pointer or a poi
10cc0 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
10cd0 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67  ent.** that is g
10ce0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61  uaranteed to lea
10cf0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
10d00 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
10d10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10d20 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
10d30 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10d40 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10d50 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10d60 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10d70 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10d80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10d90 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
10da0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
10db0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
10dc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10dd0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
10de0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
10df0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10e00 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10e10 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
10e20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10e30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
10e40 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10e50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10e60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10e70 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10e80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10e90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10ea0 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
10eb0 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
10ec0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10ed0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10ee0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
10ef0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
10f00 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10f10 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
10f20 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
10f30 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
10f40 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
10f50 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
10f60 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
10f70 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
10f80 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
10f90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10fa0 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a  test_stmt_busy(.
10fb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10fc0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10fd0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10fe0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10ff0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
11000 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
11010 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
11020 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
11030 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
11040 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11050 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
11060 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
11070 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
11080 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11090 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
110a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
110b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
110c0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
110d0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
110e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
110f0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
11100 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11110 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
11120 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d  3_stmt_busy(pStm
11130 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
11140 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11150 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
11160 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
11170 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
11180 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74   Usage:  uses_st
11190 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54  mt_journal  STMT
111a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
111b0 75 65 20 69 66 20 53 54 4d 54 20 75 73 65 73 20  ue if STMT uses 
111c0 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
111d0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
111e0 6e 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  nt uses_stmt_jou
111f0 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  rnal(.  void * c
11200 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11210 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11220 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11230 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11240 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
11250 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
11260 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
11270 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11280 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11290 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
112a0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
112b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
112c0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
112d0 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  , 0), " STMT", 0
112e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
112f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11300 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
11310 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11320 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11330 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
11340 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11350 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
11360 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
11370 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11380 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11390 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64  wBooleanObj(((Vd
113a0 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65  be *)pStmt)->use
113b0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a  sStmtJournal));.
113c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
113d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
113e0 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
113f0 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
11400 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
11410 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
11420 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74  c int test_reset
11430 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11440 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11450 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11460 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11470 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11480 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
11490 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
114a0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
114b0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
114c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
114d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
114e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
114f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
11500 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
11510 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
11520 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
11530 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11540 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
11550 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11560 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11570 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11580 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
11590 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
115a0 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
115b0 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
115c0 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
115d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
115e0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
115f0 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
11600 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11610 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
11620 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
11630 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
11640 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
11650 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
11660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11670 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
11680 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11690 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
116a0 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
116b0 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
116c0 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
116d0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
116e0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
116f0 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
11700 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69  ic int test_expi
11710 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  red(.  void * cl
11720 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11730 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11740 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11750 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11760 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
11770 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
11780 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f  CATED.  sqlite3_
11790 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
117a0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
117b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
117c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
117d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
117e0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
117f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11800 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
11810 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
11820 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11830 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
11840 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11850 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11860 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11870 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
11880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
11890 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
118a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
118b0 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65  ooleanObj(sqlite
118c0 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29  3_expired(pStmt)
118d0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
118e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
118f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11900 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69  ite3_transfer_bi
11910 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20  ndings FROMSTMT 
11920 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61  TOSTMT.**.** Tra
11930 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e  nsfer all bindin
11940 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54  gs from FROMSTMT
11950 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a   over to TOSTMT.
11960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
11970 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
11980 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11990 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
119a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
119b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
119c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
119d0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
119e0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
119f0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
11a00 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d  t *pStmt1, *pStm
11a10 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t2;.  if( objc!=
11a20 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
11a30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11a40 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
11a50 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
11a60 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
11a70 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11a80 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d  v[0], 0), " FROM
11a90 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20  -STMT TO-STMT", 
11aa0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
11ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11ac0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
11ad0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11ae0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11af0 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74  ), &pStmt1)) ret
11b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11b10 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
11b20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11b30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
11b40 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65  ]), &pStmt2)) re
11b50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11b60 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11b70 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
11b80 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
11b90 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
11ba0 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c  bindings(pStmt1,
11bb0 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69  pStmt2)));.#endi
11bc0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
11bd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
11be0 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  e:  sqlite3_chan
11bf0 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ges DB.**.** Ret
11c00 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
11c10 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  f changes made t
11c20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
11c30 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a  y the last SQL.*
11c40 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a  * execution..*/.
11c50 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
11c60 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
11c70 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11c80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11c90 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11ca0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11cb0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
11cc0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
11cd0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
11ce0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11cf0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11d00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11d10 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
11d20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11d30 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
11d40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11d50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
11d60 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
11d70 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11d80 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
11d90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11da0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
11db0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11dc0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
11dd0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
11de0 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
11df0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11e00 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
11e10 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
11e20 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
11e30 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
11e40 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
11e50 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
11e60 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
11e70 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
11e80 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
11e90 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
11ea0 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
11eb0 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
11ec0 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
11ed0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
11ee0 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
11ef0 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
11f00 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
11f10 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
11f20 75 72 61 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e  urance of "?" in
11f30 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
11f40 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41  L.** string.  VA
11f50 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20 76  LUE is the new v
11f60 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  alue.  If FLAGS=
11f70 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c  ="null" then VAL
11f80 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  UE is.** ignored
11f90 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
11fa0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
11fb0 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69  If FLAGS=="stati
11fc0 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  c" then.** the v
11fd0 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
11fe0 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
11ff0 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61  atic variable na
12000 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73  med.** "sqlite_s
12010 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
12020 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e  ".  If FLAGS=="n
12030 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f  ormal" then a co
12040 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c  py.** of the VAL
12050 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66 20  UE is made.  If 
12060 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20  FLAGS=="blob10" 
12070 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73 20  then a VALUE is 
12080 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20  ignored.** an a 
12090 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61 62  10-byte blob "ab
120a0 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 20  c\000xyz\000pq" 
120b0 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  is inserted..*/.
120c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
120d0 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bind(.  void *No
120e0 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
120f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
12100 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
12110 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
12120 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
12130 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
12140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12150 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
12160 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
12170 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
12180 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
12190 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
121a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
121b0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
121c0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28    int idx;.  if(
121d0 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
121e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
121f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
12200 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
12210 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
12220 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58  .       " VM IDX
12230 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61   VALUE (null|sta
12240 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20  tic|normal)\"", 
12250 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
12270 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
12280 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
12290 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  1], &pStmt) ) re
122a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
122b0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
122c0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
122d0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
122e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
122f0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
12300 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
12310 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12320 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
12330 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69   idx);.  }else i
12340 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
12350 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29  ],"static")==0 )
12360 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
12370 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
12380 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
12390 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
123a0 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c  e, -1, 0);.  }el
123b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
123c0 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62  gv[4],"static-nb
123d0 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ytes")==0 ){.   
123e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
123f0 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
12400 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69  dx, sqlite_stati
12410 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20  c_bind_value,.  
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74       sqlite_stat
12450 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30  ic_bind_nbyte, 0
12460 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
12470 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
12480 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ormal")==0 ){.  
12490 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
124a0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
124b0 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31  idx, argv[3], -1
124c0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
124d0 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NT);.  }else if(
124e0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
124f0 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a  "blob10")==0 ){.
12500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12510 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
12520 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78  , idx, "abc\000x
12530 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53  yz\000pq", 10, S
12540 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12550 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
12560 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12570 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65  erp, "4th argume
12580 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20  nt should be ". 
12590 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22         "\"null\"
125a0 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f   or \"static\" o
125b0 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30  r \"normal\"", 0
125c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
125d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
125e0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
125f0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
12600 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
12610 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
12620 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
12630 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
12640 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e 74  [50];.    sprint
12650 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
12660 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
12670 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12680 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
12690 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
126a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
126b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
126c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
126d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
126e0 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73  T_UTF16./*.** Us
126f0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
12700 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c  llate <db ptr> <
12710 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
12720 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
12730 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
12740 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
12750 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
12760 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  s the correct co
12770 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65  llation.** seque
12780 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  nce callback whe
12790 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
127a0 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
127b0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
127c0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
127d0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
127e0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
127f0 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f  registers the co
12800 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
12810 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a   "test_collate".
12820 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ** with database
12830 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68   handle <db>. Th
12840 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
12850 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74  t must be a list
12860 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f   of three.** boo
12870 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20  lean values. If 
12880 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75  the first is tru
12890 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
128a0 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  n of test_collat
128b0 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72  e is.** register
128c0 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
128d0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74   the second is t
128e0 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
128f0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
12900 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  .** UTF-16le, if
12910 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72   the third is tr
12920 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
12930 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
12940 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73  ble..** Previous
12950 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73   versions of tes
12960 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65  t_collate are de
12970 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
12980 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12990 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  nce test_collate
129a0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
129b0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a  by calling the.*
129c0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  * following TCL 
129d0 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
129e0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65  "test_collate <e
129f0 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22  nc> <lhs> <rhs>"
12a00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e  .**.** The <lhs>
12a10 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74   and <rhs> are t
12a20 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65  he two values be
12a30 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e  ing compared, en
12a40 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a  coded in UTF-8..
12a50 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72  ** The <enc> par
12a60 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e  ameter is the en
12a70 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f  coding of the co
12a80 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
12a90 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20   that.** SQLite 
12aa0 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c  selected to call
12ab0 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73  . The TCL test s
12ac0 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73  cript implements
12ad0 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f   the.** "test_co
12ae0 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a  llate" proc..**.
12af0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
12b00 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b  s will only work
12b10 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70 72   with one intepr
12b20 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20  eter at a time, 
12b30 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70  as the.** interp
12b40 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20   pointer to use 
12b50 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20  when evaluating 
12b60 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  the TCL script i
12b70 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70  s stored in.** p
12b80 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
12b90 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  p..*/.static Tcl
12ba0 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f  _Interp* pTestCo
12bb0 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61  llateInterp;.sta
12bc0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
12bd0 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69  late_func(.  voi
12be0 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  d *pCtx, .  int 
12bf0 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nA, const void *
12c00 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f  zA,.  int nB, co
12c10 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
12c20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20    Tcl_Interp *i 
12c30 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  = pTestCollateIn
12c40 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69  terp;.  int enci
12c50 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  n = SQLITE_PTR_T
12c60 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20 69  O_INT(pCtx);.  i
12c70 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b  nt res;.  int n;
12c80 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
12c90 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f  e *pVal;.  Tcl_O
12ca0 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20  bj *pX;..  pX = 
12cb0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12cc0 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  ("test_collate",
12cd0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
12ce0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20  RefCount(pX);.. 
12cf0 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29   switch( encin )
12d00 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
12d10 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63  E_UTF8:.      Tc
12d20 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12d30 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
12d40 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
12d50 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  F-8",-1));.     
12d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
12d70 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a   SQLITE_UTF16LE:
12d80 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
12d90 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12da0 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
12db0 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
12dc0 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
12dd0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
12de0 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
12df0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12e00 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
12e10 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
12e20 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29  j("UTF-16BE",-1)
12e30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
12e40 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
12e50 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
12e60 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  }..  sqlite3Begi
12e70 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
12e80 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
12e90 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
12ea0 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
12eb0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
12ec0 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c  tr(pVal, nA, zA,
12ed0 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
12ee0 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20  TATIC);.    n = 
12ef0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
12f00 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54  tes(pVal);.    T
12f10 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12f20 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20  Element(i,pX,.  
12f30 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
12f40 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
12f50 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
12f60 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20  (pVal),n));.    
12f70 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
12f80 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c  tr(pVal, nB, zB,
12f90 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
12fa0 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20  TATIC);.    n = 
12fb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
12fc0 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54  tes(pVal);.    T
12fd0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12fe0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20  Element(i,pX,.  
12ff0 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
13000 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
13010 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
13020 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20  (pVal),n));.    
13030 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13040 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  (pVal);.  }.  sq
13050 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
13060 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45  lloc();..  Tcl_E
13070 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20  valObjEx(i, pX, 
13080 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
13090 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
130a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
130b0 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  i, Tcl_GetObjRes
130c0 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20  ult(i), &res);. 
130d0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73   return res;.}.s
130e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
130f0 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
13100 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
13110 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13120 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13130 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
13140 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13150 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
13160 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al;.  sqlite3_va
13170 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
13180 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
13190 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
131a0 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c  rgs;.  pTestColl
131b0 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  ateInterp = inte
131c0 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  rp;.  if( getDbP
131d0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
131e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
131f0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
13200 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13210 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
13220 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
13230 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13240 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
13250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
13270 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
13280 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
13290 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  e", SQLITE_UTF8,
132a0 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
132b0 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c  d *)SQLITE_UTF8,
132c0 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
132d0 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
132e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
132f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  {.    const void
13300 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66   *zUtf16;.    if
13310 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
13320 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
13330 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
13340 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
13350 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  TCL_ERROR;.    r
13360 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
13370 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
13380 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
13390 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
133a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76   .            (v
133b0 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
133c0 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16LE, val?test_c
133d0 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
133e0 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
133f0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
13400 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13410 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
13420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13430 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20  ..#if 0.    if( 
13440 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
13450 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ail>0 ){.      s
13460 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
13470 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  il++;.    }.#end
13480 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  if.    sqlite3_m
13490 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
134a0 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20  utex);.    pVal 
134b0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
134c0 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
134d0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
134e0 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f  al, -1, "test_co
134f0 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
13500 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
13510 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20  IC);.    zUtf16 
13520 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
13530 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
13540 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
13550 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
13560 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
13570 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
13580 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
13590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
135a0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
135b0 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20  n16(db, zUtf16, 
135c0 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
135d0 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
135e0 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42   *)SQLITE_UTF16B
135f0 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  E, val?test_coll
13600 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20  ate_func:0);.   
13610 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
13620 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
13630 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13640 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
13650 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
13660 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13670 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
13680 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13690 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21  OR;.  .  if( rc!
136a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
136b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
136c0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
136d0 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
136e0 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
136f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13700 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
13710 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20  OK;..bad_args:. 
13720 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13730 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
13740 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
13750 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
13760 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
13770 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
13780 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
13790 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
137a0 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  >", 0);.  return
137b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
137c0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f  *.** When the co
137d0 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63  llation needed c
137e0 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
137f0 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e  ed, record the n
13800 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72  ame of .** the r
13810 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
13820 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  ng function here
13830 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64 20  .  The recorded 
13840 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a  name is linked.*
13850 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61  * to a TCL varia
13860 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20  ble and used to 
13870 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
13880 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
13890 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69  lation.** name i
138a0 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  s correct..*/.st
138b0 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65  atic char zNeede
138c0 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b  dCollation[200];
138d0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a  .static char *pz
138e0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20  NeededCollation 
138f0 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  = zNeededCollati
13900 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  on;.../*.** Call
13910 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74  ed when a collat
13920 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
13930 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74 65  needed.  Registe
13940 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  red using.** sql
13950 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
13960 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74  eeded16()..*/.st
13970 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63  atic void test_c
13980 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
13990 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
139a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
139b0 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
139c0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e    const void *pN
139d0 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63  ame.){.  int enc
139e0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e   = ENC(db);.  in
139f0 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
13a00 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a    for(z = (char*
13a10 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20  )pName, i=0; *z 
13a20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20  || z[1]; z++){. 
13a30 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65     if( *z ) zNee
13a40 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b  dedCollation[i++
13a50 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e  ] = *z;.  }.  zN
13a60 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69  eededCollation[i
13a70 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
13a80 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13a90 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65  n(.      db, "te
13aa0 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43  st_collate", ENC
13ab0 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54  (db), SQLITE_INT
13ac0 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74 65  _TO_PTR(enc), te
13ad0 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29  st_collate_func)
13ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
13af0 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61  : add_test_colla
13b00 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a  te_needed DB.*/.
13b10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
13b20 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a  collate_needed(.
13b30 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
13b40 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
13b50 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
13b60 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
13b70 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
13b80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
13b90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
13ba0 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f  ( objc!=2 ) goto
13bb0 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
13bc0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
13bd0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13be0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
13bf0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
13c00 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
13c10 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
13c20 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20  needed16(db, 0, 
13c30 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
13c40 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64  ded_cb);.  zNeed
13c50 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d  edCollation[0] =
13c60 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
13c70 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13c80 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
13c90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13ca0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
13cb0 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
13cc0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13cd0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
13ce0 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e   "DB");.  return
13cf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
13d00 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61  *.** tclcmd:   a
13d10 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
13d20 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42  t_collations  DB
13d30 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e  .**.** Add two n
13d40 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ew collating seq
13d50 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61  uences to the da
13d60 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20  tabase DB.**.** 
13d70 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65      utf16_aligne
13d80 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75  d.**     utf16_u
13d90 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42  naligned.**.** B
13da0 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  oth collating se
13db0 71 75 65 6e 63 65 73 20 75 73 65 20 74 68 65 20  quences use the 
13dc0 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20  same sort order 
13dd0 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68  as BINARY..** Th
13de0 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
13df0 65 20 69 73 20 74 68 61 74 20 74 68 65 20 75 74  e is that the ut
13e00 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c  f16_aligned coll
13e10 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
13e20 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 77 69  e is declared wi
13e30 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54  th the SQLITE_UT
13e40 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67  F16_ALIGNED flag
13e50 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  ..** Both collat
13e60 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ing functions in
13e70 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c  crement the unal
13e80 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e  igned utf16 coun
13e90 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ter.** whenever 
13ea0 74 68 65 79 20 73 65 65 20 61 20 73 74 72 69 6e  they see a strin
13eb0 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e  g that begins on
13ec0 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75   an odd byte bou
13ed0 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndary..*/.static
13ee0 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73   int unaligned_s
13ef0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20  tring_counter = 
13f00 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  0;.static int al
13f10 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28  ignmentCollFunc(
13f20 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
13f30 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
13f40 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
13f50 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
13f60 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
13f70 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
13f80 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
13f90 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
13fa0 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e  y2;.  if( nKey1>
13fb0 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49  0 && 1==(1&(SQLI
13fc0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b  TE_PTR_TO_INT(pK
13fd0 65 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e  ey1))) ) unalign
13fe0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13ff0 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32  r++;.  if( nKey2
14000 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c  >0 && 1==(1&(SQL
14010 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
14020 4b 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67  Key2))) ) unalig
14030 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
14040 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  er++;.  rc = mem
14050 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
14060 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
14070 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b  0 ){.    rc = nK
14080 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d  ey1 - nKey2;.  }
14090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
140a0 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f 61  static int add_a
140b0 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
140c0 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64  llations(.  void
140d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
140e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
140f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
14100 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
14110 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
14120 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
14130 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20   objc>=2 ){.    
14140 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
14150 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
14160 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
14170 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
14180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
14190 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
141a0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
141b0 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51  6_unaligned", SQ
141c0 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20  LITE_UTF16, .   
141d0 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e       0, alignmen
141e0 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20  tCollFunc);.    
141f0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
14200 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
14210 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51  f16_aligned", SQ
14220 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
14230 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20  ED, .        0, 
14240 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e  alignmentCollFun
14250 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
14260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
14270 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
14280 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
14290 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73  16) */../*.** Us
142a0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66 75  age: add_test_fu
142b0 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20  nction <db ptr> 
142c0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
142d0 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
142e0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
142f0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
14300 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
14310 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 75  ts the correct u
14320 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ser.** function 
14330 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75  callback when mu
14340 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20  ltiple versions 
14350 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74  (for different t
14360 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a  ext encodings).*
14370 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  * are available.
14380 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
14390 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
143a0 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72 65  sters up to thre
143b0 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
143c0 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a  e user function.
143d0 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  ** "test_functio
143e0 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73 65  n" with database
143f0 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49   handle <db>.  I
14400 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
14410 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65  ument is.** true
14420 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
14430 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69 6f   of test_functio
14440 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
14450 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68  for UTF-8, if th
14460 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74 72  e.** third is tr
14470 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
14480 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
14490 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65  UTF-16le, if the
144a0 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74 72   fourth is.** tr
144b0 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
144c0 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
144d0 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20 76  ble.  Previous v
144e0 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65  ersions of.** te
144f0 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  st_function are 
14500 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
14510 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
14520 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
14530 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  by calling the f
14540 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72  ollowing TCL scr
14550 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65  ipt:.**.**   "te
14560 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63  st_function <enc
14570 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57  > <arg>".**.** W
14580 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e  here <enc> is on
14590 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46 2d  e of UTF-8, UTF-
145a0 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45 2c  16LE or UTF16BE,
145b0 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74 68   and <arg> is th
145c0 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75  e.** single argu
145d0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
145e0 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  he SQL function.
145f0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
14600 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54 43  ned by.** the TC
14610 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65 64  L script is used
14620 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20 76   as the return v
14630 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c 20  alue of the SQL 
14640 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20  function. It.** 
14650 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51 4c  is passed to SQL
14660 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31 36  ite using UTF-16
14670 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20 74  BE for a UTF-8 t
14680 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  est_function(), 
14690 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55  UTF-8.** for a U
146a0 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75 6e  TF-16LE test_fun
146b0 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46  ction(), and UTF
146c0 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70  -16LE for an imp
146d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
146e0 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46 2d  .** prefers UTF-
146f0 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  16BE..*/.#ifndef
14700 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
14710 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  16.static void t
14720 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14730 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  8(.  sqlite3_con
14740 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
14750 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
14760 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
14770 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
14780 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
14790 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
147a0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
147b0 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
147c0 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
147d0 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
147e0 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
147f0 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
14800 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
14810 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
14820 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
14830 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14840 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
14850 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
14860 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20  UTF-8", -1));.  
14870 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14880 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
14890 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
148a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
148b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
148c0 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
148d0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
148e0 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
148f0 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
14900 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14910 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14920 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f 47  text(pCtx, Tcl_G
14930 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
14940 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49  nterp), -1, SQLI
14950 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
14960 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
14970 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
14980 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
14990 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
149a0 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
149b0 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
149c0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
149d0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
149e0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
149f0 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69  t16be(pCtx, sqli
14a00 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14a10 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  be(pVal),.      
14a20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
14a30 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
14a40 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
14a50 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
14a60 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14a70 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16le(.  sqlite3_
14a80 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
14a90 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
14aa0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14ab0 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14ac0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14ad0 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14ae0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14af0 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14b00 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14b10 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14b20 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
14b30 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
14b40 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
14b50 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
14b60 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
14b70 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14b80 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14b90 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14ba0 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31  j("UTF-16LE", -1
14bb0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
14bc0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14bd0 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
14be0 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14bf0 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14c00 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14c10 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
14c20 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
14c30 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14c40 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14c50 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
14c60 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
14c70 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14c80 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
14c90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
14ca0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14cb0 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14cc0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14cd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14ce0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63 68  lt_text(pCtx,(ch
14cf0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
14d00 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c  e_text(pVal),-1,
14d10 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14d20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
14d30 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
14d40 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
14d50 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
14d60 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
14d70 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
14d80 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
14d90 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
14da0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
14db0 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
14dc0 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
14dd0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
14de0 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
14df0 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
14e00 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
14e10 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
14e20 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
14e30 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
14e40 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
14e50 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
14e60 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14e70 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
14e80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
14e90 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a  TF-16BE", -1));.
14ea0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14eb0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14ec0 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
14ed0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
14ee0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
14ef0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
14f00 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
14f10 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
14f20 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
14f30 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
14f40 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
14f50 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
14f60 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14f70 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
14f80 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
14f90 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
14fa0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
14fb0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14fc0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14fd0 65 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c 69  ext16(pCtx, sqli
14fe0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
14ff0 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
15000 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
15010 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
15020 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
15030 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
15040 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
15050 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
15060 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
15070 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
15080 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78  lt_text16le(pCtx
15090 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
150a0 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
150b0 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
150c0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
150d0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
150e0 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pVal);.}.#endif 
150f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
15100 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69  TF16 */.static i
15110 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  nt test_function
15120 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
15130 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
15140 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
15150 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
15160 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
15170 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
15180 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
15190 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
151a0 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  nt val;..  if( o
151b0 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61  bjc!=5 ) goto ba
151c0 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
151d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
151e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
151f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
15200 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15210 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
15220 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
15230 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
15240 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
15250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15260 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
15270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
15280 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15290 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
152a0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
152b0 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
152c0 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
152d0 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20  _utf8, 0, 0);.  
152e0 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
152f0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
15300 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15310 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
15320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15330 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
15340 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
15350 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
15360 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
15370 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
15380 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
15390 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
153a0 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b  _utf16le, 0, 0);
153b0 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
153c0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
153d0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
153e0 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
153f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15400 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
15410 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
15420 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15430 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
15440 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
15450 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6BE, .        in
15460 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
15470 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20  ion_utf16be, 0, 
15480 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
15490 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72  n TCL_OK;.bad_ar
154a0 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
154b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
154c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
154d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
154e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
154f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
15500 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
15510 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
15520 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e  f16be>", 0);.#en
15530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15540 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
15550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15560 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15570 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15580 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72  test_errstr <err
15590 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73   code>.**.** Tes
155a0 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69  t that the engli
155b0 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69  sh language stri
155c0 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66  ng equivalents f
155d0 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  or sqlite error 
155e0 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e  codes.** are san
155f0 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
15600 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72   is an integer r
15610 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73  epresenting an s
15620 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
15630 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
15640 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f  is a list of two
15650 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73   elements, the s
15660 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
15670 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65  tion of the.** e
15680 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68  rror code and th
15690 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
156a0 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a  ge explanation..
156b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
156c0 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69  st_errstr(.  voi
156d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
156e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
156f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15700 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15710 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
15720 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e  har *zCode;.  in
15730 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  t i;.  if( objc!
15740 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
15750 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15760 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72  p, 1, objv, "<er
15770 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d  ror code>");.  }
15780 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f  ..  zCode = Tcl_
15790 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
157a0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
157b0 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <200; i++){.    
157c0 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31  if( 0==strcmp(t1
157d0 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43  ErrorName(i), zC
157e0 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ode) ) break;.  
157f0 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
15800 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
15810 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
15820 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  i), 0);.  return
15830 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
15840 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61  * Usage:    brea
15850 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69  kpoint.**.** Thi
15860 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73  s routine exists
15870 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65   for one purpose
15880 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20   - to provide a 
15890 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a  place to put a.*
158a0 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74  * breakpoint wit
158b0 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62  h GDB that can b
158c0 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e  e triggered usin
158d0 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65  g TCL code.  The
158e0 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73   use.** for this
158f0 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69   is when a parti
15900 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73  cular test fails
15910 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34   on (say) the 14
15920 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a  85th iteration..
15930 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65  ** In the TCL te
15940 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61  st script, we ca
15950 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20  n add code like 
15960 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
15970 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72  if {$i==1485} br
15980 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
15990 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74  hen run testfixt
159a0 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67  ure in the debug
159b0 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72  ger and wait for
159c0 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20   the breakpoint 
159d0 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65  to.** fire.  The
159e0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65  n additional bre
159f0 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20  akpoints can be 
15a00 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77  set to trace dow
15a10 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74  n the bug..*/.st
15a20 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72  atic int test_br
15a30 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64  eakpoint(.  void
15a40 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
15a50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15a60 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
15a70 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
15a80 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
15a90 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
15aa0 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
15ab0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
15ac0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
15ad0 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
15ae0 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
15af0 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
15b00 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
15b10 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  OK;         /* D
15b20 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a  o nothing */.}..
15b30 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15b40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
15b50 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e  blob  STMT IDX N
15b60 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
15b70 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
15b80 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  oblob interface.
15b90 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
15ba0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
15bb0 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69 6e  ** IDX is the in
15bc0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15bd0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15be0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15bf0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
15c00 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72  nds a N-byte zer
15c10 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f  o-filled BLOB to
15c20 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a   the wildcard..*
15c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15c40 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28  t_bind_zeroblob(
15c50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15c60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15c70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15c80 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15c90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15ca0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
15cb0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
15cc0 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  idx;.  int n;.  
15cd0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
15ce0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
15cf0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
15d00 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
15d10 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20  "STMT IDX N");. 
15d20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15d30 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15d40 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15d50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15d60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15d70 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15d90 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15da0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15db0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15dd0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15de0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15df0 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74  jv[3], &n) ) ret
15e00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
15e20 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74  ind_zeroblob(pSt
15e30 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69  mt, idx, n);.  i
15e40 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
15e50 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
15e60 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
15e70 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15e80 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
15e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15ea0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15eb0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
15ec0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
15ed0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
15ee0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54  te3_bind_int  ST
15ef0 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
15f00 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15f10 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72  3_bind_int inter
15f20 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
15f30 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15f40 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
15f50 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15f60 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15f70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15f80 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15f90 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20   binds a 32-bit 
15fa0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
15fb0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
15fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15fd0 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76  st_bind_int(.  v
15fe0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15ff0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16000 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16010 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16020 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16030 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16040 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16050 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20  .  int value;.  
16060 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
16070 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
16080 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16090 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
160a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
160b0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
160c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
160d0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
160e0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
160f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16110 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
16120 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16130 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
16140 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
16150 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16160 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
16170 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16180 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
16190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
161a0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
161b0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
161c0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
161d0 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ue) ) return TCL
161e0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
161f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
16200 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
16210 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
16220 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
16230 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
16240 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
16250 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16270 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
16280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16290 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
162a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
162b0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
162c0 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20  d_int64  STMT N 
162d0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
162e0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
162f0 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63  d_int64 interfac
16300 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16310 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16320 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16330 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16340 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16350 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16360 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16370 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
16380 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
16390 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
163a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
163b0 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f  bind_int64(.  vo
163c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
163d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
163e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
163f0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
16400 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
16410 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16420 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
16430 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61    Tcl_WideInt va
16440 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
16450 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
16460 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16480 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16490 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
164a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
164b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
164c0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
164d0 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
164e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
164f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16500 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16510 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16520 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16530 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16540 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16550 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16560 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16570 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16580 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16590 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
165a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
165b0 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
165c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
165d0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
165e0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
165f0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
16600 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
16610 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
16620 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
16630 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
16640 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
16670 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16680 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16690 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
166a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
166b0 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41  ouble  STMT N VA
166c0 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
166d0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
166e0 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65  double interface
166f0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
16700 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
16710 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
16720 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
16730 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
16740 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
16750 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
16760 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
16770 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
16780 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
16790 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
167a0 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ind_double(.  vo
167b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
167c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
167d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
167e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
167f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
16800 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16810 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
16820 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
16830 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
16840 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20  t char *zVal;.  
16850 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20  int i;.  static 
16860 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
16870 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
16880 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d  Name;     /* Nam
16890 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
168a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
168b0 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73  value */.    uns
168c0 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72  igned int iUpper
168d0 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20  ;   /* Upper 32 
168e0 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69  bits */.    unsi
168f0 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b  gned int iLower;
16900 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62     /* Lower 32 b
16910 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63  its */.  } aSpec
16920 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  ialFp[] = {.    
16930 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30  {  "NaN",      0
16940 78 37 66 66 66 66 66 66 66 2c 20 30 78 66 66 66  x7fffffff, 0xfff
16950 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
16960 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66  "SNaN",     0x7f
16970 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  f7ffff, 0xffffff
16980 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e  ff },.    {  "-N
16990 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66 66  aN",     0xfffff
169a0 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
169b0 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e  },.    {  "-SNaN
169c0 22 2c 20 20 20 20 30 78 66 66 66 37 66 66 66 66  ",    0xfff7ffff
169d0 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a  , 0xffffffff },.
169e0 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20      {  "+Inf",  
169f0 20 20 20 30 78 37 66 66 30 30 30 30 30 2c 20 30     0x7ff00000, 0
16a00 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
16a10 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20   {  "-Inf",     
16a20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78 30 30  0xfff00000, 0x00
16a30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
16a40 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30   "Epsilon",  0x0
16a50 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  0000000, 0x00000
16a60 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  001 },.    {  "-
16a70 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30  Epsilon", 0x8000
16a80 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31  0000, 0x00000001
16a90 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30   },.    {  "NaN0
16aa0 22 2c 20 20 20 20 20 30 78 37 66 66 38 30 30 30  ",     0x7ff8000
16ab0 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
16ac0 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c  .    {  "-NaN0",
16ad0 20 20 20 20 30 78 66 66 66 38 30 30 30 30 2c 20      0xfff80000, 
16ae0 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
16af0 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  };..  if( objc!=
16b00 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
16b10 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16b20 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16b30 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
16b40 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
16b50 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16b60 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
16b70 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
16b80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16b90 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
16ba0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
16bb0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
16bc0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
16bd0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
16be0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16bf0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
16c00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16c10 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
16c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
16c30 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68   /* Intercept th
16c40 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61  e string "NaN" a
16c50 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61  nd generate a Na
16c60 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a  N value for it..
16c70 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73    ** All other s
16c80 74 72 69 6e 67 73 20 61 72 65 20 70 61 73 73 65  trings are passe
16c90 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c  d through to Tcl
16ca0 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
16cb0 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65  j()..  ** Tcl_Ge
16cc0 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29  tDoubleFromObj()
16cd0 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61   should understa
16ce0 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d  nd "NaN" but som
16cf0 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20  e versions.  ** 
16d00 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20  contain a bug.. 
16d10 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c   */.  zVal = Tcl
16d20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16d30 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  3]);.  for(i=0; 
16d40 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61  i<sizeof(aSpecia
16d50 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65  lFp)/sizeof(aSpe
16d60 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29  cialFp[0]); i++)
16d70 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
16d80 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a  (aSpecialFp[i].z
16d90 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29  Name, zVal)==0 )
16da0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16db0 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20  uint64 x;.      
16dc0 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69  x = aSpecialFp[i
16dd0 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20  ].iUpper;.      
16de0 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20  x <<= 32;.      
16df0 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b  x |= aSpecialFp[
16e00 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20  i].iLower;.     
16e10 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
16e20 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20  value)==8 );.   
16e30 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
16e40 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  f(x)==8 );.     
16e50 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20   memcpy(&value, 
16e60 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72  &x, 8);.      br
16e70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
16e80 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
16e90 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f  SpecialFp)/sizeo
16ea0 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29  f(aSpecialFp[0])
16eb0 20 26 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c   &&.         Tcl
16ec0 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
16ed0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
16ee0 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20  ], &value) ){.  
16ef0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16f00 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
16f10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
16f20 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  le(pStmt, idx, v
16f30 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  alue);.  if( sql
16f40 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16f50 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
16f60 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
16f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16f80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
16fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16fb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
16fc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
16fd0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
16fe0 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a  nd_null  STMT N.
16ff0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
17000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
17010 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
17020 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
17030 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
17040 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
17050 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
17060 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
17070 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
17080 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e  and.** binds a N
17090 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ULL to the wildc
170a0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
170b0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c  nt test_bind_nul
170c0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
170d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
170e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
170f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17100 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17110 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17120 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
17130 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b  t idx;.  int rc;
17140 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
17150 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
17160 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17170 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17180 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17190 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
171a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
171b0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
171c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
171d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
171e0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
171f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17200 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17210 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
17220 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17230 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
17240 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17250 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
17260 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17270 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
17280 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
17290 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69  pStmt, idx);.  i
172a0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
172b0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
172c0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
172d0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
172e0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
172f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17300 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17310 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
17320 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17330 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17340 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53  te3_bind_text  S
17350 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
17360 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
17370 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
17380 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ext interface.  
17390 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
173a0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
173b0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
173c0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
173d0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
173e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
173f0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17400 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53  a UTF-8 string S
17410 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
17420 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
17430 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
17440 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
17450 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
17460 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20  nd_text(.  void 
17470 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17480 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17490 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
174a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
174b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
174c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
174d0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
174e0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
174f0 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
17500 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
17510 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
17520 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17530 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
17540 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
17550 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
17560 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
17570 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
17580 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
17590 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
175a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
175b0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
175c0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
175d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
175e0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
175f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17600 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17610 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17620 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
17630 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17640 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
17650 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
17660 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
17670 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20  v[3], &bytes);. 
17680 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17690 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
176a0 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
176b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
176c0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
176d0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
176e0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
176f0 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
17700 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
17710 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17720 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17730 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17740 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17750 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
17760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17770 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17780 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
17790 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63  TestErrorName(rc
177a0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
177b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
177c0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
177d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
177e0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
177f0 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69  d_text16 ?-stati
17800 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  c? STMT N STRING
17810 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
17820 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
17830 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66  nd_text16 interf
17840 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
17850 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
17860 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
17870 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
17880 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
17890 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
178a0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
178b0 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73  binds a UTF-16 s
178c0 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20  tring STRING to 
178d0 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54  the wildcard.  T
178e0 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59 54  he string is BYT
178f0 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67  ES bytes.** long
17900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17910 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
17920 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17930 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17940 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17950 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17960 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17970 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
17980 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
17990 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
179a0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
179b0 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
179c0 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
179d0 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  t rc;..  void (*
179e0 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28  xDel)(void*) = (
179f0 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53  objc==6?SQLITE_S
17a00 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41  TATIC:SQLITE_TRA
17a10 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f  NSIENT);.  Tcl_O
17a20 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f  bj *oStmt    = o
17a30 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54  bjv[objc-4];.  T
17a40 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20  cl_Obj *oN      
17a50 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b   = objv[objc-3];
17a60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72  .  Tcl_Obj *oStr
17a70 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  ing  = objv[objc
17a80 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -2];.  Tcl_Obj *
17a90 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b  oBytes   = objv[
17aa0 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20  objc-1];..  if( 
17ab0 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
17ac0 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  =6){.    Tcl_App
17ad0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17ae0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
17af0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
17b00 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
17b10 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
17b20 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
17b30 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
17b40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
17b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17b60 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
17b70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17b80 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74  _GetString(oStmt
17b90 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17ba0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17bb0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17bc0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17bd0 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  N, &idx) ) retur
17be0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
17bf0 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63  alue = (char*)Tc
17c00 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
17c10 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30  omObj(oString, 0
17c20 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
17c30 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17c40 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65  p, oBytes, &byte
17c50 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
17c60 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17c70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17c80 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28  16(pStmt, idx, (
17c90 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79  void *)value, by
17ca0 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66  tes, xDel);.  if
17cb0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
17cc0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
17cd0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
17ce0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17cf0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
17d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17d10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17d20 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
17d30 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28 72  3TestErrorName(r
17d40 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
17d50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17d60 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
17d70 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
17d80 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
17d90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17da0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17db0 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f  d_blob ?-static?
17dc0 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54   STMT N DATA BYT
17dd0 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
17de0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  e sqlite3_bind_b
17df0 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
17e00 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
17e10 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
17e20 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
17e30 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
17e40 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
17e50 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
17e60 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17e70 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69  a BLOB to the wi
17e80 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f  ldcard.  The BLO
17e90 42 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  B is BYTES bytes
17ea0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61   in size..*/.sta
17eb0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17ec0 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  d_blob(.  void *
17ed0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
17ee0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
17ef0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
17f00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
17f10 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
17f20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
17f30 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
17f40 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
17f50 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
17f60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74  ;.  sqlite3_dest
17f70 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73  ructor_type xDes
17f80 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45  tructor = SQLITE
17f90 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69  _TRANSIENT;..  i
17fa0 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
17fb0 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=6 ){.    Tcl
17fc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17fd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17fe0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17ff0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
18000 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
18010 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
18020 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
18030 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
18040 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18050 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36  }..  if( objc==6
18060 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63   ){.    xDestruc
18070 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41  tor = SQLITE_STA
18080 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b  TIC;.    objv++;
18090 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
180a0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
180b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
180c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
180d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
180e0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
180f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
18100 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
18110 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
18120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75  CL_ERROR;.  valu
18130 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
18140 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66  g(objv[3]);.  if
18150 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18160 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18170 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [4], &bytes) ) r
18180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18190 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
181a0 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74  _bind_blob(pStmt
181b0 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79  , idx, value, by
181c0 74 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72  tes, xDestructor
181d0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
181e0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
181f0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
18200 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
18210 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18230 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
18240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
18250 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18260 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18270 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
18280 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20  arameter_count  
18290 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
182a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
182b0 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65  wildcards in the
182c0 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74   given statement
182d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
182e0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
182f0 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ter_count(.  voi
18300 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18310 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18320 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18330 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18340 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18350 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18360 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
18370 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
18380 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18390 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
183a0 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
183b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
183c0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
183d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
183e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
183f0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
18400 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18410 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
18420 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
18430 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
18440 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
18450 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
18460 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18480 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
18490 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20  parameter_name  
184a0 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65  STMT  N.**.** Re
184b0 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
184c0 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72   the Nth wildcar
184d0 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69  d.  The first wi
184e0 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20  ldcard is 1..** 
184f0 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  An empty string 
18500 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e  is returned if N
18510 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
18520 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63   or if the wildc
18530 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65  ard.** is namele
18540 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ss..*/.static in
18550 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
18560 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f  meter_name(.  vo
18570 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18580 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18590 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
185a0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
185b0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
185c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
185d0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  tmt;.  int i;.. 
185e0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
185f0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18600 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
18610 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b  objv, "STMT N");
18620 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18630 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18640 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18650 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18660 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18670 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18680 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18690 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
186a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
186b0 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72  [2], &i) ) retur
186c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
186d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
186e0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
186f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
18700 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
18710 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74  meter_name(pStmt
18720 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72  ,i),-1).  );.  r
18730 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18740 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18750 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
18760 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54  ameter_index  ST
18770 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  MT  NAME.**.** R
18780 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
18790 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20  of the wildcard 
187a0 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65  called NAME.  Re
187b0 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20  turn 0 if there 
187c0 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69  is.** no such wi
187d0 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
187e0 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
187f0 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
18800 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18810 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18820 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18830 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18840 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18850 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
18860 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
18870 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
18880 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
18890 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
188a0 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a  , "STMT NAME");.
188b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
188c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
188d0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
188e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
188f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18900 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18910 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
18920 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18930 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
18940 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20  NewIntObj(.     
18950 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
18960 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70  arameter_index(p
18970 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69  Stmt,Tcl_GetStri
18980 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20  ng(objv[2])).   
18990 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72    ).  );.  retur
189a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
189b0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
189c0 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
189d0 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74  gs STMT.**.*/.st
189e0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c  atic int test_cl
189f0 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20  ear_bindings(.  
18a00 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18a10 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18a20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18a30 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18a40 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18a50 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18a60 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
18a70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
18a80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
18a90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
18aa0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
18ab0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18ac0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
18ad0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18ae0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18af0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18b00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18b10 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
18b20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
18b30 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
18b40 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
18b50 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  gs(pStmt)));.  r
18b60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18b70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18b80 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49  sqlite3_sleep MI
18b90 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74  LLISECONDS.*/.st
18ba0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c  atic int test_sl
18bb0 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  eep(.  void * cl
18bc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18bd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18be0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18bf0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18c00 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b  v[].){.  int ms;
18c10 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18c20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18c30 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18c40 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  1, objv, "MILLIS
18c50 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65  ECONDS");.    re
18c60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18c70 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
18c80 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18c90 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73  rp, objv[1], &ms
18ca0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
18cb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
18cc0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18cd0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18ce0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
18cf0 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72  sleep(ms)));.  r
18d00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18d10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
18d20 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
18d30 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20  rrcode DB.**.** 
18d40 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e  Return the strin
18d50 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
18d60 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
18d70 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
18d80 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  I.** error code.
18d90 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52   e.g. "SQLITE_ER
18da0 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ROR"..*/.static 
18db0 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63  int test_ex_errc
18dc0 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ode(.  void * cl
18dd0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18de0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18df0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18e00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18e10 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18e20 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
18e30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18e40 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18e50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18e60 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18e70 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18e80 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18e90 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
18ea0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
18eb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18ec0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
18ed0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18ee0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18ef0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18f00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74  rc = sqlite3_ext
18f20 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62  ended_errcode(db
18f30 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
18f40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
18f50 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
18f60 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
18f70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
18f80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18f90 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a  ite3_errcode DB.
18fa0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18fb0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
18fc0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
18fd0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
18fe0 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
18ff0 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
19000 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
19010 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
19020 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
19030 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19040 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19050 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19060 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19070 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
19080 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
19090 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
190a0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
190b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
190c0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
190d0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
190e0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
190f0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19100 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
19110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19120 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19130 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19140 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19150 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19170 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
19180 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54  errcode(db);.  T
19190 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
191a0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
191b0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
191c0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
191d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
191e0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
191f0 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20  errmsg DB.**.** 
19200 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
19210 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  8 representation
19220 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
19230 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
19240 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
19250 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
19260 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  I call..*/.stati
19270 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73  c int test_errms
19280 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  g(.  void * clie
19290 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
192a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
192b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
192c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
192d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
192e0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
192f0 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f   *zErr;..  if( o
19300 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
19310 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19320 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19330 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
19340 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
19350 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19360 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
19370 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19380 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19390 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
193a0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
193b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
193c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
193d0 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
193e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
193f0 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  b);.  Tcl_SetObj
19400 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
19410 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
19420 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65  zErr, -1));.  re
19430 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19440 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74  /*.** Usage:   t
19450 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a  est_errmsg16 DB.
19460 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
19470 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65  e UTF-16 represe
19480 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
19490 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
194a0 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
194b0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
194c0 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54  e3_* API call. T
194d0 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72  his is a byte ar
194e0 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68  ray object at th
194f0 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c  e TCL .** level,
19500 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73   and it includes
19510 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74   the 0x00 0x00 t
19520 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20  erminator bytes 
19530 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
19540 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69  e.** UTF-16 stri
19550 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
19560 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28  t test_errmsg16(
19570 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19580 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19590 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
195a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
195b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
195c0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
195d0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
195e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
195f0 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a  nst void *zErr;.
19600 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
19610 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
19620 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
19630 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
19640 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
19650 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
19660 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
19670 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
19680 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
19690 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
196a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
196b0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
196c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
196d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
196e0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
196f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19700 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
19710 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
19720 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
19730 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20    z = zErr;.    
19740 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62  for(bytes=0; z[b
19750 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73  ytes] || z[bytes
19760 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d  +1]; bytes+=2){}
19770 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
19780 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
19790 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
197a0 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29  Obj(zErr, bytes)
197b0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
197c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
197d0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
197e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
197f0 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
19800 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  re DB sql bytes 
19810 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
19820 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
19830 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
19840 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
19850 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
19860 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
19870 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
19880 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
19890 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
198a0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
198b0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
198c0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
198d0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
198e0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
198f0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
19900 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19910 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
19920 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20  epare(.  void * 
19930 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19940 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19950 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19960 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19970 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19980 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19990 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
199a0 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
199b0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
199c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
199d0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
199e0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
199f0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
19a00 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
19a10 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
19a20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19a30 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19a40 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19a50 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19a60 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19a70 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
19a80 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
19a90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19aa0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
19ab0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
19ac0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19ad0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
19ae0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19af0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
19b00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19b10 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
19b20 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
19b30 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
19b40 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
19b50 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
19b60 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
19b70 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  re(db, zSql, byt
19b80 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63  es, &pStmt, objc
19b90 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30  >=5 ? &zTail : 0
19ba0 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
19bb0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
19bc0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
19bd0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
19be0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
19bf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
19c00 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d   zTail && objc>=
19c10 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74  5 ){.    if( byt
19c20 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  es>=0 ){.      b
19c30 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28  ytes = bytes - (
19c40 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  int)(zTail-zSql)
19c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19c60 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69  (int)strlen(zTai
19c70 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20  l)<bytes ){.    
19c80 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73    bytes = (int)s
19c90 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20  trlen(zTail);.  
19ca0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
19cb0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
19cc0 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
19cd0 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
19ce0 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
19cf0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19d10 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
19d20 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
19d30 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
19d40 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19d50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19d60 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
19d70 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
19d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19d90 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
19da0 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
19db0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19dc0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19dd0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
19de0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19df0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19e00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19e10 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
19e20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19e30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19e40 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
19e50 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
19e60 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
19e70 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
19e80 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
19e90 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
19ea0 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
19eb0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
19ec0 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
19ed0 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
19ee0 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
19ef0 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
19f00 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
19f10 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
19f20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
19f30 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
19f40 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
19f50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
19f60 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
19f70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  are_v2(.  void *
19f80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19f90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19fa0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19fb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19fc0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
19fd0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
19fe0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
19ff0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
1a000 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
1a010 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
1a020 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1a030 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1a040 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a050 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1a060 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1a070 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1a080 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1a090 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1a0a0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1a0b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1a0c0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1a0d0 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
1a0e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a0f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1a100 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1a110 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1a120 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1a130 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a140 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
1a150 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a160 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
1a170 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1a180 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
1a190 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1a1a0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1a1b0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1a1c0 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62  e_v2(db, zSql, b
1a1d0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
1a1e0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
1a1f0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
1a200 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1a210 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f  Stmt==0);.  Tcl_
1a220 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
1a230 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rp);.  if( sqlit
1a240 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1a250 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1a260 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a270 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
1a280 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1a290 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
1a2a0 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
1a2b0 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69  tes - (int)(zTai
1a2c0 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
1a2d0 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1a2e0 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1a2f0 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ], 0, Tcl_NewStr
1a300 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79  ingObj(zTail, by
1a310 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  tes), 0);.  }.  
1a320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a330 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1a340 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
1a350 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1a360 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1a370 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a380 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a390 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1a3a0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1a3b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a3c0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1a3d0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1a3e0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1a3f0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1a400 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1a410 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a420 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a430 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a440 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1a450 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a460 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a470 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
1a480 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61   DB.**.** Genera
1a490 74 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74  te a prepared st
1a4a0 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65  atement for a ze
1a4b0 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61  ro-byte string a
1a4c0 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20  s a test.** for 
1a4d0 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54  ticket #3134.  T
1a4e0 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64  he string should
1a4f0 20 62 65 20 70 72 65 63 65 65 64 65 64 20 62 79   be preceeded by
1a500 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f   a zero byte..*/
1a510 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1a520 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
1a530 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a540 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a550 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a560 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a570 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a580 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1a590 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  b;.  static cons
1a5a0 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20  t char zSql[] = 
1a5b0 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a  "\000SELECT 1";.
1a5c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a5d0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1a5e0 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
1a5f0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1a600 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1a610 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a620 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1a630 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1a640 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1a650 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1a660 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1a670 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
1a680 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a690 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1a6a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1a6b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1a6c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1a6d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a6e0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1a6f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1a700 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c  db, &zSql[1], 0,
1a710 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61   &pStmt, 0);.  a
1a720 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
1a730 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
1a740 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1a750 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1a760 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1a770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a780 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a790 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
1a7a0 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  ( pStmt==0 );.  
1a7b0 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
1a7c0 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
1a7d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a7e0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1a7f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1a800 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
1a810 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a820 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1a830 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1a840 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1a850 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1a860 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1a870 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a880 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a890 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1a8a0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1a8b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a8c0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1a8d0 33 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73  3_prepare16 DB s
1a8e0 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72  ql bytes tailvar
1a8f0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1a900 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1a910 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1a920 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1a930 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1a940 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1a950 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1a960 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1a970 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1a980 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1a990 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1a9a0 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1a9b0 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1a9c0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1a9d0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1a9e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a9f0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a  test_prepare16(.
1aa00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1aa10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1aa20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1aa30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1aa40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1aa50 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1aa60 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1aa70 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1aa80 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20  st void *zSql;. 
1aa90 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61   const void *zTa
1aaa0 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  il = 0;.  Tcl_Ob
1aab0 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20  j *pTail = 0;.  
1aac0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1aad0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1aae0 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74  zBuf[50]; .  int
1aaf0 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   rc;.  int bytes
1ab00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ab10 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
1ab20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
1ab30 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
1ab40 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1ab50 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
1ab60 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
1ab70 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
1ab80 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1ab90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1aba0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1abb0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1abc0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1abd0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1abe0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1abf0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1ac00 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
1ac10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ac20 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ac30 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1ac40 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ac50 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1ac60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ac70 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
1ac80 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1ac90 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
1aca0 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
1acb0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1acc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1acd0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
1ace0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1acf0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1ad00 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c  pare16(db, zSql,
1ad10 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1ad20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1ad30 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c   : 0);.  if( sql
1ad40 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1ad50 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1ad60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ad70 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
1ad80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ad90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1ada0 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1adb0 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
1adc0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
1add0 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a  en - (int)((u8 *
1ade0 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
1adf0 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1ae00 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b       objlen = 0;
1ae10 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c  .    }.    pTail
1ae20 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
1ae30 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
1ae40 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20  il, objlen);.   
1ae50 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1ae60 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63  t(pTail);.    Tc
1ae70 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
1ae80 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
1ae90 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20   pTail, 0);.    
1aea0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1aeb0 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20  (pTail);.  }..  
1aec0 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1aed0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1aee0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1aef0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1af00 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1af10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
1af20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1af30 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1af40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1af50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1af60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1af70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1af80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1af90 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74  16_v2 DB sql byt
1afa0 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  es ?tailvar?.**.
1afb0 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
1afc0 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
1afd0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
1afe0 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
1aff0 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
1b000 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
1b010 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
1b020 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
1b030 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
1b040 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
1b050 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
1b060 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
1b070 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
1b080 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
1b090 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1b0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b0b0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20  _prepare16_v2(. 
1b0c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b0d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b0e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b0f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b100 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b120 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
1b130 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1b140 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
1b150 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
1b160 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
1b170 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
1b180 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1b190 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
1b1a0 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
1b1b0 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
1b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1d0 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
1b1e0 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
1b1f0 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
1b200 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1b210 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
1b220 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
1b230 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
1b240 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
1b250 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1b260 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b270 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1b280 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1b290 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1b2a0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1b2b0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1b2c0 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
1b2d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b2e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1b2f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1b300 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b310 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1b320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b330 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1b340 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1b350 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
1b360 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
1b370 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1b380 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1b390 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1b3a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1b3b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1b3c0 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71  are16_v2(db, zSq
1b3d0 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
1b3e0 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
1b3f0 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73  il : 0);.  if( s
1b400 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1b410 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
1b420 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b430 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
1b440 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1b450 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1b460 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  f( objc>=5 ){.  
1b470 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20    if( zTail ){. 
1b480 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62       objlen = ob
1b490 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38  jlen - (int)((u8
1b4a0 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a   *)zTail-(u8 *)z
1b4b0 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
1b4c0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1b4d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  0;.    }.    pTa
1b4e0 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  il = Tcl_NewByte
1b4f0 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a  ArrayObj((u8 *)z
1b500 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20  Tail, objlen);. 
1b510 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1b520 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20  unt(pTail);.    
1b530 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1b540 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1b550 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20  0, pTail, 0);.  
1b560 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1b570 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a  nt(pTail);.  }..
1b580 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1b590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1b5a0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1b5b0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1b5c0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1b5d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b5e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b5f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1b600 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1b610 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1b620 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1b630 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1b640 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20  e: sqlite3_open 
1b650 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e  filename ?option
1b660 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69  s-list?.*/.stati
1b670 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28  c int test_open(
1b680 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1b690 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b6a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b6b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b6c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b6d0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1b6e0 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
1b6f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
1b700 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1b710 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
1b720 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
1b730 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  1 ){.    Tcl_App
1b740 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b750 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b760 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1b770 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1b780 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1b790 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
1b7a0 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
1b7b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b7c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
1b7d0 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20  name = objc>1 ? 
1b7e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b7f0 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71  jv[1]) : 0;.  sq
1b800 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
1b810 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20  name, &db);.  . 
1b820 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1b830 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1b840 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1b850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b860 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1b870 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1b880 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1b890 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b8a0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b8b0 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e  e3_open_v2 FILEN
1b8c0 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f  AME FLAGS VFS.*/
1b8d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b8e0 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64  _open_v2(.  void
1b8f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b900 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b910 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b920 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b930 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1b940 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1b950 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
1b960 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66  r *zVfs;.  int f
1b970 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lags = 0;.  sqli
1b980 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1b990 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
1b9a0 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61  00];..  int nFla
1b9b0 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  g;.  Tcl_Obj **a
1b9c0 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  pFlag;.  int i;.
1b9d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
1b9e0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b9f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1ba00 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d  , objv, "FILENAM
1ba10 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20  E FLAGS VFS");. 
1ba20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ba30 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  ROR;.  }.  zFile
1ba40 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
1ba50 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
1ba60 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
1ba70 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
1ba80 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30    if( zVfs[0]==0
1ba90 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a  x00 ) zVfs = 0;.
1baa0 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74  .  rc = Tcl_List
1bab0 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
1bac0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1bad0 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29  &nFlag, &apFlag)
1bae0 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1baf0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1bb00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c    for(i=0; i<nFl
1bb10 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ag; i++){.    in
1bb20 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72  t iFlag;.    str
1bb30 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20  uct OpenFlag {. 
1bb40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1bb50 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e  *zFlag;.      in
1bb60 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46  t flag;.    } aF
1bb70 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  lag[] = {.      
1bb80 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1bb90 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45  EADONLY", SQLITE
1bba0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
1bbb0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bbc0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1bbd0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
1bbe0 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20  EADWRITE },.    
1bbf0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bc00 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45  _CREATE", SQLITE
1bc10 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
1bc20 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bc30 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1bc40 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  SE", SQLITE_OPEN
1bc50 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d  _DELETEONCLOSE }
1bc60 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bc70 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1bc80 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  ", SQLITE_OPEN_E
1bc90 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20  XCLUSIVE },.    
1bca0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bcb0 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c  _AUTOPROXY", SQL
1bcc0 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1bcd0 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  XY },.      { "S
1bce0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1bcf0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1bd00 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20  _MAIN_DB },.    
1bd10 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1bd20 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54  _TEMP_DB", SQLIT
1bd30 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d  E_OPEN_TEMP_DB }
1bd40 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bd50 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1bd60 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1bd70 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d  N_TRANSIENT_DB }
1bd80 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bd90 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1bda0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1bdb0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d  N_MAIN_JOURNAL }
1bdc0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bdd0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1bde0 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1bdf0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d  N_TEMP_JOURNAL }
1be00 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1be10 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
1be20 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1be30 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  SUBJOURNAL },.  
1be40 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1be50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1be60 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1be70 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d  MASTER_JOURNAL }
1be80 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1be90 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c  E_OPEN_NOMUTEX",
1bea0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
1beb0 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20  UTEX },.      { 
1bec0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  "SQLITE_OPEN_FUL
1bed0 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  LMUTEX", SQLITE_
1bee0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d  OPEN_FULLMUTEX }
1bef0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bf00 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
1bf10 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  HE", SQLITE_OPEN
1bf20 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
1bf30 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bf40 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
1bf50 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1bf60 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
1bf70 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bf80 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54  OPEN_WAL", SQLIT
1bf90 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20  E_OPEN_WAL },.  
1bfa0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1bfb0 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f  EN_URI", SQLITE_
1bfc0 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20  OPEN_URI },.    
1bfd0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d    { 0, 0 }.    }
1bfe0 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
1bff0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74  etIndexFromObjSt
1c000 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46  ruct(interp, apF
1c010 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73  lag[i], aFlag, s
1c020 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c  izeof(aFlag[0]),
1c030 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22   .        "flag"
1c040 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20  , 0, &iFlag.    
1c050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54  );.    if( rc!=T
1c060 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
1c070 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  c;.    flags |= 
1c080 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61  aFlag[iFlag].fla
1c090 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  g;.  }..  rc = s
1c0a0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
1c0b0 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66  Filename, &db, f
1c0c0 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69  lags, zVfs);.  i
1c0d0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1c0e0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1c0f0 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
1c100 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c110 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
1c120 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1c130 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
1c140 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c150 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c160 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65  _open16 filename
1c170 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
1c180 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e  ic int test_open
1c190 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1c1a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c1b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c1c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c1d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c1e0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1c1f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1c200 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
1c210 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
1c220 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a  e3 *db;.  char z
1c230 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
1c240 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c250 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c260 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c270 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c280 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c290 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c2a0 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
1c2b0 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
1c2c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c2d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c2e0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
1c2f0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1c300 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1c310 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
1c320 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  n16(zFilename, &
1c330 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
1c340 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1c350 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1c360 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1c370 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c380 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c390 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1c3a0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1c3b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c3c0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1c3d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c3e0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  e: sqlite3_compl
1c3f0 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74  ete16 <UTF-16 st
1c400 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ring>.**.** Retu
1c410 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70  rn 1 if the supp
1c420 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73  lied argument is
1c430 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
1c440 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65  statement, or ze
1c450 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
1c460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c470 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a  est_complete16(.
1c480 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c490 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c4a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c4b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c4c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c4d0 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1c4e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c  QLITE_OMIT_COMPL
1c4f0 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ETE) && !defined
1c500 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
1c510 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66  16).  char *zBuf
1c520 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1c530 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1c540 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1c550 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d   1, objv, "<utf-
1c560 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72  16 sql>");.    r
1c570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c580 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28  .  }..  zBuf = (
1c590 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
1c5a0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1c5b0 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c  jv[1], 0);.  Tcl
1c5c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c5d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1c5e0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70  Obj(sqlite3_comp
1c5f0 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a  lete16(zBuf)));.
1c600 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1c610 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26  _OMIT_COMPLETE &
1c620 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  & SQLITE_OMIT_UT
1c630 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1c640 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c650 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c660 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  step STMT.**.** 
1c670 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74  Advance the stat
1c680 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ement to the nex
1c690 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
1c6a0 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a   int test_step(.
1c6b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c6c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c6d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c6e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c6f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c700 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1c710 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
1c720 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1c730 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1c740 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c750 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c760 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c770 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c780 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c790 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
1c7a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c7b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1c7c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1c7d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c7e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1c7f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1c800 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1c810 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1c820 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72  mt);..  /* if( r
1c830 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c!=SQLITE_DONE &
1c840 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
1c850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c860 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65  ROR; */.  Tcl_Se
1c870 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1c880 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1c890 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
1c8a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c8b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1c8c0 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  _sql(.  void * c
1c8d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c8e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c8f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c900 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c910 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1c920 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
1c930 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1c940 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1c950 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1c960 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
1c970 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c980 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c990 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1c9a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c9b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c9c0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1c9d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1c9e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1c9f0 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
1ca00 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20  te3_sql(pStmt), 
1ca10 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
1ca20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ca30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ca40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
1ca50 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ount STMT .**.**
1ca60 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1ca70 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65  er of columns re
1ca80 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71  turned by the sq
1ca90 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54  l statement STMT
1caa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cab0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
1cac0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1cad0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1cae0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1caf0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1cb00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1cb10 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1cb20 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
1cb30 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1cb40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1cb50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1cb60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1cb70 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1cb80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1cb90 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1cba0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1cbb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cbc0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1cbd0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1cbe0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1cbf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1cc00 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1cc10 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
1cc20 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1cc30 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1cc40 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
1cc50 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  n_count(pStmt)))
1cc60 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1cc70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1cc80 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1cc90 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  n_type STMT colu
1cca0 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1ccb0 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
1ccc0 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
1ccd0 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
1cce0 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
1ccf0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1cd00 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f  olumn_type(.  vo
1cd10 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cd20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1cd30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cd40 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cd50 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1cd60 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1cd70 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1cd80 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28    int tp;..  if(
1cd90 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1cda0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cdb0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1cdc0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1cdd0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1cde0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cdf0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1ce00 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1ce10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ce20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1ce30 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1ce40 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ce50 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1ce60 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1ce70 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1ce80 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1ce90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1cea0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1ceb0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20  CL_ERROR;..  tp 
1cec0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1ced0 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c  _type(pStmt, col
1cee0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20  );.  switch( tp 
1cef0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1cf00 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20  TE_INTEGER: .   
1cf10 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1cf20 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45  (interp, "INTEGE
1cf30 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  R", TCL_STATIC);
1cf40 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1cf50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
1cf60 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ULL:.      Tcl_S
1cf70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1cf80 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41   "NULL", TCL_STA
1cf90 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1cfa0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1cfb0 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
1cfc0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1cfd0 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20  nterp, "FLOAT", 
1cfe0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1cff0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1d000 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
1d010 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1d020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45  sult(interp, "TE
1d030 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  XT", TCL_STATIC)
1d040 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1d050 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1d060 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f  BLOB:.      Tcl_
1d070 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1d080 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54  , "BLOB", TCL_ST
1d090 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1d0a0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1d0b0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
1d0c0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1d0d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d0e0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d0f0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54  _column_int64 ST
1d100 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1d110 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
1d120 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1d130 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1d140 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e  t row cast as an
1d150 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74  .** wide (64-bit
1d160 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  ) integer..*/.st
1d170 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1d180 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f  lumn_int64(.  vo
1d190 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d1a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d1b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d1c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d1d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d1e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d1f0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1d200 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69    i64 iVal;..  i
1d210 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1d220 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d230 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d240 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d250 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1d260 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d270 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1d280 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1d290 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d2a0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1d2b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1d2c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1d2d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1d2e0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1d2f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1d300 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1d310 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d320 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1d330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69   TCL_ERROR;..  i
1d340 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
1d350 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74  lumn_int64(pStmt
1d360 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1d370 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d380 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
1d390 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72  tObj(iVal));.  r
1d3a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d3b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d3c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1d3d0 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  b STMT column.*/
1d3e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d3f0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
1d400 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1d410 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1d420 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d430 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d440 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d450 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d460 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1d470 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
1d480 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
1d490 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
1d4a0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1d4b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1d4c0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1d4d0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1d4e0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1d4f0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1d500 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1d510 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1d520 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1d530 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1d540 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1d550 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1d560 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1d570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d580 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1d590 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1d5a0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1d5b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d5c0 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  R;..  len = sqli
1d5d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
1d5e0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1d5f0 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
1d600 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
1d610 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1d620 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d630 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
1d640 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
1d650 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
1d660 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d670 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1d680 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
1d690 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1d6a0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1d6b0 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1d6c0 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1d6d0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
1d6e0 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
1d6f0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1d700 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20  _double(.  void 
1d710 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1d720 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d730 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d740 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d750 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1d760 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d770 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64  ;.  int col;.  d
1d780 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69  ouble rVal;..  i
1d790 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1d7a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1d7b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1d7c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d7d0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1d7e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d7f0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1d800 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1d810 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d820 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1d830 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1d840 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1d850 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1d860 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1d870 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1d880 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1d890 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d8a0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1d8b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1d8c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Val = sqlite3_co
1d8d0 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d  lumn_double(pStm
1d8e0 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1d8f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d900 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c  rp, Tcl_NewDoubl
1d910 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72  eObj(rVal));.  r
1d920 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d930 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d940 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
1d950 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
1d960 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1d970 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  f columns return
1d980 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74  ed by the sql st
1d990 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f  atement STMT..*/
1d9a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1d9b0 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76  _data_count(.  v
1d9c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1d9d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1d9e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d9f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1da00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1da10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1da20 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1da30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1da40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1da50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1da60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1da70 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1da80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1da90 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1daa0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1dab0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1dac0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1dad0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1dae0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1daf0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1db00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1db10 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1db20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1db30 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1db40 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28  ite3_data_count(
1db50 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
1db60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1db70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1db80 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53  e3_column_text S
1db90 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1dba0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1dbb0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
1dbc0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1dbd0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1dbe0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d  _column_name STM
1dbf0 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
1dc00 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1dc10 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20  _utf8(.  void * 
1dc20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
1dc30 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1dc40 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1dc50 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1dc60 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  e */.  Tcl_Inter
1dc70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1dc80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1dc90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1dca0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1dcb0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
1dcc0 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol;.  const char
1dcd0 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74   *(*xFunc)(sqlit
1dce0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1dcf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52    const char *zR
1dd00 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  et;..  xFunc = (
1dd10 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28  const char *(*)(
1dd20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1dd30 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1dd40 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1dd50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1dd60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1dd70 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1dd80 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1dd90 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1dda0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1ddb0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1ddc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ddd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1dde0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1ddf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1de00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1de10 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1de20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1de30 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1de40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1de50 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1de60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1de70 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53   zRet = xFunc(pS
1de80 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28  tmt, col);.  if(
1de90 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c   zRet ){.    Tcl
1dea0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1deb0 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c  p, (char *)zRet,
1dec0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1ded0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1dee0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f  tic int test_glo
1def0 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76  bal_recover(.  v
1df00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1df10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1df20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1df30 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1df40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1df50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1df60 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
1df70 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
1df80 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
1df90 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1dfa0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1dfb0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1dfc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1dfd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f  rc = sqlite3_glo
1dfe0 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20  bal_recover();. 
1dff0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1e000 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1e010 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1e020 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e  TCL_STATIC);.#en
1e030 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1e040 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e050 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e060 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
1e070 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1e080 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e090 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
1e0a0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1e0b0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1e0c0 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
1e0d0 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1e0e0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
1e0f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e100 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f  tData,     /* Po
1e110 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1e120 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1e130 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
1e140 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e150 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1e160 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1e170 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1e180 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1e190 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
1e1a0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1e1b0 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a  t col;.  Tcl_Obj
1e1c0 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20   *pRet;.  const 
1e1d0 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20  void *zName16;. 
1e1e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78   const void *(*x
1e1f0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
1e200 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
1e210 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69  unc = (const voi
1e220 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  d *(*)(sqlite3_s
1e230 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
1e240 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
1e250 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e260 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e270 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e280 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e290 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1e2a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1e2b0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1e2c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1e2d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e2e0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1e2f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1e300 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e310 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1e320 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e330 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1e340 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1e350 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1e360 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e370 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36  RROR;..  zName16
1e380 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
1e390 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  col);.  if( zNam
1e3a0 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  e16 ){.    int n
1e3b0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1e3c0 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20   *z = zName16;. 
1e3d0 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d     for(n=0; z[n]
1e3e0 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32   || z[n+1]; n+=2
1e3f0 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54  ){}.    pRet = T
1e400 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1e410 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29  bj(zName16, n+2)
1e420 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
1e430 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
1e440 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ret);.  }.#endif
1e450 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1e460 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75  UTF16 */..  retu
1e470 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e480 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e490 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54  e3_column_int ST
1e4a0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1e4b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1e4c0 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54  olumn_bytes STMT
1e4d0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1e4e0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e4f0 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54  umn_bytes16 STMT
1e500 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74   column.**.*/.st
1e510 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1e520 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  mt_int(.  void *
1e530 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
1e540 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
1e550 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
1e560 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
1e570 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1e580 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e590 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e5a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e5b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1e5c0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1e5d0 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
1e5e0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1e5f0 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
1e600 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65   (int (*)(sqlite
1e610 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
1e620 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1e630 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1e640 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e650 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e660 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e670 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1e680 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e690 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1e6a0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1e6b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e6c0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1e6d0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1e6e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e6f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1e700 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e710 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1e720 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1e730 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1e740 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1e750 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
1e760 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1e770 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1e780 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20  bj(xFunc(pStmt, 
1e790 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  col)));.  return
1e7a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1e7b0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
1e7c0 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20  _set_magic  DB  
1e7d0 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a  MAGIC-NUMBER.**.
1e7e0 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d  ** Set the db->m
1e7f0 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69  agic value.  Thi
1e800 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
1e810 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79  t error recovery
1e820 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69   logic..*/.stati
1e830 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74  c int sqlite_set
1e840 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a  _magic(.  void *
1e850 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e860 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e870 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1e880 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1e890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1e8a0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1e8b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e8c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e8d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e8e0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1e8f0 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44  0],.         " D
1e900 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20  B MAGIC", 0);.  
1e910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e920 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e930 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e940 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1e950 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e960 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  ROR;.  if( strcm
1e970 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1e980 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d  TE_MAGIC_OPEN")=
1e990 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1e9a0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1e9b0 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65  IC_OPEN;.  }else
1e9c0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1e9d0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1e9e0 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29  IC_CLOSED")==0 )
1e9f0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1ea00 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
1ea10 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  LOSED;.  }else i
1ea20 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1ea30 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1ea40 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20  _BUSY")==0 ){.  
1ea50 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1ea60 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
1ea70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1ea80 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1ea90 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52  LITE_MAGIC_ERROR
1eaa0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1eab0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1eac0 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d  MAGIC_ERROR;.  }
1ead0 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74  else if( Tcl_Get
1eae0 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
1eaf0 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e  [2], (int*)&db->
1eb00 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65  magic) ){.    re
1eb10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1eb20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1eb30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1eb40 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e  age:  sqlite3_in
1eb50 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a  terrupt  DB .**.
1eb60 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e  ** Trigger an in
1eb70 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f  terrupt on DB.*/
1eb80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1eb90 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f  _interrupt(.  vo
1eba0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ebb0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ebc0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1ebd0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1ebe0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1ebf0 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
1ec00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ec10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ec20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ec30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1ec40 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30  rgv[0], " DB", 0
1ec50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ec60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ec70 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1ec80 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1ec90 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1eca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
1ecb0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
1ecc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1ecd0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38  OK;.}..static u8
1ece0 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f   *sqlite3_stack_
1ecf0 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f  baseline = 0;../
1ed00 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74  *.** Fill the st
1ed10 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e  ack with a known
1ed20 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a   bitpattern..*/.
1ed30 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70  static void prep
1ed40 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69  Stack(void){.  i
1ed50 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42  nt i;.  u32 bigB
1ed60 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72  uf[65536];.  for
1ed70 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62  (i=0; i<sizeof(b
1ed80 69 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69  igBuf)/sizeof(bi
1ed90 67 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62  gBuf[0]); i++) b
1eda0 69 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61  igBuf[i] = 0xdea
1edb0 64 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33  dbeef;.  sqlite3
1edc0 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20  _stack_baseline 
1edd0 3d 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36  = (u8*)&bigBuf[6
1ede0 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  5536];.}../*.** 
1edf0 47 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20  Get the current 
1ee00 73 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73  stack depth.  Us
1ee10 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
1ee20 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71   only..*/.u64 sq
1ee30 6c 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28  lite3StackDepth(
1ee40 76 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20  void){.  u8 x;. 
1ee50 20 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71   return (u64)(sq
1ee60 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
1ee70 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f  line - &x);.}../
1ee80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1ee90 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20  ite3_stack_used 
1eea0 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79  DB SQL.**.** Try
1eeb0 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
1eec0 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20  amount of stack 
1eed0 73 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20  space used by a 
1eee0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
1eef0 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  exec.*/.static i
1ef00 6e 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73  nt test_stack_us
1ef10 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
1ef20 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ef30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ef40 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1ef50 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1ef60 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1ef70 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d   i;.  if( argc!=
1ef80 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1ef90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1efa0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1efb0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1efc0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1efd0 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b    " DB SQL", 0);
1efe0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1eff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f000 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f010 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f020 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f030 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74  _ERROR;.  prepSt
1f040 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73  ack();.  (void)s
1f050 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
1f060 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30  argv[2], 0, 0, 0
1f070 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35  );.  for(i=65535
1f080 3b 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a  ; i>=0 && ((u32*
1f090 29 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  )sqlite3_stack_b
1f0a0 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78  aseline)[-i]==0x
1f0b0 64 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d  deadbeef; i--){}
1f0c0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1f0d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1f0e0 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b  NewIntObj(i*4));
1f0f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f100 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f110 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f  : sqlite_delete_
1f120 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63  function DB func
1f130 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1f140 44 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20  Delete the user 
1f150 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69  function 'functi
1f160 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61  on-name' from da
1f170 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42  tabase handle DB
1f180 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d  . It.** is assum
1f190 65 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72  ed that the user
1f1a0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72   function was cr
1f1b0 65 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61  eated as UTF8, a
1f1c0 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ny number of.** 
1f1d0 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77  arguments (the w
1f1e0 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ay the TCL inter
1f1f0 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a  face does it)..*
1f200 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  /.static int del
1f210 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ete_function(.  
1f220 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f230 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f240 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1f250 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1f260 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
1f270 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1f280 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1f290 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1f2a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1f2b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1f2c0 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1f2d0 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1f2e0 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22  B function-name"
1f2f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1f300 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f310 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1f320 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1f330 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1f340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1f350 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
1f360 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
1f370 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
1f380 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
1f390 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
1f3a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1f3b0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1f3c0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1f3d0 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
1f3e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f3f0 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
1f400 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42  ete_collation DB
1f410 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a   collation-name.
1f420 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
1f430 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1f440 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  nce 'collation-n
1f450 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
1f460 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42  se handle .** DB
1f470 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
1f480 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
1f490 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20  on sequence was 
1f4a0 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20  created as UTF8 
1f4b0 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65  (the .** way the
1f4c0 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1f4d0 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1f4e0 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f  ic int delete_co
1f4f0 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  llation(.  void 
1f500 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1f510 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1f520 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1f530 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1f540 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1f550 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1f560 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1f570 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f580 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f590 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f5a0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1f5b0 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
1f5c0 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
1f5d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f5e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f5f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f600 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f610 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f620 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1f630 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
1f640 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  llation(db, argv
1f650 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  [2], SQLITE_UTF8
1f660 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  , 0, 0);.  Tcl_S
1f670 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1f680 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1f690 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1f6a0 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
1f6b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f6c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1f6d0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44  get_autocommit D
1f6e0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
1f6f0 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62  rue if the datab
1f700 61 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e  ase DB is curren
1f710 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d  tly in auto-comm
1f720 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75  it mode..** Retu
1f730 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e  rn false if not.
1f740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1f750 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20  et_autocommit(. 
1f760 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f770 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f780 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f790 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1f7a0 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42  rgv.){.  char zB
1f7b0 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65  uf[30];.  sqlite
1f7c0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1f7d0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1f7e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f7f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1f800 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1f810 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1f820 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a       " DB", 0);.
1f830 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f840 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f850 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f860 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1f870 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1f880 45 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66  ERROR;.  sprintf
1f890 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c  (zBuf, "%d", sql
1f8a0 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1f8b0 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  mit(db));.  Tcl_
1f8c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f8d0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1f8e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f900 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
1f910 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a  eout DB MS.**.**
1f920 20 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69   Set the busy ti
1f930 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20  meout.  This is 
1f940 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65  more easily done
1f950 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f   using the timeo
1f960 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ut.** method of 
1f970 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1f980 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20  e.  But we need 
1f990 61 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68  a way to test th
1f9a0 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20  e case.** where 
1f9b0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1f9c0 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61  E_MISUSE..*/.sta
1f9d0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73  tic int test_bus
1f9e0 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69  y_timeout(.  voi
1f9f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fa00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fa10 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1fa20 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1fa30 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b  ){.  int rc, ms;
1fa40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1fa50 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1fa60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1fa70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1fa80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1fa90 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1faa0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1fab0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1fac0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fad0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1fae0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1faf0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1fb00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1fb10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1fb20 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
1fb30 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
1fb40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1fb50 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  = sqlite3_busy_t
1fb60 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a  imeout(db, ms);.
1fb70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1fb80 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
1fb90 65 33 54 65 73 74 45 72 72 6f 72 4e 61 6d 65 28  e3TestErrorName(
1fba0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1fbb0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1fbc0 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
1fbd0 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
1fbe0 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
1fbf0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1fc00 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
1fc10 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
1fc20 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
1fc30 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
1fc40 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1fc50 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
1fc60 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
1fc70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1fc80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1fc90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1fca0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1fcb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
1fcc0 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
1fcd0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1fce0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1fcf0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1fd00 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
1fd10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1fd20 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
1fd30 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
1fd40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1fd50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1fd60 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
1fd70 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
1fd80 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
1fd90 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
1fda0 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
1fdb0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1fdc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1fdd0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
1fde0 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
1fdf0 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
1fe00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fe10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1fe20 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1fe30 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  emory ?N?.**.** 
1fe40 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1fe50 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1fe60 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74  tly held but not
1fe70 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
1fe80 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  ed..** The integ
1fe90 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
1fea0 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61  er of bytes we a
1feb0 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c  re trying to rel
1fec0 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72  ease.  The .** r
1fed0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1fee0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
1fef0 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  ory actually rel
1ff00 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eased..*/.static
1ff10 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73   int test_releas
1ff20 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
1ff30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1ff40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ff50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ff60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ff70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1ff80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1ff90 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1ffa0 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
1ffb0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1ffc0 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e  _DISKIO).  int N
1ffd0 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
1ffe0 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
1fff0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20000 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20010 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20020 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
20030 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20040 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
20050 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
20060 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
20070 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
20080 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20090 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
200a0 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20    N = -1;.  }.  
200b0 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  amt = sqlite3_re
200c0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b  lease_memory(N);
200d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
200e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
200f0 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  NewIntObj(amt));
20100 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
20110 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20120 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
20130 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
20140 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  mory DB.**.** At
20150 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
20160 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
20170 79 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61  y held by databa
20180 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74  se DB.  Return t
20190 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64  he.** result cod
201a0 65 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20  e (which in the 
201b0 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
201c0 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  tation is always
201d0 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69   zero)..*/.stati
201e0 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65  c int test_db_re
201f0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
20200 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20210 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20220 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20230 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20240 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20250 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20260 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
20270 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
20280 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
20290 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
202a0 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
202b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
202c0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
202d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
202e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
202f0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
20300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
20310 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  c = sqlite3_db_r
20320 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62  elease_memory(db
20330 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
20340 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
20350 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
20360 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
20370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
20380 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e:  sqlite3_db_f
20390 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d  ilename DB DBNAM
203a0 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
203b0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
203c0 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
203d0 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  h a database..*/
203e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
203f0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20  _db_filename(.  
20400 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20410 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20420 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20430 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20440 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20450 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20460 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
20470 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Name;.  if( objc
20480 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
20490 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
204a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
204b0 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
204c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
204d0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
204e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
204f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20500 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
20510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20520 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c  .  zDbName = Tcl
20530 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20540 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
20550 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
20560 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
20570 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
20580 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72  , (void*)0);.  r
20590 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
205a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
205b0 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
205c0 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a  ly DB DBNAME.**.
205d0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  ** Return 1 or 0
205e0 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65   if DBNAME is re
205f0 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20  adonly or not.  
20600 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e  Return -1 if DBN
20610 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  AME does.** not 
20620 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  exist..*/.static
20630 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61   int test_db_rea
20640 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
20650 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20660 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20670 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20680 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20690 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
206a0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
206b0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
206c0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
206d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
206e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
206f0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
20700 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
20710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20720 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20730 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20740 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20750 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
20770 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
20780 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
20790 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
207a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
207b0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
207c0 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a  b_readonly(db, z
207d0 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74  DbName)));.  ret
207e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
207f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
20800 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
20810 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51  imit ?N?.**.** Q
20820 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
20830 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20  soft heap limit 
20840 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20850 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20  thread.  The.** 
20860 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68  limit is only ch
20870 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69  anged if the N i
20880 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  s present.  The 
20890 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a  previous limit.*
208a0 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
208b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
208c0 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
208d0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
208e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
208f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20900 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20910 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20920 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ].){.  sqlite3_i
20930 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f  nt64 amt;.  Tcl_
20940 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a  WideInt N = -1;.
20950 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
20960 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20970 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20980 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20990 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
209a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
209b0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
209c0 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
209d0 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
209e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
209f0 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
20a00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
20a10 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
20a20 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
20a30 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  4(N);.  Tcl_SetO
20a40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20a50 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
20a60 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75  bj(amt));.  retu
20a70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20a80 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
20a90 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
20aa0 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
20ab0 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
20ac0 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
20ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20ae0 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
20af0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
20b00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
20b10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
20b20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
20b30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20b40 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
20b50 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
20b60 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
20b70 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
20b80 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
20b90 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20ba0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
20bb0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
20bc0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
20bd0 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
20be0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
20bf0 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
20c00 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
20c10 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
20c20 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
20c30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20c40 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
20c50 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
20c60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20c70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20c80 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20c90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20ca0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
20cb0 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
20cc0 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f  nt v, *a;.  Tcl_
20cd0 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20  Obj *pResult;.. 
20ce0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
20cf0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
20d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
20d10 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
20d20 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
20d30 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
20d40 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
20d50 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
20d60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20d70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20d80 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
20d90 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
20da0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
20db0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20dc0 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20  RROR;.  pResult 
20dd0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
20de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
20df0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
20e00 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
20e10 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  Bt==0 ){.      v
20e20 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
20e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20e40 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
20e50 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20  mutex);.      a 
20e60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
20e70 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
20e80 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
20e90 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
20ea0 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71  = a[0];.      sq
20eb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20ec0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
20ed0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
20ee0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
20ef0 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
20f00 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
20f10 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
20f20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
20f30 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
20f40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
20f50 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f  .** tclcmd:   wo
20f60 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a  rking_64bit_int.
20f70 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62  **.** Some TCL b
20f80 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69  uilds (ex: cygwi
20f90 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  n) do not suppor
20fa0 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  t 64-bit integer
20fb0 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64  s.  This.** lead
20fc0 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66  s to a number of
20fd0 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20   test failures. 
20fe0 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d   The present com
20ff0 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a  mand checks the.
21000 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20  ** TCL build to 
21010 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
21020 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36  ot it supports 6
21030 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
21040 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54   It.** returns T
21050 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61  RUE if it does a
21060 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
21070 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
21080 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77  and is used to w
21090 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74  arn users that t
210a0 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69  heir TCL build i
210b0 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61  s defective.** a
210c0 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  nd that the erro
210d0 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69  rs they are seei
210e0 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ng in the test s
210f0 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a  cripts might be.
21100 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  ** a result of t
21110 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54  heir defective T
21120 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  CL rather than p
21130 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74  roblems in SQLit
21140 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
21150 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
21160 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
21170 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
21180 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
21190 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
211a0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
211b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
211c0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
211d0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
211e0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
211f0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
21200 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21210 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21220 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21230 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21240 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
21250 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
21260 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62  Tcl_Obj *pTestOb
21270 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67  j;.  int working
21280 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62   = 0;..  pTestOb
21290 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
212a0 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69  ntObj(1000000*(i
212b0 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a  64)1234567890);.
212c0 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63    working = strc
212d0 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
212e0 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33  (pTestObj), "123
212f0 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d  4567890000000")=
21300 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  =0;.  Tcl_DecrRe
21310 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29  fCount(pTestObj)
21320 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
21330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
21340 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77  _NewBooleanObj(w
21350 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75  orking));.  retu
21360 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
21370 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
21380 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a  fs_unlink_test.*
21390 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
213a0 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72  mmand unregister
213b0 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46  s the primary VF
213c0 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73  S and then regis
213d0 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20  ters.** it back 
213e0 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  again.  This is 
213f0 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
21400 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69   ability to regi
21410 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68  ster a.** VFS wh
21420 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76  en none are prev
21430 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
21440 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69  d, and the abili
21450 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69  ty to .** unregi
21460 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76  ster the only av
21470 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69  ailable VFS.  Ti
21480 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74  cket #2738.*/.st
21490 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c  atic int vfs_unl
214a0 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ink_test(.  Clie
214b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
214c0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
214d0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
214e0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
214f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21500 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
21510 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
21520 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21530 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
21540 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
21550 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21560 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
21570 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21580 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
21590 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
215a0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
215b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69  qlite3_vfs *pMai
215c0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n;.  sqlite3_vfs
215d0 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73   *apVfs[20];.  s
215e0 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20  qlite3_vfs one, 
215f0 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  two;..  sqlite3_
21600 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30  vfs_unregister(0
21610 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  );   /* Unregist
21620 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61  er of NULL is ha
21630 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e  rmless */.  one.
21640 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
21650 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22  .  two.zName = "
21660 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61  __two";..  /* Ca
21670 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  lling sqlite3_vf
21680 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
21690 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  2nd argument of 
216a0 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  0 does not.  ** 
216b0 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  change the defau
216c0 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d  lt VFS.  */.  pM
216d0 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ain = sqlite3_vf
216e0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c  s_find(0);.  sql
216f0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21700 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73  r(&one, 0);.  as
21710 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
21720 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
21730 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21740 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21750 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b  gister(&two, 0);
21760 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
21770 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
21780 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21790 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61  ) );..  /* We ca
217a0 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20  n find a VFS by 
217b0 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73  its name */.  as
217c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
217d0 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
217e0 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
217f0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21800 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21810 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  wo );..  /* Call
21820 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72  ing sqlite_vfs_r
21830 65 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e  egister with non
21840 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72  -zero second par
21850 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74  ameter changes t
21860 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
21870 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65  VFS, even if the
21880 20 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69   1st parameter i
21890 73 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53  s an existig VFS
218a0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72   that is.  ** pr
218b0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
218c0 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64  red as the non-d
218d0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73  efault..  */.  s
218e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
218f0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
21900 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21910 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
21920 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
21930 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21940 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21950 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
21960 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21970 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  nd(0)==&one );. 
21980 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21990 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a  ister(&two, 1);.
219a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
219b0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
219c0 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
219d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
219e0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
219f0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
21a00 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21a10 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b  find(0)==&two );
21a20 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a  .  if( pMain ){.
21a30 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
21a40 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
21a50 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
21a60 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21a70 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
21a80 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
21a90 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21aa0 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
21ab0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21ac0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21ad0 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a  )==pMain );.  }.
21ae0 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74    .  /* Unlink t
21af0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20  he default VFS. 
21b00 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
21b10 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
21b20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73  VFSes.  ** regis
21b30 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tered..  */.  fo
21b40 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
21b50 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
21b60 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Vfs[0]); i++){. 
21b70 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
21b80 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21b90 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
21ba0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  [i] ){.      ass
21bb0 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
21bc0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21bd0 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
21be0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
21bf0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21c00 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20  (apVfs[i]);.    
21c10 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
21c20 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
21c30 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
21c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21c50 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
21c60 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21c70 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72    .  /* Register
21c80 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73   the main VFS as
21c90 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69   non-default (wi
21ca0 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75  ll be made defau
21cb0 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69  lt, since.  ** i
21cc0 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79  t'll be the only
21cd0 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63   one in existenc
21ce0 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e)..  */.  sqlit
21cf0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21d00 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73  pMain, 0);.  ass
21d10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21d20 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
21d30 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65  );.  .  /* Un-re
21d40 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
21d50 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73  VFS again to res
21d60 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46  tore an empty VF
21d70 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  S list */.  sqli
21d80 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21d90 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73  er(pMain);.  ass
21da0 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
21db0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
21dc0 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20    /* Relink all 
21dd0 56 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65  VFSes in reverse
21de0 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66   order. */  .  f
21df0 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
21e00 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
21e10 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
21e20 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
21e30 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
21e40 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21e50 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
21e60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
21e70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
21e80 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
21e90 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
21ea0 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
21eb0 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
21ec0 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
21ed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65  }.  }..  /* Unre
21ee0 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c  gister out sampl
21ef0 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71  e VFSes. */.  sq
21f00 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21f10 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
21f20 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21f30 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f  ster(&two);..  /
21f40 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  * Unregistering 
21f50 61 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f  a VFS that is no
21f60 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69  t currently regi
21f70 73 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65  stered is harmle
21f80 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ss */.  sqlite3_
21f90 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
21fa0 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
21fb0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
21fc0 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  two);.  assert( 
21fd0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21fe0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a  ("__one")==0 );.
21ff0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22000 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
22010 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  o")==0 );..  /* 
22020 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66  We should be lef
22030 74 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69  t with the origi
22040 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20  nal default VFS 
22050 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a  back as the.  **
22060 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61   original */.  a
22070 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
22080 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
22090 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  n );..  return T
220a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
220b0 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e  tclcmd:   vfs_in
220c0 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a  itfail_test.**.*
220d0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
220e0 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  nd attempts to v
220f0 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f  fs_find and vfs_
22100 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68  register when th
22110 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69  e.** sqlite3_ini
22120 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66  tialize() interf
22130 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20  ace is failing. 
22140 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c   All calls shoul
22150 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69  d fail..*/.stati
22160 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61  c int vfs_initfa
22170 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
22180 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
22190 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
221a0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
221b0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
221c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
221d0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
221e0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
221f0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
22200 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
22210 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
22220 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22230 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
22240 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22250 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
22260 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
22270 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
22280 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
22290 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
222a0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
222b0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
222c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
222d0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
222e0 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
222f0 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
22300 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
22310 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
22320 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
22330 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
22340 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
22350 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
22360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
22370 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22380 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
22390 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
223a0 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
223b0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
223c0 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
223d0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
223e0 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
223f0 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
22400 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
22410 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73   int vfs_unregis
22420 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
22430 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
22440 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
22450 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
22460 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
22470 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22480 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
22490 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
224a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
224b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
224c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
224d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
224e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
224f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22500 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
22510 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
22520 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
22530 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
22540 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
22550 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
22560 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22570 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
22580 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
22590 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
225a0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
225b0 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
225c0 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
225d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
225e0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
225f0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
22600 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
22610 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
22620 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
22630 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
22640 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
22650 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
22660 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
22670 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
22680 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
22690 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
226a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
226b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
226c0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
226d0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
226e0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
226f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
22700 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22710 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
22720 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22730 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22740 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22750 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22760 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22770 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20   i<nVfs; i++){. 
22780 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
22790 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
227a0 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
227b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
227c0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
227d0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
227e0 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
227f0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
22800 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
22810 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
22820 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
22830 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
22840 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
22850 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
22860 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22870 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22880 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22890 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
228a0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
228b0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
228c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
228d0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
228e0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
228f0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22900 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22910 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22930 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22940 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22950 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22960 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22970 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
22980 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22990 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
229a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
229b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
229c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
229d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
229e0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
229f0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
22a00 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
22a10 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
22a20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22a30 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22a40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22a50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22a60 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
22a70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22a80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22a90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22aa0 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
22ab0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22ac0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
22ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22ae0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
22af0 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
22b00 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
22b10 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
22b20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
22b30 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
22b40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22b50 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
22b60 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
22b70 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22b80 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
22b90 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22ba0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22bb0 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
22bc0 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
22bd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
22be0 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OUND || rc==SQLI
22bf0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72  TE_ERROR );..  r
22c00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22c10 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22c20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
22c30 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42  asterrno_test DB
22c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
22c50 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
22c60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22c70 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
22c80 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
22c90 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
22ca0 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
22cb0 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e  LAST_ERRNO verb.
22cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
22cd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
22ce0 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c  errno_test(.  Cl
22cf0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22d00 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
22d10 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22d20 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22d30 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22d40 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22d50 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22d60 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22d70 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22d80 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22d90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22da0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22db0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
22dc0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
22dd0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
22de0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67  */.){.  int iArg
22df0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
22e00 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
22e10 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
22e20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22e30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22e40 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22e50 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
22e60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
22e70 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
22e80 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  , 0), " DB", 0);
22e90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22ea0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22eb0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
22ec0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22ed0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
22ee0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
22ef0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22f10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
22f20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53  NULL, SQLITE_LAS
22f30 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b  T_ERRNO, &iArg);
22f40 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20  .  if( rc ){ .  
22f50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22f60 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22f70 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a  ewIntObj(rc)); .
22f80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22f90 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28  RROR; .  }.  if(
22fa0 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20   iArg!=0 ) {.   
22fb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22fc0 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70  t(interp, "Unexp
22fd0 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65  ected non-zero e
22fe0 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20  rrno: ",.       
22ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
23000 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23010 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  bj(Tcl_NewIntObj
23020 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c  (iArg), 0), " ",
23030 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23040 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23050 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
23060 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
23070 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
23080 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
23090 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a   DB DBNAME SIZE.
230a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
230b0 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
230c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
230d0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
230e0 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
230f0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
23100 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47   of the SQLITE_G
23110 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
23120 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   and.** SQLITE_S
23130 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
23140 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69   verbs..*/.stati
23150 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
23160 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
23170 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23180 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23190 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
231a0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
231b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
231c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
231d0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
231e0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
231f0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23200 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23210 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23220 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23230 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23240 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23250 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23260 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
23270 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23290 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65  * New chunk size
232a0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
232b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232c0 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65        /* Db name
232d0 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
232e0 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69   etc.) */.  sqli
232f0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
23310 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
23320 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
23330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23340 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74      /* file_cont
23350 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64  rol() return cod
23360 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  e */..  if( objc
23370 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
23380 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
23390 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
233a0 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a   DBNAME SIZE");.
233b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
233c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
233d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
233e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
233f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23400 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74  ) .   || Tcl_Get
23410 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
23420 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69  p, objv[3], &nSi
23430 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75  ze).  ){.   retu
23440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23450 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
23460 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
23470 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d  ;.  if( zDb[0]==
23480 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c  '\0' ) zDb = NUL
23490 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  L;..  rc = sqlit
234a0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
234b0 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
234c0 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
234d0 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65  , (void *)&nSize
234e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
234f0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
23500 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23510 29 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f  )sqlite3TestErro
23520 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
23530 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
23540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23550 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
23560 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
23570 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
23580 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
23590 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a   DB DBNAME SIZE.
235a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
235b0 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
235c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
235d0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a  trol interface .
235e0 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46  ** with SQLITE_F
235f0 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a  CNTL_SIZE_HINT.*
23600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23610 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
23620 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  nt_test(.  Clien
23630 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23640 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
23650 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
23660 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
23670 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23680 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
23690 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
236a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
236b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
236c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
236d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
236e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
236f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
23700 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
23710 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
23720 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  ){.  Tcl_WideInt
23730 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
23740 20 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73       /* Hinted s
23750 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ize */.  char *z
23760 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
23770 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e           /* Db n
23780 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ame ("main", "te
23790 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73  mp" etc.) */.  s
237a0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237c0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
237d0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63         /* file_c
23800 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20  ontrol() return 
23810 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  code */..  if( o
23820 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
23830 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
23840 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
23850 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22  "DB DBNAME SIZE"
23860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
23870 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
23880 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
23890 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
238a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
238b0 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
238c0 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
238d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
238e0 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a  ], &nSize).  ){.
238f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23900 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
23910 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
23920 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  bjv[2]);.  if( z
23930 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44  Db[0]=='\0' ) zD
23940 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  b = NULL;..  rc 
23950 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
23960 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
23970 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
23980 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29  E_HINT, (void *)
23990 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  &nSize);.  if( r
239a0 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  c ){.    Tcl_Set
239b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
239c0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 54 65  char *)sqlite3Te
239d0 73 74 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  stErrorName(rc),
239e0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
239f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23a00 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
23a10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
23a20 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
23a30 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
23a40 78 79 5f 74 65 73 74 20 44 42 20 50 57 44 0a 2a  xy_test DB PWD.*
23a50 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
23a60 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
23a70 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23a80 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
23a90 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
23aa0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
23ab0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45  of the SQLITE_GE
23ac0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
23ad0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45  and.** SQLITE_SE
23ae0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20  T_LOCKPROXYFILE 
23af0 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  verbs..*/.static
23b00 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
23b10 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
23b20 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
23b30 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
23b40 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
23b50 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
23b60 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
23b70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
23b80 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
23b90 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
23ba0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
23bb0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23bd0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
23be0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
23bf0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
23c00 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
23c10 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
23c20 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20  lite3 *db;.  .  
23c30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
23c40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
23c50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
23c60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
23c70 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
23c90 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
23ca0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
23cb0 20 22 20 44 42 20 50 57 44 22 2c 20 30 29 3b 0a   " DB PWD", 0);.
23cc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23cd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23ce0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23cf0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23d00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23d10 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54  ) ){.   return T
23d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23d30 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
23d40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
23d50 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66  ING_STYLE).#  if
23d60 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
23d70 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  __).#    define 
23d80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23d90 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20  CKING_STYLE 1.# 
23da0 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e   else.#    defin
23db0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
23dc0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a  LOCKING_STYLE 0.
23dd0 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
23de0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
23df0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23e00 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
23e10 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68  LE__).  {.    ch
23e20 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a 20 20  ar *testPath;.  
23e30 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e    int rc;.    in
23e40 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73  t nPwd;.    cons
23e50 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20  t char *zPwd;.  
23e60 20 20 63 68 61 72 20 70 72 6f 78 79 50 61 74 68    char proxyPath
23e70 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20  [400];.    .    
23e80 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  zPwd = Tcl_GetSt
23e90 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
23ea0 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20  [2], &nPwd);.   
23eb0 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72 6f 78   if( sizeof(prox
23ec0 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30 20 29  yPath)<nPwd+20 )
23ed0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
23ee0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
23ef0 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22 2c 20   "PWD too big", 
23f00 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20  (void*)0);.     
23f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23f20 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70 72  R;.    }.    spr
23f30 69 6e 74 66 28 70 72 6f 78 79 50 61 74 68 2c 20  intf(proxyPath, 
23f40 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c  "%s/test.proxy",
23f50 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d   zPwd);.    rc =
23f60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23f70 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
23f80 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
23f90 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
23fa0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
23fb0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
23fc0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23fd0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23fe0 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65  (rc)); .      re
23ff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24000 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
24010 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24020 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24030 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
24040 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74  XYFILE, &testPat
24050 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  h);.    if( strn
24060 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65  cmp(proxyPath,te
24070 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20  stPath,11) ){.  
24080 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f  sult(interp, "Lo
240a0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69  ck proxy file di
240b0 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  d not match the 
240c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
240d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240e0 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73   "previously ass
240f0 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29  igned value", 0)
24100 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
24110 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
24120 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24130 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
24140 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
24150 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
24160 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
24170 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
24180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24190 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
241a0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45   NULL, SQLITE_SE
241b0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
241c0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
241d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
241e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
241f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
24200 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
24210 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24220 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
24230 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
24240 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
24250 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
24260 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
24270 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45  av_retry DB  NRE
24280 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a  TRY  DELAY.**.**
24290 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
242a0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
242b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
242c0 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
242d0 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
242e0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
242f0 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  Y opcode..*/.sta
24300 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
24310 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
24320 74 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  try(.  ClientDat
24330 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24340 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24350 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24360 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24370 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24380 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24390 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
243a0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
243b0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
243c0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
243d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
243e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
243f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24400 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24410 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24420 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24430 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b  int rc;.  int a[
24440 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  2];.  char z[100
24450 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
24460 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
24470 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24480 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24490 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
244a0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
244b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
244c0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e  v[0], 0), " DB N
244d0 52 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29  RETRY DELAY", 0)
244e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
244f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
24500 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24510 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24520 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24530 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
24540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24550 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
24560 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
24570 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29   objv[2], &a[0])
24580 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24590 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
245a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
245b0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61  erp, objv[3], &a
245c0 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [1]) ) return TC
245d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
245e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
245f0 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
24600 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
24610 32 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69  2_AV_RETRY, (voi
24620 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  d*)a);.  sqlite3
24630 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
24640 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25  (z), z, "%d %d %
24650 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b  d", rc, a[0], a[
24660 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
24670 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24680 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
24690 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
246a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
246b0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
246c0 5f 70 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20  _persist_wal DB 
246d0 50 45 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a  PERSIST-FLAG.**.
246e0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
246f0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
24700 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24710 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
24720 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
24730 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
24740 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
24750 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24760 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 28  rol_persist_wal(
24770 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24780 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24790 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
247a0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
247b0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
247c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
247d0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
247e0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
247f0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24800 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24820 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24830 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24840 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24850 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24860 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24870 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
24880 72 63 3b 0a 20 20 69 6e 74 20 62 50 65 72 73 69  rc;.  int bPersi
24890 73 74 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  st;.  char z[100
248a0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
248b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
248c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
248d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
248e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
248f0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24900 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24910 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46  v[0], 0), " DB F
24920 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LAG", 0);.    re
24930 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24940 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24950 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24960 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24970 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
24980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24990 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
249a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
249b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
249c0 2c 20 26 62 50 65 72 73 69 73 74 29 20 29 20 72  , &bPersist) ) r
249d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
249e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
249f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
24a00 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
24a10 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  NTL_PERSIST_WAL,
24a20 20 28 76 6f 69 64 2a 29 26 62 50 65 72 73 69 73   (void*)&bPersis
24a30 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  t);.  sqlite3_sn
24a40 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
24a50 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63  , z, "%d %d", rc
24a60 2c 20 62 50 65 72 73 69 73 74 29 3b 0a 20 20 54  , bPersist);.  T
24a70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24a80 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
24a90 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
24aa0 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
24ab0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24ac0 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
24ad0 66 65 5f 6f 76 65 72 77 72 69 74 65 20 44 42 20  fe_overwrite DB 
24ae0 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  PSOW-FLAG.**.** 
24af0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
24b00 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
24b10 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
24b20 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
24b30 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
24b40 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
24b50 57 52 49 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f  WRITE opcode..*/
24b60 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
24b70 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
24b80 66 65 5f 6f 76 65 72 77 72 69 74 65 28 0a 20 20  fe_overwrite(.  
24b90 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
24ba0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
24bb0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
24bc0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
24bd0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
24be0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
24bf0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
24c00 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
24c10 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
24c20 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
24c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24c40 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
24c50 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
24c60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
24c70 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
24c80 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
24c90 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
24ca0 0a 20 20 69 6e 74 20 62 3b 0a 20 20 63 68 61 72  .  int b;.  char
24cb0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
24cc0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
24cd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24ce0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
24cf0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24d00 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24d10 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24d20 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24d30 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a  " DB FLAG", 0);.
24d40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24d50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
24d60 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
24d70 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
24d80 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
24d90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
24da0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24db0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
24dc0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
24dd0 62 6a 76 5b 32 5d 2c 20 26 62 29 20 29 20 72 65  bjv[2], &b) ) re
24de0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
24e00 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e  ile_control(db,N
24e10 55 4c 4c 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ULL,SQLITE_FCNTL
24e20 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
24e30 52 49 54 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b  RITE,(void*)&b);
24e40 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
24e50 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
24e60 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
24e70 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
24e80 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
24e90 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
24ea0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
24eb0 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
24ec0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24ed0 76 66 73 6e 61 6d 65 20 44 42 20 3f 41 55 58 44  vfsname DB ?AUXD
24ee0 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  B?.**.** Return 
24ef0 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65  a string that de
24f00 73 63 72 69 62 65 73 20 74 68 65 20 73 74 61 63  scribes the stac
24f10 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73  k of VFSes..*/.s
24f20 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
24f30 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a  ontrol_vfsname(.
24f40 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24f50 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24f60 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24f70 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24f80 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24f90 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24fa0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24fb0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
24fc0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
24fd0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
24fe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24ff0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25000 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25010 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25020 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25030 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25040 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
25050 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
25060 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20   "main";.  char 
25070 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a  *zVfsName = 0;..
25080 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
25090 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
250a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
250b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
250c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
250d0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
250e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
250f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
25100 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20   " DB ?AUXDB?", 
25110 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
25120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25130 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
25140 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
25150 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
25160 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
25170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25180 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
25190 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20   ){.    zDbName 
251a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
251b0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
251c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
251d0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65  trol(db, zDbName
251e0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  , SQLITE_FCNTL_V
251f0 46 53 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a  FSNAME,(void*)&z
25200 56 66 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  VfsName);.  Tcl_
25210 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25220 65 72 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28  erp, zVfsName, (
25230 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69  char*)0);.  sqli
25240 74 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d  te3_free(zVfsNam
25250 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
25260 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
25270 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
25280 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
25290 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a  ame DB ?AUXDB?.*
252a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
252b0 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 20 74  ring that is a t
252c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
252d0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
252e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
252f0 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20 43 6c 69  pfilename(.  Cli
25300 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
25310 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
25320 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
25330 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
25340 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25350 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
25360 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
25370 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
25380 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
25390 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
253a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
253b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
253c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
253d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
253e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
253f0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
25400 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
25410 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69   *zDbName = "mai
25420 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 54 4e 61  n";.  char *zTNa
25430 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  me = 0;..  if( o
25440 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
25450 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
25460 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
25470 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
25480 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
25490 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
254a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
254b0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f  v[0], 0), " DB ?
254c0 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20  AUXDB?", 0);.   
254d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
254e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
254f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
25500 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
25510 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
25520 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
25530 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
25540 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
25550 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
25560 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
25570 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
25580 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
25590 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54  , zDbName, SQLIT
255a0 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
255b0 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 54  NAME, (void*)&zT
255c0 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70  Name);.  Tcl_App
255d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
255e0 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68 61 72 2a  , zTName, (char*
255f0 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  )0);.  sqlite3_f
25600 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 72  ree(zTName);.  r
25610 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
25620 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
25630 3a 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  :   sqlite3_vfs_
25640 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74  list.**.**   Ret
25650 75 72 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63  urn a tcl list c
25660 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
25670 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73  mes of all regis
25680 74 65 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a  tered vfs's..*/.
25690 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 6c  static int vfs_l
256a0 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ist(.  ClientDat
256b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
256c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
256d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
256e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
256f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25700 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25710 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25720 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25730 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25740 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25760 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25770 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25780 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25790 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
257a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
257b0 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  fs;.  Tcl_Obj *p
257c0 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
257d0 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ();.  if( objc!=
257e0 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
257f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
25800 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
25810 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25820 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
25830 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73  pVfs=sqlite3_vfs
25840 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20  _find(0); pVfs; 
25850 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74  pVfs=pVfs->pNext
25860 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ){.    Tcl_ListO
25870 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
25880 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
25890 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
258a0 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29  Vfs->zName, -1))
258b0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
258c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
258d0 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75 72 6e   pRet);.  return
258e0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
258f0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71  .** tclcmd:   sq
25900 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42 20 49  lite3_limit DB I
25910 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68  D VALUE.**.** Th
25920 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
25930 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
25940 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63 65 20  limit interface 
25950 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
25960 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
25970 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n of the same..*
25980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
25990 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e  t_limit(.  Clien
259a0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
259b0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
259c0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
259d0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
259e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
259f0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25a00 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25a10 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25a20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25a30 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25a50 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25a60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25a70 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25a80 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25a90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25aa0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  ;.  int rc;.  st
25ab0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
25ac0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
25ad0 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69  Name;.     int i
25ae0 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b  d;.  } aId[] = {
25af0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25b00 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20  IMIT_LENGTH",   
25b10 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25b20 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20  E_LIMIT_LENGTH  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
25b40 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25b50 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c  MIT_SQL_LENGTH",
25b60 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
25b70 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
25b80 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  H           },. 
25b90 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
25ba0 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20  IT_COLUMN",     
25bb0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
25bc0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20  LIMIT_COLUMN    
25bd0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
25be0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25bf0 54 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20  T_EXPR_DEPTH",  
25c00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
25c10 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20  IMIT_EXPR_DEPTH 
25c20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
25c30 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25c40 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
25c50 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ",     SQLITE_LI
25c60 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
25c70 45 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ECT      },.    
25c80 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
25c90 56 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20  VDBE_OP",       
25ca0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
25cb0 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20  IT_VDBE_OP      
25cc0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
25cd0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46   "SQLITE_LIMIT_F
25ce0 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20  UNCTION_ARG",   
25cf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
25d00 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20  T_FUNCTION_ARG  
25d10 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
25d20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  "SQLITE_LIMIT_AT
25d30 54 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20  TACHED",        
25d40 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
25d50 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20  _ATTACHED       
25d60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
25d70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
25d80 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
25d90 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ", SQLITE_LIMIT_
25da0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
25db0 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53  GTH  },.    { "S
25dc0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
25dd0 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20  ABLE_NUMBER",   
25de0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
25df0 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20  ARIABLE_NUMBER  
25e00 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25e10 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
25e20 45 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  ER_DEPTH",      
25e30 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
25e40 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20  IGGER_DEPTH     
25e50 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f     },.    .    /
25e60 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74  * Out of range t
25e70 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20  est cases */.   
25e80 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25e90 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20  _TOOSMALL",     
25ea0 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20         -1,      
25eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ec0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
25ed0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
25ee0 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20  TOOBIG",        
25ef0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
25f00 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
25f10 2b 31 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a  +1      },.  };.
25f20 20 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69    int i, id;.  i
25f30 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20  nt val;.  const 
25f40 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66  char *zId;..  if
25f50 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
25f60 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25f70 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
25f80 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
25f90 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25fa0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
25fb0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
25fc0 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55 45 22  , " DB ID VALUE"
25fd0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
25fe0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25ff0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
26000 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
26010 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
26020 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
26030 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49   TCL_ERROR;.  zI
26040 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
26050 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f  g(objv[2]);.  fo
26060 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
26070 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b  aId)/sizeof(aId[
26080 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
26090 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61  f( strcmp(zId, a
260a0 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  Id[i].zName)==0 
260b0 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49  ){.      id = aI
260c0 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62  d[i].id;.      b
260d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
260e0 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
260f0 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b  aId)/sizeof(aId[
26100 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  0]) ){.    Tcl_A
26110 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
26120 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d  rp, "unknown lim
26130 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c  it type: ", zId,
26140 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
26150 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
26170 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
26180 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
26190 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
261a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
261b0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62  sqlite3_limit(db
261c0 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63  , id, val);.  Tc
261d0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
261e0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
261f0 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  tObj(rc));.  ret
26200 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
26210 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26220 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  save_prng_state.
26230 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73  **.** Save the s
26240 74 61 74 65 20 6f 66 20 74 68 65 20 70 73 65 75  tate of the pseu
26250 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  do-random number
26260 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41   generator..** A
26270 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
26280 20 76 65 72 69 66 79 20 74 68 61 74 20 73 71 6c   verify that sql
26290 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
262a0 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65  l works even whe
262b0 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68  n.** called with
262c0 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65   an out-of-range
262d0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
262e0 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67  ic int save_prng
262f0 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
26300 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26310 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26320 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26330 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26340 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26350 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26360 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26370 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
26380 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26390 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
263a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
263b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
263c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
263d0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
263e0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
263f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  {.  int rc = sql
26400 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
26410 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72  l(9999);.  asser
26420 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63  t( rc==0 );.  rc
26430 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
26440 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61  control(-1);.  a
26450 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
26460 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
26470 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
26480 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
26490 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
264a0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
264b0 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e  md:  restore_prn
264c0 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69  g_state.*/.stati
264d0 63 20 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72  c int restore_pr
264e0 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
264f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
26500 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
26510 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
26520 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
26530 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
26540 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
26550 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
26560 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
26570 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
26580 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
26590 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
265a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
265b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
265c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
265d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
265e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
265f0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
26600 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
26610 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75  RESTORE);.  retu
26620 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
26630 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65  ** tclcmd:  rese
26640 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  t_prng_state.*/.
26650 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 65 74  static int reset
26660 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
26670 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26680 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26690 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
266a0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
266b0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
266c0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
266d0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
266e0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
266f0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26700 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26710 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26720 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
26730 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
26740 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26750 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26760 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26770 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
26780 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
26790 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74  NG_RESET);.  ret
267a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
267b0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63  *.** tclcmd:  pc
267c0 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74  ache_stats.*/.st
267d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63  atic int test_pc
267e0 61 63 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c  ache_stats(.  Cl
267f0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
26800 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
26810 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
26820 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
26830 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
26840 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
26850 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
26860 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
26870 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
26880 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
26890 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
268a0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
268b0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
268c0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
268d0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
268e0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e  */.){.  int nMin
268f0 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20  ;.  int nMax;.  
26900 69 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20  int nCurrent;.  
26910 69 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b  int nRecyclable;
26920 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
26930 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ;..  sqlite3Pcac
26940 68 65 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e  heStats(&nCurren
26950 74 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c  t, &nMax, &nMin,
26960 20 26 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a   &nRecyclable);.
26970 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  .  pRet = Tcl_Ne
26980 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69  wObj();.  Tcl_Li
26990 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
269a0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
269b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
269c0 6a 28 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29  j("current", -1)
269d0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
269e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
269f0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
26a00 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65  NewIntObj(nCurre
26a10 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  nt));.  Tcl_List
26a20 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26a30 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
26a40 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
26a50 22 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "max", -1));.  T
26a60 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26a70 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26a80 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
26a90 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63  Obj(nMax));.  Tc
26aa0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
26ab0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
26ac0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
26ad0 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29  ngObj("min", -1)
26ae0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
26af0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
26b00 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
26b10 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29  NewIntObj(nMin))
26b20 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
26b30 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26b40 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26b50 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63  ewStringObj("rec
26b60 79 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a  yclable", -1));.
26b70 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26b80 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
26b90 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
26ba0 49 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62  IntObj(nRecyclab
26bb0 6c 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  le));..  Tcl_Set
26bc0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
26bd0 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
26be0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
26bf0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26c00 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
26c10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
26c20 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  t_unlock_notify_
26c30 63 62 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20  cb(void **aArg, 
26c40 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74  int nArg){.  int
26c50 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b   ii;.  for(ii=0;
26c60 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b   ii<nArg; ii++){
26c70 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28  .    Tcl_EvalEx(
26c80 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41  (Tcl_Interp *)aA
26c90 72 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f  rg[ii], "unlock_
26ca0 6e 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c  notify", -1, TCL
26cb0 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
26cc0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
26cd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
26ce0 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f  OCK_NOTIFY */../
26cf0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
26d00 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
26d10 69 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66  ify db.*/.#ifdef
26d20 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
26d30 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61  NLOCK_NOTIFY.sta
26d40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c  tic int test_unl
26d50 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c  ock_notify(.  Cl
26d60 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
26d70 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
26d80 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
26d90 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
26da0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
26db0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
26dc0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
26dd0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
26de0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26df0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
26e00 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
26e10 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
26e20 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
26e30 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
26e40 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
26e50 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
26e60 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
26e70 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
26e80 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
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 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c  rc = sqlite3_unl
26f10 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74  ock_notify(db, t
26f20 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
26f30 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e  y_cb, (void *)in
26f40 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74  terp);.  Tcl_Set
26f50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
26f60 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
26f70 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
26f80 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
26f90 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
26fa0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
26fb0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
26fc0 70 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a  point db ?NAME?.
26fd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
26fe0 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
26ff0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
27000 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
27010 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
27020 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
27030 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
27040 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
27050 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
27060 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
27070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27080 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
27090 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
270a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
270b0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
270c0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
270d0 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20  har *zDb = 0;.  
270e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
270f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
27100 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
27110 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
27120 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
27130 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e   1, objv, "DB ?N
27140 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  AME?");.    retu
27150 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27160 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
27170 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
27180 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27190 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
271a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
271b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
271c0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
271d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
271e0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  (objv[2]);.  }. 
271f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61   rc = sqlite3_wa
27200 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  l_checkpoint(db,
27210 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74   zDb);.  Tcl_Set
27220 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
27230 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
27240 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
27250 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
27260 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
27270 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
27280 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
27290 32 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f  2 db MODE ?NAME?
272a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
272b0 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20 77 61  and calls the wa
272c0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
272d0 29 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  ) function with 
272e0 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
272f0 20 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74 20 28   mode argument (
27300 70 61 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72  passive, full or
27310 20 72 65 73 74 61 72 74 29 2e 20 49 66 20 70 72   restart). If pr
27320 65 73 65 6e 74 2c 20 74 68 65 20 64 61 74 61 62  esent, the datab
27330 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45  ase name.** NAME
27340 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68   is passed as th
27350 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
27360 74 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f  t to wal_checkpo
27370 69 6e 74 5f 76 32 28 29 2e 20 49 66 20 69 74 20  int_v2(). If it 
27380 74 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75  the.** NAME argu
27390 6d 65 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73  ment is not pres
273a0 65 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  ent, a NULL poin
273b0 74 65 72 20 69 73 20 70 61 73 73 65 64 20 69 6e  ter is passed in
273c0 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
273d0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
273e0 32 28 29 20 72 65 74 75 72 6e 73 20 61 6e 79 20  2() returns any 
273f0 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e  value other than
27400 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a   SQLITE_BUSY or.
27410 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68  ** SQLITE_OK, th
27420 65 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  en this command 
27430 72 65 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f  returns TCL_ERRO
27440 52 2e 20 54 68 65 20 54 63 6c 20 72 65 73 75 6c  R. The Tcl resul
27450 74 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74  t is set.** to t
27460 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
27470 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
27480 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2e  qlite3_errmsg().
27490 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
274a0 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72  , this command r
274b0 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66  eturns a list of
274c0 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 73 2e   three integers.
274d0 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
274e0 65 72 0a 2a 2a 20 69 73 20 31 20 69 66 20 53 51  er.** is 1 if SQ
274f0 4c 49 54 45 5f 42 55 53 59 20 77 61 73 20 72 65  LITE_BUSY was re
27500 74 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68  turned, or 0 oth
27510 65 72 77 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c  erwise. The foll
27520 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74 65 67 65  owing two intege
27530 72 73 0a 2a 2a 20 61 72 65 20 74 68 65 20 76 61  rs.** are the va
27540 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 76 69  lues returned vi
27550 61 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  a the output par
27560 61 6d 61 74 65 72 73 20 62 79 20 77 61 6c 5f 63  amaters by wal_c
27570 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d  heckpoint_v2() -
27580 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
27590 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20  f frames in the 
275a0 6c 6f 67 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  log and the numb
275b0 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
275c0 74 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20  the log.** that 
275d0 68 61 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70  have been checkp
275e0 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ointed..*/.stati
275f0 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63  c int test_wal_c
27600 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20  heckpoint_v2(.  
27610 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27620 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
27630 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27640 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27650 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27660 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27670 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27680 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
276a0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
276b0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
276c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
276d0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
276e0 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
276f0 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  zDb = 0;.  sqlit
27700 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
27710 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a  ;..  int eMode;.
27720 20 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35    int nLog = -55
27730 35 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d  5;.  int nCkpt =
27740 20 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a   -555;.  Tcl_Obj
27750 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74   *pRet;..  const
27760 20 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20   char * aMode[] 
27770 3d 20 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22  = { "passive", "
27780 66 75 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22  full", "restart"
27790 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72 74 28  , 0 };.  assert(
277a0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
277b0 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
277c0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
277d0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
277e0 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
277f0 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
27800 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
27810 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
27820 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
27830 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
27840 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
27850 62 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e  bjv, "DB MODE ?N
27860 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  AME?");.    retu
27870 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27880 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34  }..  if( objc==4
27890 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63   ){.    zDb = Tc
278a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
278b0 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  [3]);.  }.  if( 
278c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
278d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
278e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
278f0 29 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49  ).   || Tcl_GetI
27900 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
27910 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f  rp, objv[2], aMo
27920 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26  de, "mode", 0, &
27930 65 4d 6f 64 65 29 20 0a 20 20 29 7b 0a 20 20 20  eMode) .  ){.   
27940 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27950 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
27960 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
27970 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62  point_v2(db, zDb
27980 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20  , eMode, &nLog, 
27990 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72  &nCkpt);.  if( r
279a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
279b0 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
279c0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
279d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
279e0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
279f0 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c  msg(db), TCL_VOL
27a00 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75  ATILE);.    retu
27a10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27a20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  }..  pRet = Tcl_
27a30 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
27a40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27a50 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27a60 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
27a70 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  (rc==SQLITE_BUSY
27a80 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  ?1:0));.  Tcl_Li
27a90 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27aa0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
27ab0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
27ac0 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Log));.  Tcl_Lis
27ad0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
27ae0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
27af0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43  Tcl_NewIntObj(nC
27b00 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74  kpt));.  Tcl_Set
27b10 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
27b20 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
27b30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
27b40 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73  .** tclcmd:  tes
27b50 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53  t_sqlite3_log ?S
27b60 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63  CRIPT?.*/.static
27b70 20 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62   struct LogCallb
27b80 61 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ack {.  Tcl_Inte
27b90 72 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54  rp *pInterp;.  T
27ba0 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20  cl_Obj *pObj;.} 
27bb0 6c 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30  logcallback = {0
27bc0 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  , 0};.static voi
27bd0 64 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76  d xLogcallback(v
27be0 6f 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74  oid *unused, int
27bf0 20 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67   err, char *zMsg
27c00 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e  ){.  Tcl_Obj *pN
27c10 65 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ew = Tcl_Duplica
27c20 74 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63  teObj(logcallbac
27c30 6b 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49  k.pObj);.  Tcl_I
27c40 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77  ncrRefCount(pNew
27c50 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27c60 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20  AppendElement(. 
27c70 20 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63       0, pNew, Tc
27c80 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
27c90 71 6c 69 74 65 33 54 65 73 74 45 72 72 6f 72 4e  qlite3TestErrorN
27ca0 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
27cb0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27cc0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
27cd0 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
27ce0 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
27cf0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
27d00 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
27d10 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
27d20 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
27d30 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
27d40 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
27d50 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
27d60 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
27d70 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
27d80 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27d90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
27da0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27db0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27dc0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27dd0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27de0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27e00 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27e10 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27e20 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27e30 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27e40 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
27e50 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
27e60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27e70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
27e80 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
27e90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27ea0 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
27eb0 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
27ec0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
27ed0 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27ee0 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27ef0 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
27f00 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
27f10 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
27f20 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
27f30 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
27f40 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
27f50 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
27f60 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
27f70 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20   = objv[1];.    
27f80 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
27f90 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27fa0 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27fb0 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e  ack.pInterp = in
27fc0 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  terp;.    sqlite
27fd0 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
27fe0 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67  CONFIG_LOG, xLog
27ff0 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20  callback, 0);.  
28000 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
28010 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
28020 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d  tcl_objproc COMM
28030 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a  ANDNAME ARGS....
28040 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20  **.** Run a TCL 
28050 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74  command using it
28060 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  s objProc interf
28070 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65  ace.  Throw an e
28080 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  rror if.** the c
28090 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
280a0 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
280b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
280c0 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76  unAsObjProc(.  v
280d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
280e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
280f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
28100 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
28110 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
28120 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
28130 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Info;.  if( objc
28140 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
28150 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28160 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d  p, 1, objv, "COM
28170 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
28180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c  ;.  }.  if( !Tcl
281a0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
281b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
281c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
281d0 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
281e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
281f0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
28200 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
28210 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
28220 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28230 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
28240 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28250 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ROR;.  }.  if( c
28260 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d  mdInfo.objProc==
28270 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
28280 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28290 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  , "command has n
282a0 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20  o objProc: ",.  
282b0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
282c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
282d0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
282e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
282f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
28300 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63  mdInfo.objProc(c
28310 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
28320 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
28330 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d  jc-1, objv+1);.}
28340 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28350 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
28360 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65  .** WARNING: The
28370 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
28380 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69  ion, printExplai
28390 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20  nQueryPlan() is 
283a0 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79  an exact.** copy
283b0 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65   of example code
283c0 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71   from eqp.in (eq
283d0 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73  p.html). If this
283e0 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65   code is modifie
283f0 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64  d,.** then the d
28400 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70  ocumentation cop
28410 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  y needs to be mo
28420 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a  dified as well..
28430 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  */./*.** Argumen
28440 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65  t pStmt is a pre
28450 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
28460 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
28470 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61  on compiles.** a
28480 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
28490 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  PLAN command to 
284a0 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72  report on the pr
284b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
284c0 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20  ,.** and prints 
284d0 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74  the report to st
284e0 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74  dout using print
284f0 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e  f()..*/.int prin
28500 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
28510 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  n(sqlite3_stmt *
28520 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  pStmt){.  const 
28530 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
28540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
28550 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72  ut SQL */.  char
28560 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *zExplain;     
28570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
28580 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20  QL with EXPLAIN 
28590 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65  QUERY PLAN prepe
285a0 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nded */.  sqlite
285b0 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
285c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
285d0 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55  piled EXPLAIN QU
285e0 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
285f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28620 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
28630 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a  3_prepare_v2() *
28640 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  /..  zSql = sqli
28650 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  te3_sql(pStmt);.
28660 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
28670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28680 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e  ROR;..  zExplain
28690 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
286a0 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
286b0 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c  Y PLAN %s", zSql
286c0 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69  );.  if( zExplai
286d0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
286e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
286f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
28700 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64  are_v2(sqlite3_d
28710 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c  b_handle(pStmt),
28720 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26   zExplain, -1, &
28730 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
28740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
28750 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63  plain);.  if( rc
28760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28770 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
28780 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
28790 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
287a0 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74  lain) ){.    int
287b0 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c   iSelectid = sql
287c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
287d0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
287e0 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73    int iOrder = s
287f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
28800 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
28810 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20      int iFrom = 
28820 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
28830 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b  nt(pExplain, 2);
28840 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28850 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73  *zDetail = (cons
28860 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
28870 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
28880 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20  plain, 3);..    
28890 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64  printf("%d %d %d
288a0 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69   %s\n", iSelecti
288b0 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d  d, iOrder, iFrom
288c0 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a  , zDetail);.  }.
288d0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
288e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
288f0 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ain);.}..static 
28900 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  int test_print_e
28910 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  qp(.  void * cli
28920 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28930 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28940 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28950 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28960 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
28970 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
28980 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
28990 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
289a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
289b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
289c0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
289d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
289e0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
289f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
28a00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
28a10 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
28a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28a30 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45  R;.  rc = printE
28a40 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
28a50 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69  pStmt);.  /* Thi
28a60 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57  s is needed on W
28a70 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61  indows so that a
28a80 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67   test case using
28a90 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
28aa0 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20  tion can open a 
28ab0 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65  read pipe and ge
28ac0 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a  t the output of.
28ad0 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69    ** printExplai
28ae0 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d  nQueryPlan() imm
28af0 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
28b00 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
28b10 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
28b20 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
28b30 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
28b40 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
28b50 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
28b60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
28b70 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
28b80 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
28b90 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e  ntrol VERB ARGS.
28ba0 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
28bb0 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
28bc0 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
28bd0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28be0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
28bf0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28c00 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28c10 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56  [].){.  struct V
28c20 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  erb {.    const 
28c30 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
28c40 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72   int i;.  } aVer
28c50 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  b[] = {.    { "S
28c60 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
28c70 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c  OCALTIME_FAULT",
28c80 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
28c90 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
28ca0 20 7d 2c 20 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   }, .  };.  int 
28cb0 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c  iVerb;.  int iFl
28cc0 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ag;.  int rc;.. 
28cd0 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
28ce0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28cf0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28d00 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e  bjv, "VERB ARGS.
28d10 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
28d20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28d30 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49  .  rc = Tcl_GetI
28d40 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63  ndexFromObjStruc
28d50 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c  t(.      interp,
28d60 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c   objv[1], aVerb,
28d70 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d   sizeof(aVerb[0]
28d80 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69  ), "VERB", 0, &i
28d90 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20  Verb.  );.  if( 
28da0 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
28db0 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67  urn rc;..  iFlag
28dc0 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e   = aVerb[iVerb].
28dd0 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c  i;.  switch( iFl
28de0 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ag ){.    case S
28df0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
28e00 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20  OCALTIME_FAULT: 
28e10 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b  {.      int val;
28e20 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
28e30 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
28e40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28e50 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
28e60 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20  "ONOFF");.      
28e70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28e80 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
28e90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
28ea0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
28eb0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
28ec0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
28ed0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
28ee0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
28ef0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
28f00 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
28f10 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62  T, val);.      b
28f20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
28f30 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
28f40 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
28f50 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28f60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
28f70 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  N./*.** Informat
28f80 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d 20  ion passed from 
28f90 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20  the main thread 
28fa0 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 73  into the windows
28fb0 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20   file locker.** 
28fc0 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
28fd0 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  d..*/.struct win
28fe0 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20  32FileLocker {. 
28ff0 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20   char *evName;  
29000 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29010 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20  event to signal 
29020 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20 2a  thread startup *
29030 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
29040 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
29050 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
29060 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
29070 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20 20  int delay1;     
29080 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66      /* Delay bef
29090 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ore locking */. 
290a0 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20 20   int delay2;    
290b0 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
290c0 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a  fore unlocking *
290d0 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20  /.  int ok;     
290e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
290f0 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20  hed ok */.  int 
29100 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  err;            
29110 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
29120 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b  ror occurs */.};
29130 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51  .#endif...#if SQ
29140 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63  LITE_OS_WIN.#inc
29150 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e  lude <process.h>
29160 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67  ./*.** The backg
29170 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61  round thread tha
29180 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b  t does file lock
29190 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
291a0 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  oid win32_file_l
291b0 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70  ocker(void *pApp
291c0 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20  Data){.  struct 
291d0 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
291e0 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e  *p = (struct win
291f0 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41  32FileLocker*)pA
29200 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d  ppData;.  if( p-
29210 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48  >evName ){.    H
29220 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45  ANDLE ev = OpenE
29230 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46  vent(EVENT_MODIF
29240 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20  Y_STATE, FALSE, 
29250 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20  p->evName);.    
29260 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20  if ( ev ){.     
29270 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20   SetEvent(ev);. 
29280 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65       CloseHandle
29290 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (ev);.    }.  }.
292a0 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20    if( p->delay1 
292b0 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79  ) Sleep(p->delay
292c0 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69  1);.  if( LockFi
292d0 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31  le(p->h, 0, 0, 1
292e0 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a  00000000, 0) ){.
292f0 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c      Sleep(p->del
29300 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  ay2);.    Unlock
29310 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c  File(p->h, 0, 0,
29320 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a   100000000, 0);.
29330 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20      p->ok = 1;. 
29340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65   }else{.    p->e
29350 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c  rr = 1;.  }.  Cl
29360 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b  oseHandle(p->h);
29370 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70  .  p->h = 0;.  p
29380 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20  ->delay1 = 0;.  
29390 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d  p->delay2 = 0;.}
293a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
293b0 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a  ITE_OS_WIN./*.**
293c0 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32        lock_win32
293d0 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44  _file FILENAME D
293e0 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a  ELAY1 DELAY2.**.
293f0 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  ** Get an exclus
29400 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f  ive manditory lo
29410 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44  ck on file for D
29420 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY2 millisecon
29430 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41  ds..** Wait DELA
29440 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  Y1 milliseconds 
29450 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
29460 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
29470 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66  atic int win32_f
29480 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64  ile_lock(.  void
29490 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
294a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
294b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
294c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
294d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
294e0 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 33  atic struct win3
294f0 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20  2FileLocker x = 
29500 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  { "win32_file_lo
29510 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ck", 0, 0, 0, 0,
29520 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
29530 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
29540 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
29550 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30  .  int retry = 0
29560 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20  ;.  HANDLE ev;. 
29570 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a   DWORD wResult;.
29580 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
29590 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
295a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
295b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
295c0 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44  bjv, "FILENAME D
295d0 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a  ELAY1 DELAY2");.
295e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
295f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29600 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  objc==1 ){.    s
29610 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29620 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
29630 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25 64  uf, "%d %d %d %d
29640 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
29650 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c             x.ok,
29660 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31   x.err, x.delay1
29670 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29  , x.delay2, x.h)
29680 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
29690 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
296a0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
296b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
296c0 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  K;.  }.  while( 
296d0 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30 20  x.h && retry<30 
296e0 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a  ){.    retry++;.
296f0 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a      Sleep(100);.
29700 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b    }.  if( x.h ){
29710 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
29720 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
29730 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  usy", (char*)0);
29740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29750 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
29760 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
29770 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
29780 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29  2], &x.delay1) )
29790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
297a0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
297b0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
297c0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64  p, objv[3], &x.d
297d0 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e 20  elay2) ) return 
297e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69  TCL_ERROR;.  zFi
297f0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
29800 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
29810 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46  .  x.h = CreateF
29820 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47  ile(zFilename, G
29830 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45  ENERIC_READ|GENE
29840 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  RIC_WRITE,.     
29850 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48           FILE_SH
29860 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48  ARE_READ|FILE_SH
29870 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50  ARE_WRITE, 0, OP
29880 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20  EN_ALWAYS,.     
29890 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
298a0 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20  TRIBUTE_NORMAL, 
298b0 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29  0);.  if( !x.h )
298c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
298d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
298e0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
298f0 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  : ", zFilename, 
29900 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29910 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29920 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61  .  }.  ev = Crea
29930 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52  teEvent(NULL, TR
29940 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e  UE, FALSE, x.evN
29950 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76  ame);.  if ( !ev
29960 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
29970 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
29980 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
29990 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61  event: ", x.evNa
299a0 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
299b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
299c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69  ROR;.  }.  _begi
299d0 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69  nthread(win32_fi
299e0 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76  le_locker, 0, (v
299f0 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65  oid*)&x);.  Slee
29a00 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52  p(0);.  if ( (wR
29a10 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53  esult = WaitForS
29a20 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20  ingleObject(ev, 
29a30 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42  10000))!=WAIT_OB
29a40 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71  JECT_0 ){.    sq
29a50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
29a60 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
29a70 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73 75  f, "0x%x", wResu
29a80 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lt);.    Tcl_App
29a90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
29aa0 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20  , "wait failed: 
29ab0 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  ", zBuf, (char*)
29ac0 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  0);.    CloseHan
29ad0 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74  dle(ev);.    ret
29ae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29af0 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65   }.  CloseHandle
29b00 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (ev);.  return T
29b10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
29b20 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74  ../*.**      opt
29b30 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
29b40 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e  l DB OPT BOOLEAN
29b50 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
29b60 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f   disable query o
29b70 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69  ptimizations usi
29b80 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ng the sqlite3_t
29b90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a  est_control().**
29ba0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73   interface.  Dis
29bb0 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
29bc0 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61  is false and ena
29bd0 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
29be0 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69  s true..** OPT i
29bf0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
29c00 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  e optimization t
29c10 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a  o be disabled..*
29c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74  /.static int opt
29c30 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
29c40 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
29c50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
29c60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
29c70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
29c80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29c90 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ].){.  int i;.  
29ca0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
29cb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b  onst char *zOpt;
29cc0 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20  .  int onoff;.  
29cd0 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20  int mask = 0;.  
29ce0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
29cf0 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
29d00 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a  char *zOptName;.
29d10 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20      int mask;.  
29d20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20  } aOpt[] = {.   
29d30 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20   { "all",       
29d40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 6c         SQLITE_Al
29d50 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c 0a  lOpts        },.
29d60 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61      { "query-fla
29d70 74 74 65 6e 65 72 22 2c 20 20 53 51 4c 49 54 45  ttener",  SQLITE
29d80 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20  _QueryFlattener 
29d90 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e  },.    { "column
29da0 2d 63 61 63 68 65 22 2c 20 20 20 20 20 53 51 4c  -cache",     SQL
29db0 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20  ITE_ColumnCache 
29dc0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f     },.    { "gro
29dd0 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20 20  upby-order",    
29de0 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
29df0 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  der   },.    { "
29e00 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73  factor-constants
29e10 22 2c 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72  ", SQLITE_Factor
29e20 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20  OutConst },.    
29e30 7b 20 22 72 65 61 6c 2d 61 73 2d 69 6e 74 22 2c  { "real-as-int",
29e40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 64 78        SQLITE_Idx
29e50 52 65 61 6c 41 73 49 6e 74 20 20 20 7d 2c 0a 20  RealAsInt   },. 
29e60 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f     { "distinct-o
29e70 70 74 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  pt",     SQLITE_
29e80 44 69 73 74 69 6e 63 74 4f 70 74 20 20 20 20 7d  DistinctOpt    }
29e90 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65 72 2d 69  ,.    { "cover-i
29ea0 64 78 2d 73 63 61 6e 22 2c 20 20 20 53 51 4c 49  dx-scan",   SQLI
29eb0 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20  TE_CoverIdxScan 
29ec0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65    },.    { "orde
29ed0 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 53  r-by-idx-join",S
29ee0 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
29ef0 4a 6f 69 6e 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20  Join },.  };..  
29f00 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
29f10 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
29f20 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
29f30 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f  bjv, "DB OPT BOO
29f40 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
29f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29f60 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
29f70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
29f80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
29f90 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
29fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29fb0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
29fc0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
29fd0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66  , objv[3], &onof
29fe0 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  f) ) return TCL_
29ff0 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20  ERROR;.  zOpt = 
2a000 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2a010 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[2]);.  for(i=
2a020 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
2a030 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
2a040 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
2a050 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f   strcmp(zOpt, aO
2a060 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d  pt[i].zOptName)=
2a070 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  =0 ){.      mask
2a080 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b   = aOpt[i].mask;
2a090 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2a0a0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e    }.  }.  if( on
2a0b0 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61  off ) mask = ~ma
2a0c0 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a  sk;.  if( i>=siz
2a0d0 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66  eof(aOpt)/sizeof
2a0e0 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20  (aOpt[0]) ){.   
2a0f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a100 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
2a110 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  wn optimization 
2a120 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  - should be one 
2a130 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20  of:",.          
2a140 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
2a150 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *)0);.    for(i=
2a160 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
2a170 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
2a180 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  ); i++){.      T
2a190 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2a1a0 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70  interp, " ", aOp
2a1b0 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3b 0a  t[i].zOptName);.
2a1c0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2a1d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a1e0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2a1f0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2a200 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2a210 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b  IONS, db, mask);
2a220 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
2a240 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
2a250 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
2a260 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
2a270 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
2a280 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a290 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
2a2a0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
2a2b0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2a2c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e  int sqlite3_foun
2a2d0 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  d_count;.  exter
2a2e0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  n int sqlite3_in
2a2f0 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20  terrupt_count;. 
2a300 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2a310 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
2a320 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2a330 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  t sqlite3_sort_c
2a340 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2a350 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2a360 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c  nt_time;.#if SQL
2a370 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
2a380 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2a390 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2a3a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2a3b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2a3c0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
2a3d0 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72  ;.#endif.  exter
2a3e0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61  n int sqlite3_ma
2a3f0 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78  x_blobsize;.  ex
2a400 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2a410 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65  BtreeSharedCache
2a420 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20  Report(void*,.  
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a450 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65          Tcl_Inte
2a460 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a  rp*,int,Tcl_Obj*
2a470 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69  CONST*);.  stati
2a480 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
2a490 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2a4a0 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78    Tcl_CmdProc *x
2a4b0 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  Proc;.  } aCmd[]
2a4c0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f   = {.     { "db_
2a4d0 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  enter",         
2a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a4f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e  l_CmdProc*)db_en
2a500 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
2a510 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f    },.     { "db_
2a520 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20  leave",         
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2a540 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65  l_CmdProc*)db_le
2a550 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ave             
2a560 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a570 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
2a580 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
2a590 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a5a0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20  e3_mprintf_int  
2a5b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a5c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
2a5d0 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  64",         (Tc
2a5e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a5f0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
2a600 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a610 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
2a620 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  g",          (Tc
2a630 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a640 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20  e3_mprintf_long 
2a650 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a660 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
2a670 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
2a680 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a690 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20  e3_mprintf_str  
2a6a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a6b0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
2a6c0 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  r",          (Tc
2a6d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a6e0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
2a6f0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2a700 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
2a710 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63  only",       (Tc
2a720 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a730 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
2a740 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  ly},.     { "sql
2a750 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
2a760 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63  ble",        (Tc
2a770 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a780 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
2a790 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
2a7a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
2a7b0 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63  led",        (Tc
2a7c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2a7d0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
2a7e0 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  d },.     { "sql
2a7f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
2a800 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f  double",   (Tcl_
2a810 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2a820 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
2a830 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  le},.     { "sql
2a840 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74  ite3_mprintf_z_t
2a850 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
2a860 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2a870 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20  mprintf_z       
2a880 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2a890 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65  te3_mprintf_n_te
2a8a0 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
2a8b0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
2a8c0 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20  printf_n        
2a8d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2a8e0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22  e3_snprintf_int"
2a8f0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
2a900 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e  CmdProc*)test_sn
2a910 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d  printf_int     }
2a920 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2a930 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
2a940 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43  wid",     (Tcl_C
2a950 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73  mdProc*)test_las
2a960 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c  t_rowid       },
2a970 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2a980 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20  _exec_printf",  
2a990 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2a9a0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
2a9b0 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a  _printf      },.
2a9c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2a9d0 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20  exec_hex",      
2a9e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2a9f0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
2aa00 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  hex         },. 
2aa10 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2aa20 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  xec",           
2aa30 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2aa40 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20  roc*)test_exec  
2aa50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2aa60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2aa70 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20  ec_nr",         
2aa80 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2aa90 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72  oc*)test_exec_nr
2aaa0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
2aab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2aac0 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20  _GET_TABLE.     
2aad0 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  { "sqlite3_get_t
2aae0 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20  able_printf",   
2aaf0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2ab00 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f  )test_get_table_
2ab10 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66  printf },.#endif
2ab20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ab30 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  _close",        
2ab40 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2ab50 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
2ab60 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a  st_close     },.
2ab70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ab80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
2ab90 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2aba0 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
2abb0 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
2abc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2abd0 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
2abe0 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2abf0 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
2ac00 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
2ac10 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
2ac20 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
2ac30 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
2ac40 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
2ac50 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
2ac60 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
2ac70 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2ac80 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2ac90 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
2aca0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2acb0 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
2acc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2acd0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2ace0 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
2acf0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2ad00 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2ad30 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
2ad40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2ad50 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad70 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2ad80 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
2ad90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2ada0 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
2adb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2adc0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2add0 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
2ade0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2adf0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
2ae00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ae10 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2ae20 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
2ae30 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2ae40 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
2ae50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2ae60 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2ae70 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
2ae80 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2ae90 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
2aea0 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54  tion",        (T
2aeb0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
2aec0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20  te_function     
2aed0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2aee0 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
2aef0 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63  tion",       (Tc
2af00 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
2af10 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20  e_collation     
2af20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2af30 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
2af40 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  it",        (Tcl
2af50 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75  _CmdProc*)get_au
2af60 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  tocommit        
2af70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2af80 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20  e3_stack_used", 
2af90 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2afa0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74  CmdProc*)test_st
2afb0 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d  ack_used       }
2afc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2afd0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c  3_busy_timeout",
2afe0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2aff0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73  mdProc*)test_bus
2b000 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c  y_timeout     },
2b010 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22  .     { "printf"
2b020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b030 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2b040 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e  dProc*)test_prin
2b050 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf           },.
2b060 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49       { "sqlite3I
2b070 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  oTrace",        
2b080 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2b090 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
2b0a0 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  e         },.  }
2b0b0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
2b0c0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
2b0d0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
2b0e0 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
2b0f0 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
2b100 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
2b110 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
2b120 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
2b130 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
2b140 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
2b150 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
2b160 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2b170 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2b180 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
2b190 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
2b1a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2b1b0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
2b1c0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
2b1d0 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
2b1e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2b1f0 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
2b200 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2b210 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
2b220 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2b230 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
2b240 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2b250 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
2b260 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b270 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
2b280 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2b290 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
2b2a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b2b0 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
2b2c0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2b2d0 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
2b2e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b2f0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
2b300 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2b310 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
2b320 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b330 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
2b340 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2b350 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
2b360 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b370 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2b380 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
2b390 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2b3a0 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
2b3b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2b3c0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
2b3d0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
2b3e0 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
2b3f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b400 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2b410 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
2b420 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2b430 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
2b440 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
2b450 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
2b460 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
2b470 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
2b480 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
2b490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b4a0 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
2b4b0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2b4c0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
2b4d0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
2b4e0 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
2b4f0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2b500 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
2b510 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20  nded_errcode",  
2b520 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63      test_ex_errc
2b530 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ode    ,0 },.   
2b540 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
2b550 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
2b560 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
2b570 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2b580 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2b590 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
2b5a0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
2b5b0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
2b5c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2b5d0 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
2b5e0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2b5f0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2b600 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b610 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
2b620 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2b630 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
2b640 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b650 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20  _open_v2",      
2b660 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
2b670 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d  en_v2       ,0 }
2b680 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b690 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
2b6a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2b6b0 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
2b6c0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2b6d0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2b6f0 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
2b700 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2b710 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2b730 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
2b740 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2b750 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2b760 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
2b770 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
2b780 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2b790 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
2b7a0 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
2b7b0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
2b7c0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
2b7d0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2b7e0 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
2b7f0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
2b800 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
2b810 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
2b820 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
2b830 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
2b840 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2b850 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
2b860 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
2b870 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
2b880 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
2b890 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
2b8a0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2b8b0 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
2b8c0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2b8d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
2b8e0 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
2b8f0 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
2b900 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
2b910 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
2b920 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
2b930 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
2b940 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
2b950 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2b960 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
2b970 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
2b980 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
2b990 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b9a0 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
2b9b0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
2b9c0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
2b9d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b9e0 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
2b9f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
2ba00 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
2ba10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ba20 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
2ba30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
2ba40 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
2ba50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ba60 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
2ba70 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
2ba80 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30  stmt_readonly ,0
2ba90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2baa0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20  te3_stmt_busy", 
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2bac0 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c  _stmt_busy     ,
2bad0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65  0 },.     { "use
2bae0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c  s_stmt_journal",
2baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
2bb00 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c  s_stmt_journal ,
2bb10 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
2bb20 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
2bb30 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65  mory",        te
2bb40 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
2bb50 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  y,     0},.     
2bb60 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  { "sqlite3_db_re
2bb70 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
2bb80 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61     test_db_relea
2bb90 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a  se_memory,  0},.
2bba0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2bbb0 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  db_filename",   
2bbc0 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
2bbd0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  filename,       
2bbe0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2bbf0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
2bc00 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2bc10 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20  t_db_readonly,  
2bc20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
2bc30 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   "sqlite3_soft_h
2bc40 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  eap_limit",     
2bc50 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70    test_soft_heap
2bc60 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20  _limit,    0},. 
2bc70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
2bc80 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20  hread_cleanup", 
2bc90 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65         test_thre
2bca0 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20  ad_cleanup,     
2bcb0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2bcc0 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
2bcd0 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  nts",       test
2bce0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
2bcf0 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b  ,    0},..     {
2bd00 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65   "sqlite3_load_e
2bd10 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20  xtension",      
2bd20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65    test_load_exte
2bd30 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20  nsion,     0},. 
2bd40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2bd50 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
2bd60 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62  sion", test_enab
2bd70 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  le_load,        
2bd80 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2bd90 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
2bda0 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74  ult_codes", test
2bdb0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
2bdc0 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20  _codes, 0},.    
2bdd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69   { "sqlite3_limi
2bde0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2bdf0 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20      test_limit, 
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be10 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76  0},..     { "sav
2be20 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
2be40 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  e_prng_state,   
2be50 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
2be60 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
2be70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ",            re
2be80 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
2be90 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  , 0 },.     { "r
2bea0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22  eset_prng_state"
2beb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  ,              r
2bec0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c  eset_prng_state,
2bed0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2bee0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2bef0 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20  trol",          
2bf00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2bf10 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c  trol,0},.#if SQL
2bf20 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20  ITE_OS_WIN.     
2bf30 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69  { "lock_win32_fi
2bf40 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
2bf50 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f     win32_file_lo
2bf60 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64  ck,    0 },.#end
2bf70 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f  if.     { "tcl_o
2bf80 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20  bjproc",        
2bf90 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41 73             runAs
2bfa0 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30  ObjProc,       0
2bfb0 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c   },..     /* sql
2bfc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20  ite3_column_*() 
2bfd0 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  API */.     { "s
2bfe0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
2bff0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74  unt",          t
2c000 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
2c010 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2c020 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
2c030 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
2c040 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20  test_data_count 
2c050 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2c060 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2c070 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
2c080 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
2c090 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  e   ,0 },.     {
2c0a0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2c0b0 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
2c0c0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c    test_column_bl
2c0d0 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  ob   ,0 },.     
2c0e0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2c0f0 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  n_double",      
2c100 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64     test_column_d
2c110 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20  ouble ,0 },.    
2c120 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2c130 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  mn_int64",      
2c140 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
2c150 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20  int64  ,0 },.   
2c160 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2c170 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73  umn_text",   tes
2c180 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
2c190 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2c1a0 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20  umn_text },.    
2c1b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2c1c0 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74  mn_name",   test
2c1d0 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f  _stmt_utf8,  (vo
2c1e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2c1f0 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20  mn_name },.     
2c200 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2c210 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f  n_int",    test_
2c220 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
2c230 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2c240 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b  n_int  },.     {
2c250 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2c260 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73  _bytes",  test_s
2c270 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64  tmt_int,   (void
2c280 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2c290 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66  _bytes},.#ifndef
2c2a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
2c2b0 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71  LTYPE.     { "sq
2c2c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
2c2d0 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74  ltype",test_stmt
2c2e0 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
2c2f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
2c300 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69  type},.#endif.#i
2c310 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2c320 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
2c330 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  TA.{ "sqlite3_co
2c340 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
2c350 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
2c360 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
2c370 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
2c380 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
2c390 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
2c3a0 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
2c3b0 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
2c3c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
2c3d0 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
2c3e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
2c3f0 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  n_name",test_stm
2c400 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2c410 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2c420 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69  gin_name},.#endi
2c430 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
2c440 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
2c450 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2c460 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65  umn_bytes16", te
2c470 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f  st_stmt_int, (vo
2c480 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2c490 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20  mn_bytes16 },.  
2c4a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2c4b0 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74  lumn_text16",  t
2c4c0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
2c4d0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2c4e0 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20  olumn_text16},. 
2c4f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2c500 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
2c510 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2c520 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2c530 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a  column_name16},.
2c540 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67       { "add_alig
2c550 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
2c560 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67  tions", add_alig
2c570 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
2c580 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c  tions, 0      },
2c590 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c5a0 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
2c5b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2c5c0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
2c5d0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36  ,test_stmt_utf16
2c5e0 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
2c5f0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
2c600 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  6},.#endif.#ifde
2c610 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c620 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
2c630 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
2c640 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
2c650 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",.  test_stmt_u
2c660 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
2c670 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
2c680 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  base_name16},.{"
2c690 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2c6a0 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65  able_name16", te
2c6b0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
2c6c0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2c6d0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
2c6e0 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
2c6f0 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
2c700 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
2c710 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
2c720 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2c730 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64  in_name16},.#end
2c740 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  if.#endif.     {
2c750 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
2c760 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20  _collation_v2", 
2c770 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  test_create_coll
2c780 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20  ation_v2, 0 },. 
2c790 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2c7a0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20  lobal_recover", 
2c7b0 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f      test_global_
2c7c0 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a  recover, 0   },.
2c7d0 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f       { "working_
2c7e0 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20  64bit_int",     
2c7f0 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62       working_64b
2c800 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c  it_int,   0   },
2c810 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c  .     { "vfs_unl
2c820 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ink_test",      
2c830 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b        vfs_unlink
2c840 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d  _test,     0   }
2c850 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e  ,.     { "vfs_in
2c860 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20  itfail_test",   
2c870 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66         vfs_initf
2c880 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  ail_test,   0   
2c890 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75  },.     { "vfs_u
2c8a0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20  nregister_all", 
2c8b0 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65          vfs_unre
2c8c0 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20  gister_all,  0  
2c8d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2c8e0 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  reregister_all",
2c8f0 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65 72           vfs_rer
2c900 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
2c910 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
2c920 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c  e_control_test",
2c930 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63            file_c
2c940 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30  ontrol_test,   0
2c950 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2c960 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
2c970 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65  rrno_test", file
2c980 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
2c990 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  no_test,  0   },
2c9a0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2c9b0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
2c9c0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
2c9d0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
2c9e0 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
2c9f0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2ca00 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22  _chunksize_test"
2ca10 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63  , file_control_c
2ca20 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20  hunksize_test,  
2ca30 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2ca40 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
2ca50 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66 69 6c  hint_test",  fil
2ca60 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
2ca70 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  nt_test,   0   }
2ca80 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2ca90 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
2caa0 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e  retry", file_con
2cab0 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
2cac0 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  try,  0   },.   
2cad0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2cae0 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c 20  l_persist_wal", 
2caf0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
2cb00 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20 20  persist_wal,    
2cb10 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2cb20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
2cb30 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
2cb40 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  ",file_control_p
2cb50 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
2cb60 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66  te,0},.     { "f
2cb70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
2cb80 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69 6c  ame",        fil
2cb90 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
2cba0 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20 7d  e,         0   }
2cbb0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2cbc0 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
2cbd0 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e  ame",   file_con
2cbe0 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
2cbf0 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  e,    0   },.   
2cc00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73    { "sqlite3_vfs
2cc10 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20  _list",         
2cc20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20    vfs_list,     
2cc30 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  0   },.     { "s
2cc40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2cc50 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  nction_v2", test
2cc60 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2cc70 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20  _v2, 0 },..     
2cc80 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f  /* Functions fro
2cc90 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65  m os.h */.#ifnde
2cca0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
2ccb0 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f  F16.     { "add_
2ccc0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20  test_collate",  
2ccd0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61        test_colla
2cce0 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  te, 0           
2ccf0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
2cd00 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
2cd10 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  ded", test_colla
2cd20 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20  te_needed, 0    
2cd30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f   },.     { "add_
2cd40 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
2cd50 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74        test_funct
2cd60 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20  ion, 0          
2cd70 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2cd80 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
2cd90 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73  errstr",     tes
2cda0 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20  t_errstr, 0     
2cdb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2cdc0 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  { "tcl_variable_
2cdd0 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c  type",       tcl
2cde0 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20  _variable_type, 
2cdf0 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64  0       },.#ifnd
2ce00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
2ce10 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
2ce20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
2ce30 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22  le_shared_cache"
2ce40 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68  , test_enable_sh
2ce50 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  ared, 0  },.    
2ce60 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72   { "sqlite3_shar
2ce70 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22  ed_cache_report"
2ce80 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  , sqlite3BtreeSh
2ce90 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c  aredCacheReport,
2cea0 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20   0},.#endif.    
2ceb0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76   { "sqlite3_libv
2cec0 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20  ersion_number", 
2ced0 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
2cee0 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69  number, 0  },.#i
2cef0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
2cf00 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
2cf10 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  TA.     { "sqlit
2cf20 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
2cf30 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f  metadata", test_
2cf40 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
2cf50 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e  adata, 0  },.#en
2cf60 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
2cf70 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2cf80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cf90 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 20 74  _blob_read",   t
2cfa0 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30  est_blob_read, 0
2cfb0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2cfc0 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22  ite3_blob_write"
2cfd0 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69  ,  test_blob_wri
2cfe0 74 65 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  te, 0  },.     {
2cff0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
2d000 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f  eopen", test_blo
2d010 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a  b_reopen, 0  },.
2d020 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2d030 62 6c 6f 62 5f 62 79 74 65 73 22 2c 20 20 74 65  blob_bytes",  te
2d040 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 2c 20 30  st_blob_bytes, 0
2d050 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2d060 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 22  ite3_blob_close"
2d070 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f  ,  test_blob_clo
2d080 73 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  se, 0  },.#endif
2d090 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f  .     { "pcache_
2d0a0 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74 65  stats",       te
2d0b0 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c  st_pcache_stats,
2d0c0 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
2d0d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
2d0e0 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b  CK_NOTIFY.     {
2d0f0 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b   "sqlite3_unlock
2d100 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75  _notify", test_u
2d110 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20  nlock_notify, 0 
2d120 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2d130 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  { "sqlite3_wal_c
2d140 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65  heckpoint",   te
2d150 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
2d160 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t, 0  },.     { 
2d170 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  "sqlite3_wal_che
2d180 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74  ckpoint_v2",test
2d190 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2d1a0 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  v2, 0  },.     {
2d1b0 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c   "test_sqlite3_l
2d1c0 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  og",         tes
2d1d0 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30  t_sqlite3_log, 0
2d1e0 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
2d1f0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2d200 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f 65  .     { "print_e
2d210 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61  xplain_query_pla
2d220 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  n", test_print_e
2d230 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  qp, 0  },.#endif
2d240 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d250 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20  _test_control", 
2d260 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  test_test_contro
2d270 6c 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  l },.  };.  stat
2d280 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73  ic int bitmask_s
2d290 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74  ize = sizeof(Bit
2d2a0 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69  mask)*8;.  int i
2d2b0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2d2c0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
2d2d0 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
2d2e0 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
2d2f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2d300 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
2d310 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2d320 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
2d330 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2d340 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
2d350 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2d360 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
2d370 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
2d380 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2d390 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
2d3a0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2d3b0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
2d3c0 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
2d3d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2d3e0 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  IN.  extern int 
2d3f0 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
2d400 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
2d410 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
2d420 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2d430 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
2d440 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2d450 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
2d460 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c  n int sqlite3Wal
2d470 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
2d480 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2d490 0a 20 20 65 78 74 65 72 6e 20 63 68 61 72 20 73  .  extern char s
2d4a0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2d4b0 6e 5b 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 68  n[];.  static ch
2d4c0 61 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d  ar *query_plan =
2d4d0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2d4e0 6c 61 6e 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  lan;.#ifdef SQLI
2d4f0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
2d500 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2d510 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
2d520 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e  parentheses;.#en
2d530 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  dif.#endif..  fo
2d540 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
2d550 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d  aCmd)/sizeof(aCm
2d560 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
2d570 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
2d580 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b  nd(interp, aCmd[
2d590 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69  i].zName, aCmd[i
2d5a0 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
2d5b0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
2d5c0 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
2d5d0 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
2d5e0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
2d5f0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
2d600 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
2d610 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  Cmd[i].zName, . 
2d620 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69         aObjCmd[i
2d630 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64  ].xProc, aObjCmd
2d640 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20  [i].clientData, 
2d650 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
2d660 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d670 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
2d680 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
2d690 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72  r*)&sqlite3_sear
2d6a0 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ch_count, TCL_LI
2d6b0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2d6c0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2d6d0 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75  sqlite_found_cou
2d6e0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
2d6f0 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e  r*)&sqlite3_foun
2d700 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  d_count, TCL_LIN
2d710 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2d720 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2d730 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74  qlite_sort_count
2d740 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2d750 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  )&sqlite3_sort_c
2d760 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2d770 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2d780 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2d790 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
2d7a0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2d7b0 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  )&sqlite3_max_bl
2d7c0 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  obsize, TCL_LINK
2d7d0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2d7e0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2d7f0 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22  lite_like_count"
2d800 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2d810 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f  &sqlite3_like_co
2d820 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
2d830 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2d840 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2d850 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  e_interrupt_coun
2d860 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
2d870 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  *)&sqlite3_inter
2d880 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  rupt_count, TCL_
2d890 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2d8a0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d8b0 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69   "sqlite_open_fi
2d8c0 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  le_count", .    
2d8d0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2d8e0 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
2d8f0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2d900 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2d910 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2d920 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a  current_time", .
2d930 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2d940 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2d950 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  me, TCL_LINK_INT
2d960 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
2d970 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
2d980 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2d990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2d9a0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c  KING_STYLE.  Tcl
2d9b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2d9c0 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f   "sqlite_hostid_
2d9d0 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28 63 68  num", .      (ch
2d9e0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f 73  ar*)&sqlite3_hos
2d9f0 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e  tid_num, TCL_LIN
2da00 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
2da10 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2da20 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66  erp, "sqlite3_xf
2da30 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20  eropt_count",.  
2da40 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2da50 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
2da60 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2da70 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2da80 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
2da90 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
2daa0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
2dab0 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
2dac0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20  r_readdb_count, 
2dad0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2dae0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2daf0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
2db00 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
2db10 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
2db20 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
2db30 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54  writedb_count, T
2db40 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2db50 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2db60 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
2db70 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22  er_writej_count"
2db80 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2db90 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2dba0 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  itej_count, TCL_
2dbb0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
2dbc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
2dbd0 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
2dbe0 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c  ar(interp, "unal
2dbf0 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
2dc00 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68  nter",.      (ch
2dc10 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73  ar*)&unaligned_s
2dc20 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54  tring_counter, T
2dc30 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2dc40 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
2dc50 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
2dc60 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2dc70 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73  erp, "sqlite_las
2dc80 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69  t_needed_collati
2dc90 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  on",.      (char
2dca0 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  *)&pzNeededColla
2dcb0 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tion, TCL_LINK_S
2dcc0 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  TRING|TCL_LINK_R
2dcd0 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  EAD_ONLY);.#endi
2dce0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  f.#if SQLITE_OS_
2dcf0 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  WIN.  Tcl_LinkVa
2dd00 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2dd10 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20 20  e_os_type",.    
2dd20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2dd30 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c  3_os_type, TCL_L
2dd40 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
2dd50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2dd60 45 53 54 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  EST.  Tcl_LinkVa
2dd70 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2dd80 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20  e_query_plan",. 
2dd90 20 20 20 20 20 28 63 68 61 72 2a 29 26 71 75 65       (char*)&que
2dda0 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e  ry_plan, TCL_LIN
2ddb0 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e  K_STRING|TCL_LIN
2ddc0 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65  K_READ_ONLY);.#e
2ddd0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
2dde0 54 45 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c  TE_DEBUG.  Tcl_L
2ddf0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2de00 73 71 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61  sqlite_where_tra
2de10 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ce",.      (char
2de20 2a 29 26 73 71 6c 69 74 65 33 57 68 65 72 65 54  *)&sqlite3WhereT
2de30 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2de40 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2de50 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2de60 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20  te_os_trace",.  
2de70 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2de80 74 65 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f  te3OSTrace, TCL_
2de90 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
2dea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2deb0 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  AL.  Tcl_LinkVar
2dec0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2ded0 5f 77 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20  _wal_trace",.   
2dee0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2def0 65 33 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f  e3WalTrace, TCL_
2df00 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
2df10 66 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  f.#endif.#ifndef
2df20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
2df30 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  KIO.  Tcl_LinkVa
2df40 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2df50 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  e_opentemp_count
2df60 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2df70 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d  &sqlite3_opentem
2df80 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  p_count, TCL_LIN
2df90 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
2dfa0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2dfb0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
2dfc0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c  tic_bind_value",
2dfd0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2dfe0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
2dff0 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e  d_value, TCL_LIN
2e000 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
2e010 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2e020 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
2e030 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20  bind_nbyte",.   
2e040 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2e050 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
2e060 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  yte, TCL_LINK_IN
2e070 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
2e080 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2e090 65 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  e_temp_directory
2e0a0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2e0b0 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  &sqlite3_temp_di
2e0c0 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
2e0d0 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
2e0e0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2e0f0 20 22 73 71 6c 69 74 65 5f 64 61 74 61 5f 64 69   "sqlite_data_di
2e100 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20  rectory",.      
2e110 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2e120 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
2e130 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29  TCL_LINK_STRING)
2e140 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2e150 69 6e 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b  interp, "bitmask
2e160 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63  _size",.      (c
2e170 68 61 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69  har*)&bitmask_si
2e180 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ze, TCL_LINK_INT
2e190 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f  |TCL_LINK_READ_O
2e1a0 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  NLY);.  Tcl_Link
2e1b0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2e1c0 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c  ite_sync_count",
2e1d0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2e1e0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
2e1f0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2e200 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2e210 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2e220 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c  fullsync_count",
2e230 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2e240 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
2e250 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2e260 49 4e 54 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  INT);.#if define
2e270 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2e280 46 54 53 33 29 20 26 26 20 64 65 66 69 6e 65 64  FTS3) && defined
2e290 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
2e2a0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2e2b0 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 74 73 33  rp, "sqlite_fts3
2e2c0 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
2e2d0 73 65 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ses",.      (cha
2e2e0 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 74 73 33  r*)&sqlite3_fts3
2e2f0 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65  _enable_parenthe
2e300 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ses, TCL_LINK_IN
2e310 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  T);.#endif.  ret
2e320 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a        urn TCL_OK;.}.