/ Hex Artifact Content
Login

Artifact 363a5089230a92cf0aaa7a2945da7f2bf3b0a8d3:


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 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0a00: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0a10: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
0a20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a30: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a40: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a50: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a60: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a70: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a90: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0aa0: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0ab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0ac0: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0ad0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ae0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0b00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
0b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
0b20: 2a 20 44 65 63 6f 64 65 20 61 20 57 69 6e 33 32  * Decode a Win32
0b30: 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63 74 2e 0a   HANDLE object..
0b40: 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e 33 32 48  */.int getWin32H
0b50: 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  andle(Tcl_Interp
0b60: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
0b70: 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48 41 4e 44  char *zA, LPHAND
0b80: 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20 20 2a 70  LE phFile){.  *p
0b90: 68 46 69 6c 65 20 3d 20 28 48 41 4e 44 4c 45 29  hFile = (HANDLE)
0ba0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bb0: 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75  oPtr(zA);.  retu
0bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
0bd0: 64 69 66 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73  dif..extern cons
0be0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
0bf0: 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 23 64 65  rrName(int);.#de
0c00: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
0c10: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 0a   sqlite3ErrName.
0c20: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0c30: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20  n sqlite3_stmt* 
0c40: 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a  into an sqlite3*
0c50: 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20  .  This depends 
0c60: 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74  on the.** fact t
0c70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a  hat the sqlite3*
0c80: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
0c90: 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20  eld in the Vdbe 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64  structure..*/.#d
0cb0: 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58  efine StmtToDb(X
0cc0: 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  )   sqlite3_db_h
0cd0: 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20  andle(X)../*.** 
0ce0: 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76  Check a return v
0cf0: 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  alue to make sur
0d00: 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74 68  e it agrees with
0d10: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
0d20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
0d30: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
0d40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0d50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0d60: 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  rp, sqlite3 *db,
0d70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20   int rc){.  if( 
0d80: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0d90: 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d 53  fe()==0 && rc!=S
0da0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20  QLITE_MISUSE && 
0db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc!=SQLITE_OK.  
0dc0: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
0dd0: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
0de0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
0df0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
0e00: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e10: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
0e20: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
0e30: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
0e40: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
0e50: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
0e60: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
0e70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
0e80: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
0e90: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
0ea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
0ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ed0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
0ee0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0ef0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0f00: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0f10: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
0f20: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
0f30: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0f40: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
0f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f60: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
0f70: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
0f80: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
0f90: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
0fa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
0fb0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
0fc0: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
0fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0fe0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74  .** Generate a t
0ff0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
1000: 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  on of a pointer 
1010: 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65  that can be unde
1020: 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65  rstood.** by the
1030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e   getDbPointer an
1040: 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72  d getVmPointer r
1050: 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a  outines above..*
1060: 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d  *.** The problem
1070: 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63   is, on some mac
1080: 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20  hines (Solaris) 
1090: 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e  if you do a prin
10a0: 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20  tf with.** "%p" 
10b0: 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20  you cannot turn 
10c0: 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20  around and do a 
10d0: 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73  scanf with the s
10e0: 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20  ame "%p" and.** 
10f0: 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72  get your pointer
1100: 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65   back.  You have
1110: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30   to prepend a "0
1120: 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c  x" before it wil
1130: 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61  l.** work.  Or a
1140: 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20  t least that is 
1150: 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64  what is reported
1160: 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42   to me (drh).  B
1170: 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76  ut this.** behav
1180: 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20  ior varies from 
1190: 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69  machine to machi
11a0: 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f  ne.  The solutio
11b0: 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a  n used her is.**
11c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72   to test the str
11d0: 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20  ing right after 
11e0: 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  it is generated 
11f0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
1200: 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f   be.** understoo
1210: 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20  d by scanf, and 
1220: 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70  if not, try prep
1230: 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74  ending an "0x" t
1240: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74  o see if.** that
1250: 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68   helps.  If noth
1260: 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74  ing works, a fat
1270: 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  al error is gene
1280: 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rated..*/.int sq
1290: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
14c0: 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63  he I/O tracing c
14d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  allback..*/.#if 
14e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
1500: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1510: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74  ABLE_IOTRACE).st
1520: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
1530: 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61  ce_file = 0;.sta
1540: 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63  tic void io_trac
1550: 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  e_callback(const
1560: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1570: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1580: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
15a0: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f  fprintf(iotrace_
15b0: 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  file, zFormat, a
15c0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
15d0: 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61  ;.  fflush(iotra
15e0: 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ce_file);.}.#end
15f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
1600: 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e    io_trace FILEN
1610: 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49  AME.**.** Turn I
1620: 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  /O tracing on or
1630: 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41   off.  If FILENA
1640: 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70  ME is not an emp
1650: 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f  ty string,.** I/
1660: 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73  O tracing begins
1670: 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45   going into FILE
1680: 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d  NAME. If FILENAM
1690: 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a  E is an empty.**
16a0: 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61   string, I/O tra
16b0: 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
16c0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
16d0: 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28  t test_io_trace(
16e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1700: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1710: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1720: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1730: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1740: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1760: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1770: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1790: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  ent */.){.#if !d
17b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17c0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
17d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17e0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66  LE_IOTRACE).  if
17f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1810: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1820: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1830: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1840: 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49 4c  .          " FIL
1850: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1870: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f  OR;.  }.  if( io
1880: 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20  trace_file ){.  
1890: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18a0: 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f  le!=stdout && io
18b0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65  trace_file!=stde
18c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  rr ){.      fclo
18d0: 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29  se(iotrace_file)
18e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72  ;.    }.    iotr
18f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  ace_file = 0;.  
1900: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
1910: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1920: 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20  argv[1][0] ){.  
1930: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1940: 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d  v[1],"stdout")==
1950: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
1960: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74  ce_file = stdout
1970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1980: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1990: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
19a0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
19b0: 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20  e = stderr;.    
19c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
19d0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65  race_file = fope
19e0: 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b  n(argv[1], "w");
19f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a00: 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74  e3IoTrace = io_t
1a10: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61 6e  .** Usage:  clan
1a50: 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
1a60: 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ss .**.** Return
1a70: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
1a80: 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69 6c  ogram was compil
1a90: 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20 77  ed using clang w
1aa0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73 61  ith the .** -fsa
1ab0: 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20 73  nitize=address s
1ac0: 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f 6d  witch on the com
1ad0: 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73 65  mand line. False
1ae0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1af0: 74 61 74 69 63 20 69 6e 74 20 63 6c 61 6e 67 5f  tatic int clang_
1b00: 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
1b10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1b20: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1b30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b70: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1bd0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1be0: 20 72 65 73 20 3d 20 30 3b 0a 23 69 66 20 64 65   res = 0;.#if de
1bf0: 66 69 6e 65 64 28 5f 5f 68 61 73 5f 66 65 61 74  fined(__has_feat
1c00: 75 72 65 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f  ure).# if __has_
1c10: 66 65 61 74 75 72 65 28 61 64 64 72 65 73 73 5f  feature(address_
1c20: 73 61 6e 69 74 69 7a 65 72 29 0a 20 20 72 65 73  sanitizer).  res
1c30: 20 3d 20 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65   = 1;.# endif.#e
1c40: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
1c70: 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
1c80: 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a  L_OK;.}.  ./*.**
1c90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ca0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
1cb0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
1cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
1cd0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
1ce0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
1cf0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
1d00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
1d10: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
1d20: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
1d30: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
1d40: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
1d50: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
1d60: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
1d70: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
1d80: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1da0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
1db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
1e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
1e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1ea0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1eb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
1ec0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1ed0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
1ee0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
1f40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
1f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
1fb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
1fc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
1fe0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1ff0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2000: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2010: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2020: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2030: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2040: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2050: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2060: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2070: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2090: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
20a0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
20b0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
20c0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
20d0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
20e0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
20f0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2110: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2120: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2150: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2160: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
2170: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
2180: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2190: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
21a0: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
21b0: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
21c0: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
21d0: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
21e0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
21f0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
2200: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
2210: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
2220: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2230: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
2240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
22d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
22e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
22f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2310: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2320: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
2330: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
2340: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2350: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
2360: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
2370: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2380: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23d0: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
23e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2400: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2410: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2420: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
2440: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
2450: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
2460: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
2470: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
2480: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
2490: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
24a0: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
24b0: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
24c0: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
24d0: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
24e0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
24f0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
2500: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
2520: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
2530: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
2540: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
2550: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2560: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2570: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2580: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2590: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
25a0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25b0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
25c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25d0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
25e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25f0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2600: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2610: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2620: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2630: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2640: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2650: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2660: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2670: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2680: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
26c0: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
26d0: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
26e0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
26f0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
2700: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
2710: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
2720: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
2730: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2740: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2750: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2760: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2770: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2780: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2790: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
27f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2810: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2830: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2840: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2850: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2860: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2880: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2890: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
28b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
28c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
28d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
28e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
28f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
2900: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
2910: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
2920: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2930: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2940: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2950: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2960: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2990: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
29b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
29c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
29d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
29e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2a00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a10: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a20: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a30: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2a40: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2ab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ac0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ae0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2af0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
2b00: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
2b10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2b20: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
2b30: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2b40: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
2b50: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
2b60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2b80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2b90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ba0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2bb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2bc0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2be0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2bf0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2c10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2c20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2c30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2c40: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2c50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2c60: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c70: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
2c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2c90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2cd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ce0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2cf0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
2d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2d20: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2d40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d50: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2d60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2d80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2d90: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
2da0: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
2db0: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
2dc0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
2dd0: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
2de0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
2df0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2e00: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
2e10: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
2e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e30: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
2e40: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2e50: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
2e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2e80: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2e90: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2eb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2ec0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
2ed0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2ee0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
2ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2f00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
2f10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
2f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2f30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2f40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2f50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2f60: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2f70: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2f80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2f90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
2fd0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
2fe0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
2ff0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3000: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3010: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3030: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
3040: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
3050: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
3060: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
3070: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3090: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
30a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
30b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
30f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3100: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3110: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3120: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3140: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3150: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
3160: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
3170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3180: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3190: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
31a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
31b0: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
31c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31f0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3200: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3220: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
3230: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
3240: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
3250: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3260: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3270: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
32a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
32b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
32c0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
32d0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
32e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
32f0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3300: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
3310: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
3320: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3330: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3340: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3350: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3380: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3390: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
33a0: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
33b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
33c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3400: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3430: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3440: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3450: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3460: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3470: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3490: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
34a0: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
34b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
34c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
34d0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
34e0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
34f0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3500: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3520: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3530: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3560: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3570: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3580: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3590: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
35a0: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
35b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
35c0: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
35d0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
35f0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
3600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
36a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
36b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
36c0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
36d0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
36e0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
36f0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
3700: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
3710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
3720: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
3730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3740: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
3750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3770: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
3780: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
3790: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
37a0: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
37c0: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
37d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
37e0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
37f0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
3800: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
3810: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
3820: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
3830: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
3840: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
3850: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
3860: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
3870: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
3880: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
3890: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
38a0: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
38b0: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
38c0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
38d0: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
38e0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
38f0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
3900: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
3910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
3920: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
39a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
39b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
39c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
39d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
39e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
39f0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
3a00: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
3a10: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
3a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3a30: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
3a40: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
3a50: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
3a60: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
3a70: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
3a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
3a90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
3aa0: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
3ab0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3ac0: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
3ad0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
3ae0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
3af0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
3b00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
3b10: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
3b20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3b40: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
3b50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3b60: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b70: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
3b80: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
3b90: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
3ba0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
3bb0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
3bc0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3bd0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3be0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
3bf0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
3c00: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
3c10: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
3c20: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
3c30: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
3c40: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
3c50: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
3c60: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
3c70: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
3c80: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
3c90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3ca0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3cb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3cc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3cd0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3cf0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3d20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3d40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3d50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3d60: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
3d70: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3d80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
3d90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
3da0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
3db0: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
3dc0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
3dd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
3de0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
3df0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
3e00: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
3e10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
3e20: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
3e30: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
3e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3e50: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
3e60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
3e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3eb0: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3ec0: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f40: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
3f50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3f60: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
3f70: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3f90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
3fa0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
3fb0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3fd0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3fe0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3ff0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4000: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4010: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4020: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4040: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
4050: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
4060: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
4070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4080: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
4090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
40a0: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
40b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
40c0: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
40d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
40e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
40f0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
4100: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
4110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4120: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4130: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4150: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
4170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4180: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
4190: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
41a0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
41c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
41d0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
41e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
41f0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4200: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4210: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4220: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4230: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4240: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4260: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
4270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4280: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
4290: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
42a0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
42b0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
42d0: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
42e0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
42f0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4300: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4310: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4320: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4340: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4350: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4360: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4370: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4380: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
43a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
43b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
43c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
43d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
43e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
43f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4400: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4410: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4430: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4440: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4450: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4460: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4480: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4490: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
44a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
44b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
44c0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
44d0: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
44e0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
44f0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
4500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4510: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
4520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4540: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
4550: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
4560: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4570: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
4580: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4590: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
45a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
45b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
45c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
45d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4610: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4640: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
4650: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4660: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
4670: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4680: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
4690: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
46a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
46b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
46c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
46d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
46e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
46f0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4720: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4730: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4740: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
4760: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
4770: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
4780: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
4790: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
47a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
47b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
47c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
47d0: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
47f0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4800: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
4810: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4820: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4830: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4840: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4850: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4860: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4870: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
48d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
48e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48f0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4a20: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4a30: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4a50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4a60: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4a70: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4a80: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4a90: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4ab0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
4b90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
4ba0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
4bb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4bc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4bd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4be0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4bf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4c00: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
4c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4c20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4c30: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
4c40: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4c50: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
4c70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
4c80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
4c90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
4ca0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
4cb0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
4cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4ce0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
4cf0: 5f 76 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  _v2 DB.**.** Clo
4d00: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4d10: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4d20: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4d30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4d40: 73 74 5f 63 6c 6f 73 65 5f 76 32 28 0a 20 20 76  st_close_v2(.  v
4d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4e10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4e20: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
4e30: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
4e40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4e50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4e60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4e70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4e80: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4e90: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4ec0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4ed0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ef0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
4f00: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
4f10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
4f30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
4f40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
4f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4f80: 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e  x_coalesce() fun
4f90: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
4fa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4fb0: 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  ent non-NULL arg
4fc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4fd0: 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46   void t1_ifnullF
4fe0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ff0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5000: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5010: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5020: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
5030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5050: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5060: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5070: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
5080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5090: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
50b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
50c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
50d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
50e0: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a  _text(argv[i]),.
50f0: 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c            n, SQL
5100: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5130: 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66  These are test f
5140: 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78  unctions.    hex
5150: 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  8() interprets i
5160: 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  ts argument as.*
5170: 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72  * UTF8 and retur
5180: 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e  ns a hex encodin
5190: 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e  g.  hex16le() in
51a0: 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67  terprets its arg
51b0: 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31  ument.** as UTF1
51c0: 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  6le and returns 
51d0: 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a  a hex encoding..
51e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51f0: 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ex8Func(sqlite3_
5200: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
5210: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5220: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
5230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5240: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
5250: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
5270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5280: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5290: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32  i<sizeof(zBuf)/2
52a0: 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 2 && z[i]; i+
52b0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
52c0: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
52d0: 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a  x", z[i]&0xff);.
52e0: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20    }.  zBuf[i*2] 
52f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5300: 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63  esult_text(p, (c
5310: 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53  har*)zBuf, -1, S
5320: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5330: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
5340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
5350: 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46  atic void hex16F
5360: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5370: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
5380: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
5390: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
53a0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
53b0: 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  int *z;.  int i;
53c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
53d0: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
53e0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
53f0: 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[0]);.  for(i=
5400: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66  0; i<sizeof(zBuf
5410: 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b  )/4 - 4 && z[i];
5420: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e   i++){.    sprin
5430: 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22  tf(&zBuf[i*4], "
5440: 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66  %04x", z[i]&0xff
5450: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a  );.  }.  zBuf[i*
5460: 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  4] = 0;.  sqlite
5470: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c  3_result_text(p,
5480: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31   (char*)zBuf, -1
5490: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
54a0: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  NT);.}.#endif../
54b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
54c0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
54d0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
54e0: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
54f0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
5500: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
5510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
5520: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
5530: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
5550: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
5560: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
5570: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
5580: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
5590: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
55b0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
55c0: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
55d0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
55e0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
55f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
5600: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
5610: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
5620: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
5630: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
5640: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
5650: 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
5660: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  _free(p->z);.   
5690: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
56a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
56b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
56c0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
56d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
56e0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
56f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
5700: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
5710: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
5720: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
5730: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
5740: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
5750: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
5760: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
5770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
5780: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
5790: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
57a0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
57b0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
57c0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
57d0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
57e0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
57f0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
5800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5810: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5820: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
5830: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
5840: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
5850: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
5860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
5870: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
5880: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
5890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
58b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
58c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75  sqlite_exec() fu
58d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
58e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20  nction takes.** 
58f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5900: 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  t and attempts t
5910: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61  o execute that a
5920: 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63  rgument as SQL c
5930: 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ode..** This is 
5940: 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75  illegal and shou
5950: 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54  ld set the SQLIT
5960: 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e  E_MISUSE flag on
5970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
5980: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37  *.** 2004-Jan-07
5990: 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67  :  We have chang
59a0: 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20  ed this to make 
59b0: 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c  it legal to call
59c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
59d0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ** from within a
59e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20   function call. 
59f0: 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f   .** .** This ro
5a00: 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20  utine simulates 
5a10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61  the effect of ha
5a20: 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73  ving two threads
5a30: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75   attempt to.** u
5a40: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
5a50: 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
5a60: 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   time..*/.static
5a70: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65   void sqlite3Exe
5a80: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74  e **argv.){.  st
5ad0: 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d  ruct dstr x;.  m
5ae0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
5af0: 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64  eof(x));.  (void
5b00: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73  )sqlite3_exec((s
5b10: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f  qlite3*)sqlite3_
5b20: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5b30: 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t),.      (char*
5b40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5b50: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
5b60: 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c      execFuncCall
5b70: 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20  back, &x, 0);.  
5b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b90: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a  ext(context, x.z
5ba0: 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54  , x.nUsed, SQLIT
5bb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a  sqlite3_free(x.z
5bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5be0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b  ementation of tk
5bf0: 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73  t2213func(), a s
5c00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
5c10: 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c  hat takes exactl
5c20: 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e  y.** one argumen
5c30: 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e  t. It has two in
5c40: 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72  teresting featur
5c50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63  es:.**.** * It c
5c60: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c  alls sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65  ue_text() 3 time
5c80: 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s on the argumen
5c90: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t sqlite3_value*
5ca0: 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68  ..**   If the th
5cb0: 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  ree pointers ret
5cc0: 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68  urned are not th
5cd0: 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72  e same an SQL er
5ce0: 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a  ror is raised..*
5cf0: 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65  *.** * Otherwise
5d00: 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f   it returns a co
5d10: 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72  py of the text r
5d20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5d30: 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d   its .**   argum
5d40: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
5d50: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
5d60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5d70: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5d80: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5d90: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5da0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5db0: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5dc0: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5dd0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5de0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5df0: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5e00: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
5e10: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
5e20: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
5e30: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
5e40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
5e50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5e60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5e70: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5e90: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5ea0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5eb0: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5ed0: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5ee0: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5ef0: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5f00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5f20: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
5f30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
5f60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f70: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5f80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f90: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5fa0: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5fb0: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5fd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5fe0: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5ff0: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
6000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6010: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
6020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
6030: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
6040: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
6050: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
6060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6070: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6080: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
6090: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
60b0: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
60c0: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
60d0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
60e0: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
60f0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
6100: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
6110: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
6120: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
6130: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
6140: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
6150: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
6160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6170: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
6190: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
61a0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
61b0: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
61c0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
61d0: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
61e0: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
61f0: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
6200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6210: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
6220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6230: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
6240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6250: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
6260: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
6270: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
6280: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
6290: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
62a0: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
62b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
62c0: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
62d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
62e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
62f0: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
6300: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
6310: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6320: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
6330: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
6340: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
6350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6360: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6370: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
6380: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6390: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
63a0: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
63b0: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
63c0: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
63d0: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
63e0: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
63f0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
6400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
6420: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
6430: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6440: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
6450: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
6460: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
6470: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
6480: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6490: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
64a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
64b0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
64c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
64d0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
64e0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
64f0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6510: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
6560: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6570: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
6590: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
65a0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65b0: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
65c0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
65d0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
65e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
65f0: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
6600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6610: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6640: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
6650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6660: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
6670: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6690: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
66a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66b0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
66c0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
66d0: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
66e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
66f0: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
6700: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
6710: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6720: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
6730: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
6740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
6750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6760: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6770: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6780: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
6790: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
67a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
67b0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
67c0: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
67d0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6810: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6820: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6830: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6840: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6850: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6860: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6870: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6880: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6890: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
68a0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
68b0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
68c0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68d0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
68e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6900: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
6910: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=p2);.}../*.**
6920: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
6930: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  on returns a dif
6940: 66 65 72 65 6e 74 20 61 6e 73 77 65 72 20 65 61  ferent answer ea
6950: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
6960: 6c 6c 65 64 2c 20 65 76 65 6e 20 69 66 0a 2a 2a  lled, even if.**
6970: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
6980: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
6990: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6e 64  static void nond
69a0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
69b0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
69c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
69e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61   **argv.){.  sta
6a00: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
6a10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6a20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 63  t_int(context, c
6a30: 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nt++);.}../*.** 
6a40: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6a50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6a60: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6a70: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6a80: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6a90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6aa0: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6ab0: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6ac0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
6ad0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
6ae0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
6af0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
6b00: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
6b10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6b20: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6b30: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6b50: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6b60: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6b70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6b80: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6b90: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6ba0: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6bb0: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6bc0: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
6bd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
6be0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
6bf0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
6c00: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
6c10: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
6c20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6c30: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6c40: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6c60: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6c70: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6c80: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6c90: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6ca0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6cb0: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6cc0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
6cd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
6ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
6cf0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
6d00: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
6d10: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
6d20: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6d30: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6d40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6d60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6d70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6d80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6dc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
6dd0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
6de0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6df0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6e00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6e10: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
6e20: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6e30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6e50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6e60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
6e70: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6e80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ea0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6eb0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6ec0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6ee0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ef0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6f00: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6f10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f20: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6f30: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6f60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6f70: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
6f80: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
6f90: 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
6fa0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
6fb0: 20 20 20 20 30 2c 20 68 65 78 38 46 75 6e 63 2c      0, hex8Func,
6fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
6fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6fe0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
6ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7010: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7020: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7030: 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c  LITE_UTF16 | SQL
7040: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7050: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7060: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
7070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
70a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
70b0: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
70c0: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
70d0: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
70e0: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
70f0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7120: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7130: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
7140: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
7150: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7160: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
7170: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
7180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 75  0);.  }..  /* Fu
7190: 6e 63 74 69 6f 6e 73 20 63 6f 75 6e 74 65 72 31  nctions counter1
71a0: 28 29 20 61 6e 64 20 63 6f 75 6e 74 65 72 32 28  () and counter2(
71b0: 29 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  ) have the same 
71c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2d  implementation -
71d0: 20 74 68 65 79 0a 20 20 2a 2a 20 62 6f 74 68 20   they.  ** both 
71e0: 72 65 74 75 72 6e 20 61 6e 20 61 73 63 65 6e 64  return an ascend
71f0: 69 6e 67 20 69 6e 74 65 67 65 72 20 77 69 74 68  ing integer with
7200: 20 65 61 63 68 20 63 61 6c 6c 2e 20 20 42 75 74   each call.  But
7210: 20 63 6f 75 6e 74 65 72 31 28 29 20 69 73 20 6d   counter1() is m
7220: 61 72 6b 65 64 0a 20 20 2a 2a 20 61 73 20 6e 6f  arked.  ** as no
7230: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
7240: 61 6e 64 20 63 6f 75 6e 74 65 72 32 28 29 20 69  and counter2() i
7250: 73 20 6d 61 72 6b 65 64 20 61 73 20 64 65 74 65  s marked as dete
7260: 72 6d 69 6e 69 73 74 69 63 2e 0a 20 20 2a 2f 0a  rministic..  */.
7270: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7290: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
72b0: 6e 74 65 72 31 22 2c 20 2d 31 2c 20 53 51 4c 49  nter1", -1, SQLI
72c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
72d0: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
72e0: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
72f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7310: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7330: 6f 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 32  on(db, "counter2
7340: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7350: 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  F8|SQLITE_DETERM
7360: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
7370: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
7380: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
7390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
73a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73b0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73d0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73e0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73f0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
7400: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7410: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7420: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7430: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7450: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7470: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7490: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
74a0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74b0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74e0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7500: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7510: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7520: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7540: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7560: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
75a0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75b0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75c0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75d0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75e0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7610: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7620: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7650: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7660: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7670: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7680: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
76a0: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76d0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76f0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
7700: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7710: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7720: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7730: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7740: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7750: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7760: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7770: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7780: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7790: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
77a0: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77b0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77e0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77f0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
7800: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7810: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7820: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7830: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7840: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7850: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7860: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7870: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7880: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7890: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
78a0: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78b0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78c0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78d0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78e0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7900: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7920: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7930: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7940: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7950: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7970: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7990: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
79a0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79d0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
7a00: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a20: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a30: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a40: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a50: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a80: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a90: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7aa0: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7ab0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ac0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ae0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7af0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7b00: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b10: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b20: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b30: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b40: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ba0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7bb0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bc0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7be0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bf0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7c00: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7c70: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7c80: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7c90: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7ca0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7cb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7cd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f  *argv.){.  /* no
7ce0: 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63  -op */.}..static
7cf0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7d00: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d20: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d40: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d50: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d60: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d90: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7da0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7db0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7dc0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dd0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7de0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7df0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7e00: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e20: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e50: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e60: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e70: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e90: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7ea0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7eb0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7ec0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ed0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ee0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ef0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7f00: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f10: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f20: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f30: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f40: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f50: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f60: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f80: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f90: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7fa0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fb0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fc0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fd0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fe0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7ff0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
8000: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8020: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8030: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8040: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8050: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8060: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8070: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8080: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8090: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
80a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80b0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80c0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8100: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8110: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8120: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8140: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8150: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8160: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8170: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8180: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8190: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
81a0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8200: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8230: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8240: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8250: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8270: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8280: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8290: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
82a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82b0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82c0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8300: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8310: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8320: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8330: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8340: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8350: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
83a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83b0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83c0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83d0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83e0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83f0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8400: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8420: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8430: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8440: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8470: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8480: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
84a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84b0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84c0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84d0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84e0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84f0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8500: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8510: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8520: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8530: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8540: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8550: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8560: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8570: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8580: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8590: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
85a0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85c0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8690: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
86a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86f0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8720: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8730: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8750: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8760: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8770: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8780: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
8790: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
87a0: 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87b0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8840: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8870: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8890: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88b0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8900: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8910: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8920: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8930: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8950: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8960: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8970: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8980: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8990: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
89a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89c0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89d0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46  _mprintf_int64 F
8a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8a60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8a70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8a80: 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62   with three 64-b
8a90: 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  it integer argum
8aa0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8ac0: 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  tf_int64(.  void
8ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8b90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8ba0: 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b  lite_int64 a[3];
8bb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
8bc0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
8bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8bf0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8c00: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8c10: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
8c20: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
8c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c50: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
8c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8c70: 69 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b  ite3Atoi64(argv[
8c80: 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30  i], &a[i-2], 100
8c90: 30 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0000, SQLITE_UTF
8ca0: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8ce0: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8cf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8d10: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8d20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8d30: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8d40: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
8db0: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
8dc0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8dd0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8de0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8df0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
8e00: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
8e10: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
8e20: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
8e30: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
8e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8e50: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
8e60: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
8e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
8e90: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
8ea0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8eb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ec0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8ed0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8ee0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8ef0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f60: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
8f70: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
8f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8f90: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8fa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8fc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8fd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8fe0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8ff0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
9000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9050: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9070: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9080: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9090: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
90a0: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
90b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
90c0: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
90d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
90e0: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
90f0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
9100: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9110: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9120: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9160: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9170: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9180: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9190: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
91a0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
91b0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
91c0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
91d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
91e0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
91f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
92a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
92b0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
92c0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
92d0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
92e0: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
92f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9300: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9310: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9320: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9330: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
9340: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9350: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9370: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9390: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
93a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
93b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
93c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
93d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
93e0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
93f0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9400: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
9410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9420: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9440: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9460: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9470: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9480: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9490: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
94a0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
94b0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
94c0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
94d0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
94e0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
94f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9500: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9510: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9530: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9540: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9550: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9560: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9570: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9590: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
95a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
95b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
95c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
95d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
95e0: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
95f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9600: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9610: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9630: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9640: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9650: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9660: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9670: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
96a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
96b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
96c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
96d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
96e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
96f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9700: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9710: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9730: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9740: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9750: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9760: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9770: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
97a0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
97b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
97c0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
97d0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
97e0: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
97f0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9810: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9850: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9860: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9870: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9880: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9890: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
98a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
98b0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
98c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
98d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
98e0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
98f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
99a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
99b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
99c0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
99d0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
9a50: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9a80: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9a90: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9aa0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ab0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9ad0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
9ae0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
9af0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
9b10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b20: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9b30: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b90: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9ba0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
9bb0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
9bc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9bd0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9be0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9bf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9c00: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9c10: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
9c20: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
9c30: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
9c40: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
9c50: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
9c60: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
9c70: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9c80: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9ca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9cb0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
9cc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9cd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ce0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9cf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9d00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9d10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9d40: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9d50: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9d60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9d70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9d80: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
9d90: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
9da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
9db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9e00: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9e10: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e30: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9e40: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9e50: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
9e60: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9e70: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
9e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9eb0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
9ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9ef0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9f00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9f10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9f20: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
9f30: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
9f40: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f50: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
9f60: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
9f70: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
9f80: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9f90: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9fa0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9fd0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9fe0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9ff0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a000: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a010: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a020: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a030: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a040: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a050: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a060: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a070: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a080: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a090: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a0b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a0c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a0d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a0e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a0f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a100: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a110: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a120: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a130: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a140: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a150: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a160: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a170: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a190: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a1a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a1b0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a1c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a1d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a1e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a1f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a210: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a220: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a230: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a240: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a250: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a260: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a270: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a280: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a290: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a2a0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2d0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a2e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a2f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a300: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a310: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a320: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a330: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a340: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a360: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a370: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a380: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a390: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a3a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a3b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a3c0: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a3e0: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a3f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a410: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a420: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a430: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a440: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
a450: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a470: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
a480: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
a490: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
a4a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
a4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a4c0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
a4d0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
a4e0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
a4f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a500: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a510: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
a520: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
a530: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
a540: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
a550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a560: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
a570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a580: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
a5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a5b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a5c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
a5d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
a5e0: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
a5f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a600: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a610: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
a620: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
a630: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
a640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
a650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
a660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
a670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
a680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
a6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
a6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
a720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
a730: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
a740: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
a750: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
a760: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
a770: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a780: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a790: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
a7a0: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
a7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a7c0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
a7d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
a7e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
a7f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
a800: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a810: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a820: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
a830: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a860: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
a870: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
a880: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
a890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
a8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a8c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a8d0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a8e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
a8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
a930: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
a940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a950: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
a960: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a970: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a980: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
a990: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
a9b0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a9c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a9d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a9e0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a9f0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
aa10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
aa20: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
aa30: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aa40: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
aa50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa70: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
aa80: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
aa90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
aaa0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
aab0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
aac0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
aad0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
aae0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
aaf0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ab00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ab10: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
ab20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ab40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ab50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ab60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
ab70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ab80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ab90: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
aba0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
abb0: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
abe0: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
abf0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
ac00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac20: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
ac30: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
ac40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
ac50: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
ac60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
ac70: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
ac80: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
ac90: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
aca0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
acb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
acc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
acd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
ace0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
acf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
ad20: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
ad30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
ad40: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ad50: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
ad60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad70: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
ad80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
ad90: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
adc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
add0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ade0: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
adf0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
ae00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ae10: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ae20: 54 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e  TADATA.static in
ae30: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
ae40: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
ae50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ae60: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ae70: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
ae80: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ae90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
aea0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
aeb0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
aec0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
aed0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
aee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
af10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
af20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
af30: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
af40: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
af50: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
af60: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
af70: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
af80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
afa0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
afb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
afc0: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
afe0: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
aff0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b000: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b010: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b020: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
b030: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b040: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b050: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b060: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b080: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b090: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b0a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b0c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b0d0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b0e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b0f0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b100: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b110: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47  ;.  zCol = Tcl_G
b120: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b130: 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e  );..  if( strlen
b140: 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d  (zDb)==0 ) zDb =
b150: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
b160: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
b170: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
b180: 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a  b, zTbl, zCol, .
b190: 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65        &zDatatype
b1a0: 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f  , &zCollseq, &no
b1b0: 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b  tnull, &primaryk
b1c0: 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65  ey, &autoincreme
b1d0: 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  nt);..  if( rc!=
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b1f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b200: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
b210: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
b220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b230: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
b240: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
b250: 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
b260: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b270: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b280: 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79  tringObj(zDataty
b290: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  pe, -1));.  Tcl_
b2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b2b0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b2c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
b2d0: 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20  Collseq, -1));. 
b2e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b2f0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b300: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
b310: 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63  (notnull));.  Tc
b320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b330: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b340: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72  Tcl_NewIntObj(pr
b350: 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63  imarykey));.  Tc
b360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b370: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b380: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75  Tcl_NewIntObj(au
b390: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20  toincrement));. 
b3a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b3b0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
b3c0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b3d0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
b3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b3f0: 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69  _INCRBLOB..stati
b400: 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65  c int blobHandle
b410: 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49  FromObj(.  Tcl_I
b420: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
b430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
b440: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b450: 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68  **ppBlob.){.  ch
b460: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
b470: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
b480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a  ringFromObj(pObj
b490: 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  , &n);.  if( n==
b4a0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  0 ){.    *ppBlob
b4b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b4c0: 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
b4d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
b4e0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69  channel;.    Cli
b4f0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
b500: 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63  Data;.    .    c
b510: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
b520: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
b530: 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  z, &notUsed);.  
b540: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29    if( !channel )
b550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b560: 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73  R;..    Tcl_Flus
b570: 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  h(channel);.    
b580: 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c  Tcl_Seek(channel
b590: 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
b5a0: 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74  .    instanceDat
b5b0: 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  a = Tcl_GetChann
b5c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
b5d0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70  hannel);.    *pp
b5e0: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
b5f0: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
b600: 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ceData);.  }..  
b610: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b620: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
b630: 62 6c 6f 62 5f 62 79 74 65 73 20 20 43 48 41 4e  blob_bytes  CHAN
b640: 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NEL.*/.static in
b650: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65  t test_blob_byte
b660: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
b670: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
b680: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
b690: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b6a0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b6b0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b6c0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b6d0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b6e0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b6f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b700: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b710: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b720: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b730: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b740: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
b750: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74  Blob;.  int nByt
b760: 65 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  e;.  .  if( objc
b770: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
b780: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b790: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
b7a0: 41 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74  ANNEL");.    ret
b7b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b7c0: 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61   }..  if( blobHa
b7d0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndleFromObj(inte
b7e0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42  rp, objv[1], &pB
b7f0: 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  lob) ) return TC
b800: 4c 5f 45 52 52 4f 52 3b 0a 20 20 6e 42 79 74 65  L_ERROR;.  nByte
b810: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
b820: 62 79 74 65 73 28 70 42 6c 6f 62 29 3b 0a 20 20  bytes(pBlob);.  
b830: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b840: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
b850: 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b 0a  IntObj(nByte));.
b860: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
b880: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 43  e3_blob_close  C
b890: 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63  HANNEL.*/.static
b8a0: 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 63   int test_blob_c
b8b0: 6c 6f 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  lose(.  ClientDa
b8c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b8d0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
b8e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b8f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
b900: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
b910: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
b920: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
b930: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
b940: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b950: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b960: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b970: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
b980: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
b990: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
b9a0: 20 2a 70 42 6c 6f 62 3b 0a 20 20 0a 20 20 69 66   *pBlob;.  .  if
b9b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
b9c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
b9d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
b9e0: 76 2c 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20  v, "CHANNEL");. 
b9f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ba00: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ba10: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
ba20: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
ba30: 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74  ], &pBlob) ) ret
ba40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ba50: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
ba60: 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 0a 20 20 72  ose(pBlob);..  r
ba70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ba80: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
ba90: 6c 6f 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45  lob_read  CHANNE
baa0: 4c 20 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a  L OFFSET N.**.**
bab0: 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20     This command 
bac0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
bad0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
bae0: 5f 72 65 61 64 28 29 20 69 6e 20 77 61 79 73 20  _read() in ways 
baf0: 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63  that.**   the Tc
bb00: 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66  l channel interf
bb10: 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68  ace does not. Th
bb20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
bb30: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20   should.**   be 
bb40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
bb50: 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61  lid channel crea
bb60: 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72  ted by the [incr
bb70: 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20  blob] method.** 
bb80: 20 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20    of a database 
bb90: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e  handle. This fun
bba0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
bbb0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
bbc0: 2a 2a 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62  **   to read N b
bbd0: 79 74 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74  ytes from offset
bbe0: 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65   OFFSET from the
bbf0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69   underlying SQLi
bc00: 74 65 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e  te.**   blob han
bc10: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20  dle..**.**   On 
bc20: 73 75 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d  success, a byte-
bc30: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  array object con
bc40: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64  taining the read
bc50: 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72   data is .**   r
bc60: 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c  eturned. On fail
bc70: 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72  ure, the interpr
bc80: 65 74 65 72 20 72 65 73 75 6c 74 20 69 73 20 73  eter result is s
bc90: 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74  et to the.**   t
bca0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
bcb0: 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  on of the return
bcc0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  ed error code (i
bcd0: 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  .e. "SQLITE_NOME
bce0: 4d 22 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54  M").**   and a T
bcf0: 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  cl exception is 
bd00: 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69  thrown..*/.stati
bd10: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
bd20: 72 65 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  read(.  ClientDa
bd30: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
bd40: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
bd50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bd60: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
bd70: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
bd80: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
bd90: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
bda0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
bdb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bdc0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
bdd0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
bde0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
bdf0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
be00: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
be10: 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
be20: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Byte;.  int iOff
be30: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
be40: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a  char *zBuf = 0;.
be50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69    int rc;.  .  i
be60: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
be70: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
be80: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
be90: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46  jv, "CHANNEL OFF
bea0: 53 45 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  SET N");.    ret
beb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bec0: 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61   }..  if( blobHa
bed0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndleFromObj(inte
bee0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42  rp, objv[1], &pB
bef0: 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  lob) ) return TC
bf00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
bf10: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
bf20: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bf30: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73   objv[2], &iOffs
bf40: 65 74 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  et).   || TCL_OK
bf50: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
bf60: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
bf70: 5b 33 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 29  [3], &nByte).  )
bf80: 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  { .    return TC
bf90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
bfa0: 69 66 28 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20  if( nByte>0 ){. 
bfb0: 20 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67     zBuf = (unsig
bfc0: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41  ned char *)Tcl_A
bfd0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d  lloc(nByte);.  }
bfe0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
bff0: 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c  blob_read(pBlob,
c000: 20 7a 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f   zBuf, nByte, iO
c010: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
c020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c030: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
c040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
c050: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
c060: 7a 42 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20  zBuf, nByte));. 
c070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
c080: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c090: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c0a0: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
c0b0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
c0c0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
c0d0: 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65  r *)zBuf);..  re
c0e0: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
c0f0: 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54  _OK ? TCL_OK : T
c100: 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a  CL_ERROR);.}../*
c110: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
c120: 5f 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f  _write CHANNEL O
c130: 46 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54  FFSET DATA ?NDAT
c140: 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  A?.**.**   This 
c150: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
c160: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
c170: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29  te3_blob_write()
c180: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
c190: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
c1a0: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
c1b0: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
c1c0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
c1d0: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
c1e0: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
c1f0: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
c200: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
c210: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
c220: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
c230: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c240: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
c250: 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74  b_write().**   t
c260: 6f 20 77 72 69 74 65 20 74 68 65 20 44 41 54 41  o write the DATA
c270: 20 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74   byte-array to t
c280: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51  he underlying SQ
c290: 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65  Lite blob handle
c2a0: 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74  ..**   at offset
c2b0: 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
c2c0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20   On success, an 
c2d0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
c2e0: 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69  returned. On fai
c2f0: 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70  lure, the interp
c300: 72 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c  reter.**   resul
c310: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
c320: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
c330: 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72  ion of the retur
c340: 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a  ned error code .
c350: 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49  **   (i.e. "SQLI
c360: 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61  TE_NOMEM") and a
c370: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69   Tcl exception i
c380: 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61  s thrown..*/.sta
c390: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f  tic int test_blo
c3a0: 62 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  b_write(.  Clien
c3b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c3c0: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c3d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c3e0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c3f0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c400: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c410: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c420: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c440: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c450: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c460: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c470: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c480: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  /.){.  sqlite3_b
c490: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
c4a0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
c4b0: 20 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64   rc;..  unsigned
c4c0: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69   char *zBuf;.  i
c4d0: 6e 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66  nt nBuf;.  .  if
c4e0: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
c4f0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
c500: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c510: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
c520: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41  HANNEL OFFSET DA
c530: 54 41 20 3f 4e 44 41 54 41 3f 22 29 3b 0a 20 20  TA ?NDATA?");.  
c540: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c550: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
c560: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
c570: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
c580: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
c590: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c5a0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
c5b0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
c5c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c5d0: 69 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20 20  iOffset) ){ .   
c5e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c5f0: 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d  R;.  }..  zBuf =
c600: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
c610: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
c620: 2c 20 26 6e 42 75 66 29 3b 0a 20 20 69 66 28 20  , &nBuf);.  if( 
c630: 6f 62 6a 63 3d 3d 35 20 26 26 20 54 63 6c 5f 47  objc==5 && Tcl_G
c640: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c650: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e  erp, objv[4], &n
c660: 42 75 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Buf) ){.    retu
c670: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c680: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
c690: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
c6a0: 62 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69  b, zBuf, nBuf, i
c6b0: 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
c6c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c6d0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c6e0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c6f0: 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  *)sqlite3ErrName
c700: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
c710: 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  LE);.  }..  retu
c720: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
c730: 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  K ? TCL_OK : TCL
c740: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74  _ERROR);.}..stat
c750: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
c760: 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c 69 65 6e  _reopen(.  Clien
c770: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c780: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c790: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c7a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c7b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c7c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c7d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c7e0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c7f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c800: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c810: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c820: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c830: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c840: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49  /.){.  Tcl_WideI
c850: 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c  nt iRowid;.  sql
c860: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c870: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c880: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
c890: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c8a0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c8b0: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 52 4f 57  jv, "CHANNEL ROW
c8c0: 49 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ID");.    return
c8d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c8e0: 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c  .  if( blobHandl
c8f0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
c900: 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62   objv[1], &pBlob
c910: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
c920: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
c930: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
c940: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
c950: 5d 2c 20 26 69 52 6f 77 69 64 29 20 29 20 72 65  ], &iRowid) ) re
c960: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c970: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c980: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f  blob_reopen(pBlo
c990: 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  b, iRowid);.  if
c9a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
c9c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
c9d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
c9e0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
c9f0: 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72  ATILE);.  }..  r
ca00: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
ca10: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
ca20: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23  TCL_ERROR);.}..#
ca30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
ca40: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ge: sqlite3_crea
ca50: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20  te_collation_v2 
ca60: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
ca70: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
ca80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63  .**.**   This Tc
ca90: 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20 66  l proc is used f
caa0: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 65  or testing the e
cab0: 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20  xperimental.**  
cac0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
cad0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69  collation_v2() i
cae0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72  nterface..*/.str
caf0: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
cb00: 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nX {.  Tcl_Inter
cb10: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
cb20: 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63  _Obj *pCmp;.  Tc
cb30: 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a  l_Obj *pDel;.};.
cb40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
cb50: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65  estCollationX Te
cb60: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74  stCollationX;.st
cb70: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43 72  atic void testCr
cb80: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
cb90: 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
cba0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cbb0: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
cbc0: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69  onX *)pCtx;..  i
cbd0: 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  nt rc = Tcl_Eval
cbe0: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
cbf0: 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56   p->pDel, TCL_EV
cc00: 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56  AL_DIRECT|TCL_EV
cc10: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66  AL_GLOBAL);.  if
cc20: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc!=TCL_OK ){.
cc30: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
cc40: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
cc50: 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44  p);.  }..  Tcl_D
cc60: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
cc70: 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  Cmp);.  Tcl_Decr
cc80: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c  RefCount(p->pDel
cc90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
cca0: 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a  e((void *)p);.}.
ccb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 43  static int testC
ccc0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
ccd0: 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  p(.  void *pCtx,
cce0: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20  .  int nLeft,.  
ccf0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66  const void *zLef
cd00: 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c  t,.  int nRight,
cd10: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
cd20: 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43  Right.){.  TestC
cd30: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
cd40: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cd50: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
cd60: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
cd70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
cd80: 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65  pCmp);.  int iRe
cd90: 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e  s = 0;..  Tcl_In
cda0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
cdb0: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
cdc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
cdd0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
cde0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
cdf0: 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66  ar *)zLeft, nLef
ce00: 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
ce10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ce20: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
ce30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
ce40: 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67  ar *)zRight,nRig
ce50: 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c  ht));..  if( TCL
ce60: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
ce70: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53  Ex(p->interp, pS
ce80: 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f  cript, TCL_EVAL_
ce90: 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f  DIRECT|TCL_EVAL_
cea0: 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43  GLOBAL).   || TC
ceb0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
cec0: 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72  FromObj(p->inter
ced0: 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  p, Tcl_GetObjRes
cee0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
cef0: 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20  &iRes).  ){.    
cf00: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
cf10: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
cf20: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
cf30: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
cf40: 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b  ..  return iRes;
cf50: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
cf60: 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
cf70: 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  ion_v2(.  Client
cf80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
cf90: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
cfa0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
cfb0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
cfc0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
cfd0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
cfe0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
cff0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d000: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d010: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d020: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d030: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d040: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d050: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d060: 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74  ionX *p;.  sqlit
d070: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
d080: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
d090: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d0a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d0b0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
d0c0: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d0d0: 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20  OC DEL-PROC");. 
d0e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d0f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
d100: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
d110: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d120: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
d130: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d140: 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73  ROR;..  p = (Tes
d150: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71  tCollationX *)sq
d160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d170: 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f  eof(TestCollatio
d180: 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20  nX));.  p->pCmp 
d190: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e  = objv[3];.  p->
d1a0: 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  pDel = objv[4];.
d1b0: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
d1c0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  terp;.  Tcl_Incr
d1d0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70  RefCount(p->pCmp
d1e0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
d1f0: 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a  Count(p->pDel);.
d200: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d210: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d220: 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53  _v2(db, Tcl_GetS
d230: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
d240: 31 36 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  16, .      (void
d250: 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65   *)p, testCreate
d260: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65  CollationCmp, te
d270: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
d280: 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20  nDel.  );.  if( 
d290: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
d2a0: 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  E ){.    Tcl_App
d2b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d2c0: 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  , "sqlite3_creat
d2d0: 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66  e_collate_v2() f
d2e0: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
d2f0: 22 0a 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61  ".      "an inva
d300: 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28  lid encoding", (
d310: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
d320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d330: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d340: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d350: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
d360: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
d370: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ), SQLITE_UTF8, 
d380: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
d390: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
d3a0: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
d3b0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
d3c0: 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
d3d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
d3e0: 55 53 41 47 45 3a 20 73 71 6c 69 74 65 33 5f 63  USAGE: sqlite3_c
d3f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
d400: 32 20 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45  2 DB NAME NARG E
d410: 4e 43 20 3f 53 57 49 54 43 48 45 53 3f 0a 2a 2a  NC ?SWITCHES?.**
d420: 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 77  .** Available sw
d430: 69 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  itches are:.**.*
d440: 2a 20 20 20 2d 66 75 6e 63 20 20 20 20 53 43 52  *   -func    SCR
d450: 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70 20 20  IPT.**   -step  
d460: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 66    SCRIPT.**   -f
d470: 69 6e 61 6c 20 20 20 53 43 52 49 50 54 0a 2a 2a  inal   SCRIPT.**
d480: 20 20 20 2d 64 65 73 74 72 6f 79 20 53 43 52 49     -destroy SCRI
d490: 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  PT.*/.typedef st
d4a0: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
d4b0: 69 6f 6e 56 32 20 43 72 65 61 74 65 46 75 6e 63  ionV2 CreateFunc
d4c0: 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74 20 43  tionV2;.struct C
d4d0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d4e0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
d4f0: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
d500: 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20  j *pFunc;       
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
d520: 69 70 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ipt for function
d530: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
d540: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65 70 3b   Tcl_Obj *pStep;
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61   /* Script for a
d570: 67 67 2e 20 73 74 65 70 20 69 6e 76 6f 63 61 74  gg. step invocat
d580: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
d590: 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 20 20   *pFinal;       
d5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
d5b0: 70 74 20 66 6f 72 20 61 67 67 2e 20 66 69 6e 61  pt for agg. fina
d5c0: 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63 61 74  lization invocat
d5d0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
d5e0: 20 2a 70 44 65 73 74 72 6f 79 3b 20 20 20 20 20   *pDestroy;     
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
d600: 72 75 63 74 6f 72 20 73 63 72 69 70 74 20 2a 2f  ructor script */
d610: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
d620: 63 66 32 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  cf2Func(sqlite3_
d630: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
d640: 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
d650: 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d  value **aArg){.}
d660: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
d670: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
d680: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e  text *ctx, int n
d690: 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Arg, sqlite3_val
d6a0: 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74  ue **aArg){.}.st
d6b0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 69 6e  atic void cf2Fin
d6c0: 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  al(sqlite3_conte
d6d0: 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74 61 74  xt *ctx){.}.stat
d6e0: 69 63 20 76 6f 69 64 20 63 66 32 44 65 73 74 72  ic void cf2Destr
d6f0: 6f 79 28 76 6f 69 64 20 2a 70 55 73 65 72 29 7b  oy(void *pUser){
d700: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
d710: 6e 56 32 20 2a 70 20 3d 20 28 43 72 65 61 74 65  nV2 *p = (Create
d720: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70 55 73  FunctionV2 *)pUs
d730: 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  er;..  if( p->in
d740: 74 65 72 70 20 26 26 20 70 2d 3e 70 44 65 73 74  terp && p->pDest
d750: 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  roy ){.    int r
d760: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
d770: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
d780: 70 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a 20 20  pDestroy, 0);.  
d790: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
d7a0: 20 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e   ) Tcl_Backgroun
d7b0: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
d7d0: 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 44 65 63  >pFunc ) Tcl_Dec
d7e0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75  rRefCount(p->pFu
d7f0: 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  nc); .  if( p->p
d800: 53 74 65 70 20 29 20 54 63 6c 5f 44 65 63 72 52  Step ) Tcl_DecrR
d810: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70  efCount(p->pStep
d820: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  ); .  if( p->pFi
d830: 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65  nal ) Tcl_DecrRe
d840: 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c  fCount(p->pFinal
d850: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
d860: 73 74 72 6f 79 20 29 20 54 63 6c 5f 44 65 63 72  stroy ) Tcl_Decr
d870: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73  RefCount(p->pDes
d880: 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69 74 65  troy); .  sqlite
d890: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  3_free(p);.}.sta
d8a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
d8b0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
d8c0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
d8d0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
d8e0: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
d8f0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
d900: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
d910: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b      /* The invok
d920: 69 6e 67 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ing TCL interpre
d930: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  ter */.  int obj
d940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
d970: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
d980: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20  NST objv[]      
d990: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
d9a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
d9b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d9c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
d9d0: 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  nc;.  int nArg;.
d9e0: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65    int enc;.  Cre
d9f0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
da00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
da10: 20 72 63 3b 0a 0a 20 20 73 74 72 75 63 74 20 45   rc;..  struct E
da20: 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f  ncTable {.    co
da30: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a  nst char *zEnc;.
da40: 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d      int enc;.  }
da50: 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20   aEnc[] = {.    
da60: 7b 22 75 74 66 38 22 2c 20 20 20 20 53 51 4c 49  {"utf8",    SQLI
da70: 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b  TE_UTF8 },.    {
da80: 22 75 74 66 31 36 22 2c 20 20 20 53 51 4c 49 54  "utf16",   SQLIT
da90: 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b  E_UTF16 },.    {
daa0: 22 75 74 66 31 36 6c 65 22 2c 20 53 51 4c 49 54  "utf16le", SQLIT
dab0: 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20  E_UTF16LE },.   
dac0: 20 7b 22 75 74 66 31 36 62 65 22 2c 20 53 51 4c   {"utf16be", SQL
dad0: 49 54 45 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20  ITE_UTF16BE },. 
dae0: 20 20 20 7b 22 61 6e 79 22 2c 20 20 20 20 20 53     {"any",     S
daf0: 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20  QLITE_ANY },.   
db00: 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a   {"0", 0 }.  };.
db10: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c  .  if( objc<5 ||
db20: 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a   (objc%2)==0 ){.
db30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
db40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
db50: 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e  objv, "DB NAME N
db60: 41 52 47 20 45 4e 43 20 53 57 49 54 43 48 45 53  ARG ENC SWITCHES
db70: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
db80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
db90: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
dba0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
dbb0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
dbc0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
dbd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dbe0: 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53  zFunc = Tcl_GetS
dbf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
dc00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
dc10: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dc20: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20  objv[3], &nArg) 
dc30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dc40: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
dc50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
dc60: 75 63 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  uct(interp, objv
dc70: 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f  [4], aEnc, sizeo
dc80: 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20  f(aEnc[0]), .   
dc90: 20 20 20 20 20 20 20 22 65 6e 63 6f 64 69 6e 67         "encoding
dca0: 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b  ", 0, &enc).  ){
dcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
dcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63  ERROR;.  }.  enc
dcd0: 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63   = aEnc[enc].enc
dce0: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
dcf0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43  _malloc(sizeof(C
dd00: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29  reateFunctionV2)
dd10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
dd20: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
dd30: 20 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75   sizeof(CreateFu
dd40: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d  nctionV2));.  p-
dd50: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
dd60: 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c  ;..  for(i=5; i<
dd70: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
dd80: 20 69 6e 74 20 69 53 77 69 74 63 68 3b 0a 20 20   int iSwitch;.  
dd90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
dda0: 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75  Switch[] = {"-fu
ddb0: 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d  nc", "-step", "-
ddc0: 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f  final", "-destro
ddd0: 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69 66 28 20  y", 0};.    if( 
dde0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
ddf0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
de00: 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68 2c 20 22  [i], azSwitch, "
de10: 73 77 69 74 63 68 22 2c 20 30 2c 20 26 69 53 77  switch", 0, &iSw
de20: 69 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 73  itch) ){.      s
de30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
de40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
de50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
de60: 20 20 20 73 77 69 74 63 68 28 20 69 53 77 69 74     switch( iSwit
de70: 63 68 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ch ){.      case
de80: 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f   0: p->pFunc = o
de90: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
dea0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
deb0: 20 31 3a 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f   1: p->pStep = o
dec0: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
ded0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dee0: 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20   2: p->pFinal = 
def0: 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62  objv[i+1];     b
df00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
df10: 20 33 3a 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   3: p->pDestroy 
df20: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62  = objv[i+1];   b
df30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
df40: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
df50: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f   p->pFunc = Tcl_
df60: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
df70: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
df80: 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e 70 53 74  ->pStep ) p->pSt
df90: 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ep = Tcl_Duplica
dfa0: 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b  teObj(p->pStep);
dfb0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
dfc0: 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20  l ) p->pFinal = 
dfd0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
dfe0: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
dff0: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
e000: 29 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20  ) p->pDestroy = 
e010: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e020: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
e030: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
e040: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
e050: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
e060: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e070: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
e080: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e090: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
e0a0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e0b0: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
e0c0: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
e0d0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
e0e0: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
e0f0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
e100: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e110: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e120: 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20  Arg, enc, (void 
e130: 2a 29 70 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e  *)p, .      (p->
e140: 70 46 75 6e 63 20 3f 20 63 66 32 46 75 6e 63 20  pFunc ? cf2Func 
e150: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e160: 70 53 74 65 70 20 3f 20 63 66 32 53 74 65 70 20  pStep ? cf2Step 
e170: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e180: 70 46 69 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61  pFinal ? cf2Fina
e190: 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 63 66  l : 0),.      cf
e1a0: 32 44 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20  2Destroy.  );.  
e1b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e1c0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
e1d0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
e1e0: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
e1f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
e200: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
e210: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
e220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e230: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
e250: 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  : sqlite3_load_e
e260: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
e270: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a  LE FILE ?PROC?.*
e280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
e290: 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
e2a0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
e2b0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
e2c0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
e2d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e2e0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
e2f0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
e300: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
e310: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
e320: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e330: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
e340: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
e350: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e360: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
e370: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
e380: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
e390: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
e3a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
e3b0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61  char *zDb;.  cha
e3c0: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
e3d0: 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63   *zProc = 0;.  c
e3e0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a  har *zErr = 0;..
e3f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
e400: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e410: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e420: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
e430: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  , "DB-HANDLE FIL
e440: 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20  E ?PROC?");.    
e450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e460: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
e470: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e480: 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  [1]);.  zFile = 
e490: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e4a0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62  jv[2]);.  if( ob
e4b0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72  jc==4 ){.    zPr
e4c0: 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  oc = Tcl_GetStri
e4d0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d  ng(objv[3]);.  }
e4e0: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
e4f0: 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61  he C database ha
e500: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63  ndle from the Tc
e510: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  l command name *
e520: 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  /.  if( !Tcl_Get
e530: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
e540: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
e550: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
e560: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e570: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
e580: 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28  found: ", zDb, (
e590: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
e5a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e5b0: 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72    }.  db = ((str
e5c0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
e5d0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
e5e0: 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65  ata)->db;.  asse
e5f0: 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61  rt(db);..  /* Ca
e600: 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ll the underlyin
e610: 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  g C function. If
e620: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e630: 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a  , set rc to .  *
e640: 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20  * TCL_ERROR and 
e650: 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73  load any error s
e660: 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69  tring into the i
e670: 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e  nterpreter. If n
e680: 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63  o .  ** error oc
e690: 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20  curs, set rc to 
e6a0: 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66  TCL_OK..  */.#if
e6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e6c0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
e6d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e6e0: 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  OR;.  zErr = sql
e6f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68  ite3_mprintf("th
e700: 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73  is build omits s
e710: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
e720: 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65  nsion()");.#else
e730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
e740: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
e750: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
e760: 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a   &zErr);.#endif.
e770: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
e790: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e7a0: 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22   zErr ? zErr : "
e7b0: 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ", TCL_VOLATILE)
e7c0: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
e7d0: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
e7e0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
e7f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
e800: 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74  ee(zErr);..  ret
e810: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e820: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e830: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
e840: 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20  nsion DB-HANDLE 
e850: 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20  ONOFF.*/.static 
e860: 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  int test_enable_
e870: 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  load(.  ClientDa
e880: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
e890: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
e8a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e8b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
e8c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
e8d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
e8e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
e8f0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
e900: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e910: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
e920: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e930: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
e940: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
e950: 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
e960: 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  cmdInfo;.  sqlit
e970: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
e980: 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66  zDb;.  int onoff
e990: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
e9a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
e9b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e9c0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
e9d0: 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20  NDLE ONOFF");.  
e9e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9f0: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
ea00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ea10: 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78  jv[1]);..  /* Ex
ea20: 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61  tract the C data
ea30: 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  base handle from
ea40: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
ea50: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21   name */.  if( !
ea60: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
ea70: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
ea80: 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
ea90: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eaa0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
eab0: 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
eac0: 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b   zDb, (char*)0);
ead0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
eae0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20  ERROR;.  }.  db 
eaf0: 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
eb00: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
eb10: 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
eb20: 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a  .  assert(db);..
eb30: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f    /* Get the ono
eb40: 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ff parameter */.
eb50: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
eb60: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
eb70: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
eb80: 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  off) ){.    retu
eb90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eba0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ebb0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
ebc0: 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e  SION.  Tcl_Appen
ebd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ebe0: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
ebf0: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
ec00: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20  xtension()");.  
ec10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ec20: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
ec30: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
ec40: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66  tension(db, onof
ec50: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  f);.  return TCL
ec60: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
ec70: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
ec80: 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20  ite_abort.**.** 
ec90: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f  Shutdown the pro
eca0: 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  cess immediately
ecb0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  .  This is not a
ecc0: 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e   clean shutdown.
ecd0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
ece0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
ecf0: 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c   the recoverabil
ed00: 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ity of a databas
ed10: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e  e in.** the even
ed20: 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63  t of a program c
ed30: 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rash..*/.static 
ed40: 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  int sqlite_abort
ed50: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
ed60: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
ed70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
ed80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
ed90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
eda0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
edb0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
edc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
edd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ede0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ee00: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
ee10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
ee20: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
ee30: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
ee40: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
ee50: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
ee60: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
ee70: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
ee80: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
ee90: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
eea0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
eeb0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
eec0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
eed0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
eee0: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
eef0: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
ef00: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
ef10: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
ef20: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
ef30: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ef40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
ef50: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
ef60: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
ef70: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
ef80: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
ef90: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
efa0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
efb0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
efc0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
efd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
efe0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
eff0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
f000: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
f010: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
f020: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f030: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
f040: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f050: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
f060: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
f070: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
f080: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
f090: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
f0a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f0b0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
f0c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
f0d0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
f0e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f0f0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f100: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
f110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f120: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
f130: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
f140: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
f150: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
f160: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f170: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
f180: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f190: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
f1b0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f1c0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
f1d0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
f1e0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
f1f0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
f200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f210: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
f220: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f230: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f240: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
f250: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
f260: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
f270: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f280: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f290: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
f2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f2b0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
f2c0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
f2d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f2e0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f2f0: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
f300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f310: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
f320: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
f330: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
f340: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
f350: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
f360: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
f370: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f380: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
f390: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
f3a0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
f3b0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
f3c0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
f3d0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
f3e0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
f3f0: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
f400: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
f410: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
f420: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
f430: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
f440: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
f450: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
f460: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
f470: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
f480: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
f490: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
f4a0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
f4b0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
f4c0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
f4d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f4e0: 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a  _register_func(.
f4f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
f500: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f510: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
f520: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
f530: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
f540: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
f550: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
f560: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f570: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
f580: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
f590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
f5a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
f5b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
f5c0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
f5d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
f5e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f5f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f600: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f610: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
f620: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
f630: 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d   DB FUNCTION-NAM
f640: 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
f650: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f660: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
f670: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
f680: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
f690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f6a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
f6b0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
f6c0: 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
f6d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a  QLITE_UTF8, 0, .
f6e0: 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20        testFunc, 
f6f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
f700: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
f710: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f720: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
f730: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
f740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f750: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
f760: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
f770: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
f780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f790: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f7b0: 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  :  sqlite3_final
f7c0: 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ize  STMT .**.**
f7d0: 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74   Finalize a stat
f7e0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
f7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f800: 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69  _finalize(.  voi
f810: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f820: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f830: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f840: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f850: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
f860: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
f870: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
f880: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
f890: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
f8a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f8b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f8c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f8d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
f8e0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
f8f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f900: 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
f910: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f920: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f930: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f940: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f950: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f960: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f980: 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  R;..  if( pStmt 
f990: 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d 74  ){.    db = Stmt
f9a0: 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d  ToDb(pStmt);.  }
f9b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f9c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
f9d0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
f9e0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
f9f0: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
fa00: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
fa10: 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74   if( db && sqlit
fa20: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
fa30: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
fa40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fa50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
fa60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
fa70: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
fa80: 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20 20 43  _status  STMT  C
fa90: 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47 0a 2a  ODE  RESETFLAG.*
faa0: 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76 61 6c  *.** Get the val
fab0: 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20 63  ue of a status c
fac0: 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20 73 74  ounter from a st
fad0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
fae0: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
faf0: 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20  _status(.  void 
fb00: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
fb10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fb20: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
fb30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
fb40: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
fb50: 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 69   iValue;.  int i
fb60: 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 3b  , op, resetFlag;
fb70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fb80: 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  OpName;.  sqlite
fb90: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
fba0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
fbb0: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
fbc0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
fbd0: 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61     int op;.  } a
fbe0: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  Op[] = {.    { "
fbf0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fc00: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22  S_FULLSCAN_STEP"
fc10: 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  ,   SQLITE_STMTS
fc20: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
fc30: 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  TEP   },.    { "
fc40: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fc50: 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20  S_SORT",        
fc60: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fc70: 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20  TATUS_SORT      
fc80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
fc90: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fca0: 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20  S_AUTOINDEX",   
fcb0: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fcc0: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20  TATUS_AUTOINDEX 
fcd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
fce0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fcf0: 53 5f 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20  S_VM_STEP",     
fd00: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fd10: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20  TATUS_VM_STEP   
fd20: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
fd30: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
fd40: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fd50: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
fd60: 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d  bjv, "STMT PARAM
fd70: 45 54 45 52 20 52 45 53 45 54 46 4c 41 47 22 29  ETER RESETFLAG")
fd80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fd90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
fda0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
fdb0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
fdc0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
fdd0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
fde0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
fdf0: 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  OpName = Tcl_Get
fe00: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
fe10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
fe20: 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b  raySize(aOp); i+
fe30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
fe40: 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  mp(aOp[i].zName,
fe50: 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a   zOpName)==0 ){.
fe60: 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69        op = aOp[i
fe70: 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61  ].op;.      brea
fe80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
fe90: 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( i>=ArraySize(
fea0: 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  aOp) ){.    if( 
feb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
fec0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
fed0: 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e  ], &op) ) return
fee0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fef0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
ff00: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
ff10: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65  rp, objv[3], &re
ff20: 73 65 74 46 6c 61 67 29 20 29 20 72 65 74 75 72  setFlag) ) retur
ff30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ff40: 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  Value = sqlite3_
ff50: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
ff60: 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67  t, op, resetFlag
ff70: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
ff80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
ff90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c  l_NewIntObj(iVal
ffa0: 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ue));.  return T
ffb0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ffc0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
ffd0: 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20 53  next_stmt  DB  S
ffe0: 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
fff0: 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d 65   the next statme
10000 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20 61  nt in sequence a
10010 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  fter STMT..*/.st
10020 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6e 65  atic int test_ne
10030 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20  xt_stmt(.  void 
10040 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10050 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10060 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10070 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10080 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
10090 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
100a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
100b0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
100c0 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  [50];..  if( obj
100d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
100e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
100f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10100 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10110 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
10120 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
10130 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
10140 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  B STMT", 0);.   
10150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10160 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10170 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
10180 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10190 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
101a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
101b0 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
101c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
101d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
101e0 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[2]), &pStmt)
101f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10200 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73  ROR;.  pStmt = s
10210 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74  qlite3_next_stmt
10220 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69  (db, pStmt);.  i
10230 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
10240 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
10250 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
10260 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
10270 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
10280 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
10290 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
102a0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
102b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
102c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
102d0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
102e0 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54 0a  _readonly  STMT.
102f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
10300 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20 4e  e if STMT is a N
10310 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20 61  ULL pointer or a
10320 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
10330 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  atement.** that 
10340 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
10350 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
10360 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a  ase unmodified..
10370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10380 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  st_stmt_readonly
10390 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
103a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
103b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
103c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
103d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
103e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
103f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
10400 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
10410 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10420 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10430 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10440 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10450 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10460 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10470 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
10480 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
10490 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
104a0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
104b0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
104c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
104d0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
104e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
104f0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
10500 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  te3_stmt_readonl
10510 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  y(pStmt);.  Tcl_
10520 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10530 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
10540 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  eanObj(rc));.  r
10550 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10560 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
10570 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
10580 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
10590 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54  urn true if STMT
105a0 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70   is a non-NULL p
105b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74  ointer to a stat
105c0 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68 61  ement.** that ha
105d0 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20 62  s been stepped b
105e0 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c 65  ut not to comple
105f0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10600 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 62 75  int test_stmt_bu
10610 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sy(.  void * cli
10620 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10630 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10640 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10650 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10660 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
10670 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
10680 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
10690 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
106a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
106b0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
106c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
106d0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
106e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
106f0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10700 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
10710 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10720 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
10730 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
10740 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10750 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
10760 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
10770 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
10780 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
10790 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
107a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
107b0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
107c0 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  nObj(rc));.  ret
107d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
107e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73 65  *.** Usage:  use
107f0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20  s_stmt_journal  
10800 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10810 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 75  n true if STMT u
10820 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ses a statement 
10830 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
10840 69 63 20 69 6e 74 20 75 73 65 73 5f 73 74 6d 74  ic int uses_stmt
10850 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64  _journal(.  void
10860 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10870 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10880 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10890 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
108a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
108b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
108c0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
108d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
108e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
108f0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10900 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
10910 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
10920 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10930 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
10940 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
10950 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10960 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
10970 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10980 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10990 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
109a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
109b0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  R;.  sqlite3_stm
109c0 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74  t_readonly(pStmt
109d0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
109e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
109f0 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
10a00 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d  ((Vdbe *)pStmt)-
10a10 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
10a20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
10a30 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
10a40 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
10a50 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a  eset  STMT .**.*
10a60 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d  * Reset a statem
10a70 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
10a80 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
10a90 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
10aa0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10ab0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10ac0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10ad0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10ae0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10af0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10b00 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10b10 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10b20 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10b30 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10b40 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10b50 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10b60 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10b70 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10b80 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
10b90 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10ba0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10bb0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
10bc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
10bd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
10be0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
10bf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
10c00 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
10c10 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
10c20 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 54  Stmt && sqlite3T
10c30 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
10c40 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
10c50 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20 72  t), rc) ){.    r
10c60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10c70 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
10c80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
10c90 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
10ca0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
10cb0 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20 29  );./*.  if( rc )
10cc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
10cd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20  _ERROR;.  }.*/. 
10ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
10d00 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64   sqlite3_expired
10d10 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74   STMT .**.** Ret
10d20 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72 65  urn TRUE if a re
10d30 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74  compilation of t
10d40 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
10d50 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a  recommended..*/.
10d60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10d70 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
10d80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10d90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10da0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10db0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10dc0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
10dd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10de0 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
10df0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
10e00 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10e10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10e20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10e30 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10e40 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10e50 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10e60 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10e70 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
10e80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10e90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10ea0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10eb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10ec0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10ed0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10ee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ef0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
10f00 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
10f10 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71  NewBooleanObj(sq
10f20 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53  lite3_expired(pS
10f30 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tmt)));.#endif. 
10f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10f50 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
10f60 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
10f70 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
10f80 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
10f90 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
10fa0 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
10fb0 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
10fc0 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
10fd0 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f  t test_transfer_
10fe0 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  bind(.  void * c
10ff0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11000 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11010 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11020 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11030 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
11040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
11050 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33  ECATED.  sqlite3
11060 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a  _stmt *pStmt1, *
11070 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62  pStmt2;.  if( ob
11080 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
11090 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
110a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
110b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
110c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
110d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
110e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
110f0 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d  FROM-STMT TO-STM
11100 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
11110 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11120 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
11130 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11140 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11150 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29  v[1]), &pStmt1))
11160 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11170 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
11180 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
111a0 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29  jv[2]), &pStmt2)
111b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
111c0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
111d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
111e0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
111f0 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  bj(sqlite3_trans
11200 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74  fer_bindings(pSt
11210 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23  mt1,pStmt2)));.#
11220 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
11230 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11240 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
11250 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a  changes DB.**.**
11260 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
11270 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61  er of changes ma
11280 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
11290 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20 53  se by the last S
112a0 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e  QL.** execution.
112b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
112c0 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76  est_changes(.  v
112d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
112e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
112f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
11300 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
11310 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11320 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
11330 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
11340 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11350 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
11360 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
11370 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
11380 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11390 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
113a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
113b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
113c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
113d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
113e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
113f0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
11400 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
11410 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11420 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
11430 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  bj(sqlite3_chang
11440 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75  es(db)));.  retu
11450 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
11460 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
11470 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  "static_bind_val
11480 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c  ue" that variabl
11490 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20  es are bound to 
114a0 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47  when.** the FLAG
114b0 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74   option of sqlit
114c0 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74  e3_bind is "stat
114d0 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ic".*/.static ch
114e0 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69  ar *sqlite_stati
114f0 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30  c_bind_value = 0
11500 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  ;.static int sql
11510 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11520 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  nbyte = 0;../*.*
11530 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
11540 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20  3_bind  VM  IDX 
11550 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a   VALUE  FLAGS.**
11560 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c  .** Sets the val
11570 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68  ue of the IDX-th
11580 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 22   occurrence of "
11590 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ?" in the origin
115a0 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67  al SQL.** string
115b0 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20  .  VALUE is the 
115c0 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46  new value.  If F
115d0 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65  LAGS=="null" the
115e0 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67  n VALUE is.** ig
115f0 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61  nored and the va
11600 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  lue is set to NU
11610 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  LL.  If FLAGS=="
11620 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20  static" then.** 
11630 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74  the value is set
11640 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
11650 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62   a static variab
11660 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c  le named.** "sql
11670 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
11680 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47  value".  If FLAG
11690 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e  S=="normal" then
116a0 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68   a copy.** of th
116b0 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e  e VALUE is made.
116c0 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f    If FLAGS=="blo
116d0 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55  b10" then a VALU
116e0 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  E is ignored.** 
116f0 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f  an a 10-byte blo
11700 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30  b "abc\000xyz\00
11710 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64  0pq" is inserted
11720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11730 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69  test_bind(.  voi
11740 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
11750 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11760 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
11770 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
11780 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
11790 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
117a0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
117b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
117c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
117d0 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
117e0 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
117f0 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
11800 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
11810 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
11820 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
11830 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b    if( argc!=5 ){
11840 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
11850 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11860 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
11870 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
11880 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 56  [0], .       " V
11890 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75 6c  M IDX VALUE (nul
118a0 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29  l|static|normal)
118b0 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
118c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
118d0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
118e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
118f0 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29  argv[1], &pStmt)
11900 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11910 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
11920 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
11930 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  gv[2], &idx) ) r
11940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11950 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
11960 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30  gv[4],"null")==0
11970 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11980 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
11990 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65  Stmt, idx);.  }e
119a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
119b0 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22 29  rgv[4],"static")
119c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
119d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
119e0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
119f0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
11a00 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a  _value, -1, 0);.
11a10 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11a20 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74  mp(argv[4],"stat
11a30 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20 29  ic-nbytes")==0 )
11a40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
11a50 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
11a60 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
11a70 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11a80 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11ab0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
11ac0 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20  te, 0);.  }else 
11ad0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
11ae0 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20  4],"normal")==0 
11af0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11b00 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11b10 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b 33  tmt, idx, argv[3
11b20 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ], -1, SQLITE_TR
11b30 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73  ANSIENT);.  }els
11b40 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
11b50 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d  v[4],"blob10")==
11b60 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
11b70 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
11b80 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62 63  pStmt, idx, "abc
11b90 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c 20  \000xyz\000pq", 
11ba0 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  10, SQLITE_STATI
11bb0 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  C);.  }else{.   
11bc0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11bd0 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20 61  t(interp, "4th a
11be0 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
11bf0 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22 6e  e ".        "\"n
11c00 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74 69  ull\" or \"stati
11c10 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c  c\" or \"normal\
11c20 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
11c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11c40 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
11c50 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
11c60 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
11c70 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
11c80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
11c90 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72  ( rc ){.    char
11ca0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
11cb0 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25  printf(zBuf, "(%
11cc0 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
11cd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11ce0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
11cf0 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
11d00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11d10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11d30 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
11d40 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
11d50 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
11d60 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70  st_collate <db p
11d70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
11d80 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
11d90 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11da0 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
11db0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
11dc0 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
11dd0 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  ct collation.** 
11de0 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63  sequence callbac
11df0 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
11e00 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
11e10 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
11e20 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
11e30 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
11e40 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
11e50 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74  tine registers t
11e60 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
11e70 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c  uence "test_coll
11e80 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74  ate".** with dat
11e90 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62  abase handle <db
11ea0 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  >. The second ar
11eb0 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61  gument must be a
11ec0 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a   list of three.*
11ed0 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
11ee0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69  . If the first i
11ef0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76  s true, then a v
11f00 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63  ersion of test_c
11f10 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67  ollate is.** reg
11f20 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
11f30 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  8, if the second
11f40 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73   is true, a vers
11f50 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
11f60 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c  d for.** UTF-16l
11f70 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  e, if the third 
11f80 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31  is true, a UTF-1
11f90 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61  6be version is a
11fa0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65  vailable..** Pre
11fb0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
11fc0 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61  f test_collate a
11fd0 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
11fe0 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
11ff0 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f  sequence test_co
12000 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65  llate is impleme
12010 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  nted by calling 
12020 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
12030 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a   TCL script:.**.
12040 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61  **   "test_colla
12050 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c  te <enc> <lhs> <
12060 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rhs>".**.** The 
12070 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20  <lhs> and <rhs> 
12080 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
12090 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65  es being compare
120a0 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  d, encoded in UT
120b0 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63  F-8..** The <enc
120c0 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  > parameter is t
120d0 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
120e0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
120f0 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51  ction that.** SQ
12100 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f  Lite selected to
12110 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74   call. The TCL t
12120 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65  est script imple
12130 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65  ments the.** "te
12140 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63  st_collate" proc
12150 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
12160 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79  t this will only
12170 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69   work with one i
12180 6e 74 65 70 72 65 74 65 72 20 61 74 20 61 20 74  ntepreter at a t
12190 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69  ime, as the.** i
121a0 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74 6f  nterp pointer to
121b0 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75 61   use when evalua
121c0 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63 72  ting the TCL scr
121d0 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ipt is stored in
121e0 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  .** pTestCollate
121f0 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69  Interp..*/.stati
12200 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54  c Tcl_Interp* pT
12210 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
12220 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ;.static int tes
12230 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  t_collate_func(.
12240 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
12250 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
12260 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
12270 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
12280 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  B.){.  Tcl_Inter
12290 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c  p *i = pTestColl
122a0 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74  ateInterp;.  int
122b0 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f   encin = SQLITE_
122c0 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29  PTR_TO_INT(pCtx)
122d0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69  ;.  int res;.  i
122e0 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33  nt n;..  sqlite3
122f0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
12300 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20  Tcl_Obj *pX;..  
12310 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  pX = Tcl_NewStri
12320 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c  ngObj("test_coll
12330 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ate", -1);.  Tcl
12340 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
12350 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65 6e  );..  switch( en
12360 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65 20  cin ){.    case 
12370 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20 20  SQLITE_UTF8:.   
12380 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
12390 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
123a0 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
123b0 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a  j("UTF-8",-1));.
123c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
123d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
123e0 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16LE:.      Tcl_
123f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12400 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
12410 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
12420 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16LE",-1));.    
12430 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
12440 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  e SQLITE_UTF16BE
12450 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
12460 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12470 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
12480 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
12490 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
124a0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
124b0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
124c0 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
124d0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
124e0 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  oc();.  pVal = s
124f0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
12500 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29 7b  );.  if( pVal ){
12510 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12520 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 41  eSetStr(pVal, nA
12530 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zA, encin, SQL
12540 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
12550 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
12560 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
12570 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12580 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12590 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e  X,.        Tcl_N
125a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
125b0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
125c0 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
125d0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
125e0 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e 42  eSetStr(pVal, nB
125f0 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c  , zB, encin, SQL
12600 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
12610 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   n = sqlite3_val
12620 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b 0a  ue_bytes(pVal);.
12630 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
12640 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
12650 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4e  X,.        Tcl_N
12660 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
12670 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
12680 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b  _text(pVal),n));
12690 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
126a0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d  eFree(pVal);.  }
126b0 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e  .  sqlite3EndBen
126c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
126d0 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c  Tcl_EvalObjEx(i,
126e0 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
126f0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
12700 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  .  Tcl_GetIntFro
12710 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f  mObj(i, Tcl_GetO
12720 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72 65  bjResult(i), &re
12730 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  s);.  return res
12740 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
12750 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
12760 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12770 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12780 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12790 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
127a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
127b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
127c0 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
127d0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
127e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
127f0 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
12800 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
12810 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
12820 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
12830 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
12840 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
12850 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
12860 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12870 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
12880 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
12890 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
128a0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
128b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
128c0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
128d0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
128e0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
128f0 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
12900 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
12910 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
12920 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
12930 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
12940 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12950 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
12960 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
12970 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
12980 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
12990 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
129a0 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
129b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
129c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
129d0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
129e0 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
129f0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
12a00 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
12a10 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
12a20 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
12a30 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12a40 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
12a50 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
12a60 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
12a70 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
12a80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12a90 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
12aa0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
12ab0 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
12ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
12ad0 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
12ae0 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
12af0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12b00 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
12b10 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
12b20 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
12b30 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
12b40 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
12b50 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
12b60 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
12b70 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
12b80 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
12b90 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
12ba0 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
12bb0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
12bc0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
12bd0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12be0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
12bf0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
12c00 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12c10 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
12c20 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
12c30 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
12c40 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
12c50 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
12c60 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
12c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
12c80 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
12c90 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
12ca0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
12cb0 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
12cc0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
12cd0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
12ce0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
12cf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
12d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12d10 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
12d20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
12d30 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
12d40 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
12d50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12d60 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
12d70 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
12d80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
12d90 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
12da0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
12db0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
12dc0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12dd0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12de0 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
12df0 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
12e00 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
12e10 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
12e20 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
12e30 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
12e40 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a 2a 2a  late <db ptr>.**
12e50 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d 31 36  .** Add a utf-16
12e60 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
12e70 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66 31 36  nce named "utf16
12e80 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61 74 61  bin" to the data
12e90 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20  base.** handle. 
12ea0 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
12eb0 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72 65 73  equence compares
12ec0 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68   arguments in th
12ed0 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68  e same way as th
12ee0 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63 6f  e.** built-in co
12ef0 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72 79 22  llation "binary"
12f00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f10 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
12f20 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
12f30 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
12f40 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
12f50 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
12f60 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
12f70 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 28 6e  .  int nCmp = (n
12f80 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41 29 3b  A>nB ? nB : nA);
12f90 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
12fa0 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70  cmp(zA, zB, nCmp
12fb0 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  );.  if( res==0 
12fc0 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e 42 3b  ) res = nA - nB;
12fd0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12ff0 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
13000 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
13010 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
13020 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13030 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13040 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13050 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
13060 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
13070 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
13080 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
13090 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
130a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
130b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
130c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
130d0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
130e0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
130f0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13100 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c 49 54  utf16bin", SQLIT
13110 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20 20 20  E_UTF16, 0, .   
13120 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e     test_utf16bin
13130 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20 20  _collate_func.  
13140 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
13150 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
13160 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
13170 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13180 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13190 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
131a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
131b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
131c0 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  "DB");.  return 
131d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
131e0 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c  .** When the col
131f0 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61  lation needed ca
13200 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
13210 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61  d, record the na
13220 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65  me of .** the re
13230 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e  quested collatin
13240 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e  g function here.
13250 20 20 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e    The recorded n
13260 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a  ame is linked.**
13270 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62   to a TCL variab
13280 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d  le and used to m
13290 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
132a0 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
132b0 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73  ation.** name is
132c0 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61   correct..*/.sta
132d0 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64  tic char zNeeded
132e0 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a  Collation[200];.
132f0 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e  static char *pzN
13300 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d  eededCollation =
13310 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
13320 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65  n;.../*.** Calle
13330 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69  d when a collati
13340 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e  ng sequence is n
13350 65 65 64 65 64 2e 20 20 52 65 67 69 73 74 65 72  eeded.  Register
13360 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
13370 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
13380 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61  eded16()..*/.sta
13390 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f  tic void test_co
133a0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28  llate_needed_cb(
133b0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
133c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
133d0 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20   int eTextRep,. 
133e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61   const void *pNa
133f0 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20  me.){.  int enc 
13400 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74  = ENC(db);.  int
13410 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
13420 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29   for(z = (char*)
13430 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c  pName, i=0; *z |
13440 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20  | z[1]; z++){.  
13450 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64    if( *z ) zNeed
13460 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d  edCollation[i++]
13470 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65   = *z;.  }.  zNe
13480 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d  ededCollation[i]
13490 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
134a0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
134b0 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65 73  (.      db, "tes
134c0 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28  t_collate", ENC(
134d0 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  db), SQLITE_INT_
134e0 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74 65 73  TO_PTR(enc), tes
134f0 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b  t_collate_func);
13500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
13510 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74   add_test_collat
13520 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73  e_needed DB.*/.s
13530 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
13540 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20  ollate_needed(. 
13550 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
13560 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
13570 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
13580 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
13590 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
135a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
135b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
135c0 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20   objc!=2 ) goto 
135d0 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
135e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
135f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13600 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
13610 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13620 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
13630 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
13640 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74  eeded16(db, 0, t
13650 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13660 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65  ed_cb);.  zNeede
13670 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20  dCollation[0] = 
13680 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  0;.  if( sqlite3
13690 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
136a0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
136b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
136c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
136d0 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63  ..bad_args:.  Tc
136e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
136f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
13700 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  "DB");.  return 
13710 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
13720 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64  .** tclcmd:   ad
13730 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
13740 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a  _collations  DB.
13750 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65  **.** Add two ne
13760 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  w collating sequ
13770 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74  ences to the dat
13780 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20  abase DB.**.**  
13790 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64     utf16_aligned
137a0 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e  .**     utf16_un
137b0 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f  aligned.**.** Bo
137c0 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  th collating seq
137d0 75 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73  uences use the s
137e0 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61  ame sort order a
137f0 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65  s BINARY..** The
13800 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65   only difference
13810 20 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66   is that the utf
13820 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61  16_aligned colla
13830 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
13840 20 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74   is declared wit
13850 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46  h the SQLITE_UTF
13860 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e  16_ALIGNED flag.
13870 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69  .** Both collati
13880 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63  ng functions inc
13890 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69  rement the unali
138a0 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74  gned utf16 count
138b0 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74  er.** whenever t
138c0 68 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67  hey see a string
138d0 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20   that begins on 
138e0 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e  an odd byte boun
138f0 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dary..*/.static 
13900 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  int unaligned_st
13910 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30  ring_counter = 0
13920 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69  ;.static int ali
13930 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a  gnmentCollFunc(.
13940 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
13950 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
13960 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
13970 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
13980 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
13990 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a  ){.  int rc, n;.
139a0 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79    n = nKey1<nKey
139b0 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79  2 ? nKey1 : nKey
139c0 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30  2;.  if( nKey1>0
139d0 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54   && 1==(1&(SQLIT
139e0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65  E_PTR_TO_INT(pKe
139f0 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65  y1))) ) unaligne
13a00 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
13a10 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e  ++;.  if( nKey2>
13a20 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49  0 && 1==(1&(SQLI
13a30 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b  TE_PTR_TO_INT(pK
13a40 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67 6e  ey2))) ) unalign
13a50 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13a60 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63  r++;.  rc = memc
13a70 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c  mp(pKey1, pKey2,
13a80 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30   n);.  if( rc==0
13a90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65   ){.    rc = nKe
13aa0 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a  y1 - nKey2;.  }.
13ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
13ac0 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f 61 6c  tatic int add_al
13ad0 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
13ae0 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20  lations(.  void 
13af0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13b00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13b10 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13b20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13b30 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13b40 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
13b50 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69  objc>=2 ){.    i
13b60 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
13b70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13b80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13b90 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
13ba0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c  L_ERROR;.    sql
13bb0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13bc0 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36  ation(db, "utf16
13bd0 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c  _unaligned", SQL
13be0 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20 20  ITE_UTF16, .    
13bf0 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74      0, alignment
13c00 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73  CollFunc);.    s
13c10 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
13c20 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
13c30 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c  16_aligned", SQL
13c40 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
13c50 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20 61  D, .        0, a
13c60 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63  lignmentCollFunc
13c70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13c80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
13c90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
13ca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
13cb0 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  6) */../*.** Usa
13cc0 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66 75 6e  ge: add_test_fun
13cd0 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c  ction <db ptr> <
13ce0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
13cf0 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20  <utf16be>.**.** 
13d00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
13d10 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68   used to test th
13d20 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  at SQLite select
13d30 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 75 73  s the correct us
13d40 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63  er.** function c
13d50 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c  allback when mul
13d60 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28  tiple versions (
13d70 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65  for different te
13d80 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a  xt encodings).**
13d90 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a   are available..
13da0 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
13db0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73  is routine regis
13dc0 74 65 72 73 20 75 70 20 74 6f 20 74 68 72 65 65  ters up to three
13dd0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
13de0 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a   user function.*
13df0 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  * "test_function
13e00 22 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  " with database 
13e10 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66  handle <db>.  If
13e20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13e30 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c  ment is.** true,
13e40 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20   then a version 
13e50 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  of test_function
13e60 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
13e70 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65  or UTF-8, if the
13e80 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74 72 75  .** third is tru
13e90 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20  e, a version is 
13ea0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
13eb0 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20  TF-16le, if the 
13ec0 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74 72 75  fourth is.** tru
13ed0 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65  e, a UTF-16be ve
13ee0 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
13ef0 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20 76 65  le.  Previous ve
13f00 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73  rsions of.** tes
13f10 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 64  t_function are d
13f20 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
13f30 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
13f40 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
13f50 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f  y calling the fo
13f60 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69  llowing TCL scri
13f70 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73  pt:.**.**   "tes
13f80 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e  t_function <enc>
13f90 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68   <arg>".**.** Wh
13fa0 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65  ere <enc> is one
13fb0 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46 2d 31   of UTF-8, UTF-1
13fc0 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45 2c 20  6LE or UTF16BE, 
13fd0 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74 68 65  and <arg> is the
13fe0 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d  .** single argum
13ff0 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
14000 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20  e SQL function. 
14010 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
14020 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c  ed by.** the TCL
14030 20 73 63 72 69 70 74 20 69 73 20 75 73 65 64 20   script is used 
14040 61 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  as the return va
14050 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c 20 66  lue of the SQL f
14060 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69  unction. It.** i
14070 73 20 70 61 73 73 65 64 20 74 6f 20 53 51 4c 69  s passed to SQLi
14080 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31 36 42  te using UTF-16B
14090 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20 74 65  E for a UTF-8 te
140a0 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55  st_function(), U
140b0 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54  TF-8.** for a UT
140c0 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75 6e 63  F-16LE test_func
140d0 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d  tion(), and UTF-
140e0 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c  16LE for an impl
140f0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
14100 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46 2d 31  ** prefers UTF-1
14110 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  6BE..*/.#ifndef 
14120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
14130 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  6.static void te
14140 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
14150 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
14160 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
14170 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
14180 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
14190 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
141a0 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
141b0 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
141c0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
141d0 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
141e0 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
141f0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
14200 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
14210 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
14220 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
14230 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
14240 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
14250 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14260 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
14270 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
14280 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54  TF-8", -1));.  T
14290 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
142a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
142b0 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
142c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
142d0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
142e0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
142f0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
14300 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
14310 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
14320 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14330 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14340 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f 47 65  ext(pCtx, Tcl_Ge
14350 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
14360 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54  terp), -1, SQLIT
14370 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14380 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
14390 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
143a0 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
143b0 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
143c0 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
143d0 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
143e0 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
143f0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
14400 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14410 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
14420 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 62  e3_value_text16b
14430 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
14440 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14450 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
14460 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
14470 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
14480 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
14490 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6le(.  sqlite3_c
144a0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
144b0 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
144c0 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
144d0 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
144e0 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
144f0 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
14500 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
14510 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
14520 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
14530 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
14540 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
14550 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
14560 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
14570 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
14580 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
14590 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
145a0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
145b0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
145c0 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29  ("UTF-16LE", -1)
145d0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
145e0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
145f0 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
14600 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14610 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
14620 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
14630 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
14640 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
14650 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
14660 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
14670 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
14680 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
14690 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
146a0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
146b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
146c0 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
146d0 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
146e0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
146f0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14700 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63 68 61  t_text(pCtx,(cha
14710 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
14720 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53  _text(pVal),-1,S
14730 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14740 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14750 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
14760 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
14770 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 28  unction_utf16be(
14780 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
14790 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
147a0 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
147b0 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
147c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
147d0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
147e0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
147f0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
14800 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
14810 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
14820 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
14830 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
14840 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
14850 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
14860 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14870 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
14880 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14890 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
148a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
148b0 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16BE", -1));. 
148c0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
148d0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
148e0 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
148f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
14900 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
14910 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
14920 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
14930 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
14940 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
14950 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14960 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
14970 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
14980 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
14990 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
149a0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
149b0 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
149c0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
149d0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
149e0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
149f0 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c 69 74  xt16(pCtx, sqlit
14a00 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
14a10 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
14a20 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14a30 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
14a40 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28  result_text16be(
14a50 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14a60 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14a70 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14a80 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14a90 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14aa0 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78 2c  t_text16le(pCtx,
14ab0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
14ac0 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20  ext16le(pVal),. 
14ad0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
14ae0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14af0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
14b00 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Val);.}.#endif /
14b10 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
14b20 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  F16 */.static in
14b30 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  t test_function(
14b40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
14b50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
14b60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
14b70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
14b80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
14b90 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14ba0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
14bb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
14bc0 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62  t val;..  if( ob
14bd0 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64  jc!=5 ) goto bad
14be0 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
14bf0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
14c00 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14c10 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
14c20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14c30 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b  R;..  if( TCL_OK
14c40 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
14c50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14c60 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29  objv[2], &val) )
14c70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14c80 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
14c90 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14ca0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
14cb0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
14cc0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
14cd0 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
14ce0 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
14cf0 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  utf8, 0, 0);.  }
14d00 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
14d10 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
14d20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14d30 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
14d40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14d50 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
14d60 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14d70 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
14d80 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
14d90 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
14da0 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
14db0 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
14dc0 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a  utf16le, 0, 0);.
14dd0 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
14de0 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
14df0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14e00 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29  objv[4], &val) )
14e10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14e20 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
14e30 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14e40 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
14e50 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
14e60 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
14e70 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  BE, .        int
14e80 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
14e90 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20 30  on_utf16be, 0, 0
14ea0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
14eb0 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67   TCL_OK;.bad_arg
14ec0 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
14ed0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
14ee0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
14ef0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
14f00 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
14f10 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
14f20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
14f30 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
14f40 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64  16be>", 0);.#end
14f50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
14f60 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
14f70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
14f80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
14f90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74         sqlite3_t
14fa0 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72 20  est_errstr <err 
14fb0 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  code>.**.** Test
14fc0 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69 73   that the englis
14fd0 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69 6e  h language strin
14fe0 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66 6f  g equivalents fo
14ff0 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  r sqlite error c
15000 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65  odes.** are sane
15010 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
15020 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65  is an integer re
15030 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73 71  presenting an sq
15040 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  lite error code.
15050 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20 69  .** The result i
15060 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f 20  s a list of two 
15070 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73 74  elements, the st
15080 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
15090 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72  ion of the.** er
150a0 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68 65  ror code and the
150b0 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   english languag
150c0 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a  e explanation..*
150d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
150e0 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64  t_errstr(.  void
150f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15100 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15110 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15120 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15130 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
15140 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74  ar *zCode;.  int
15150 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   i;.  if( objc!=
15160 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
15170 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
15180 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72  , 1, objv, "<err
15190 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a  or code>");.  }.
151a0 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47  .  zCode = Tcl_G
151b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
151c0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
151d0 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  200; i++){.    i
151e0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45  f( 0==strcmp(t1E
151f0 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f  rrorName(i), zCo
15200 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  de) ) break;.  }
15210 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
15220 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
15230 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  )sqlite3ErrStr(i
15240 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
15250 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15260 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b   Usage:    break
15270 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  point.**.** This
15280 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20   routine exists 
15290 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20  for one purpose 
152a0 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70  - to provide a p
152b0 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a  lace to put a.**
152c0 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68   breakpoint with
152d0 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65   GDB that can be
152e0 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67   triggered using
152f0 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20   TCL code.  The 
15300 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20  use.** for this 
15310 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63  is when a partic
15320 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20  ular test fails 
15330 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38  on (say) the 148
15340 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a  5th iteration..*
15350 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73  * In the TCL tes
15360 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e  t script, we can
15370 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74   add code like t
15380 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69  his:.**.**     i
15390 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65  f {$i==1485} bre
153a0 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
153b0 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75  en run testfixtu
153c0 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67  re in the debugg
153d0 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20  er and wait for 
153e0 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74  the breakpoint t
153f0 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e  o.** fire.  Then
15400 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61   additional brea
15410 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73  kpoints can be s
15420 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e  et to trace down
15430 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61   the bug..*/.sta
15440 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72 65  tic int test_bre
15450 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20  akpoint(.  void 
15460 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
15470 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
15480 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
15490 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
154a0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
154b0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
154c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
154d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
154e0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
154f0 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
15500 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
15510 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
15520 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {.  return TCL_O
15530 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  K;         /* Do
15540 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   nothing */.}../
15550 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
15560 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
15570 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a  lob  STMT IDX N.
15580 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15590 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
155a0 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20  blob interface. 
155b0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
155c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
155d0 2a 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64  * IDX is the ind
155e0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
155f0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
15600 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
15610 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
15620 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f  ds a N-byte zero
15630 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20  -filled BLOB to 
15640 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  the wildcard..*/
15650 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15660 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a  _bind_zeroblob(.
15670 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15680 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15690 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
156a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
156b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
156c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
156d0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
156e0 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  dx;.  int n;.  i
156f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
15700 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
15710 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15720 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15730 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20  STMT IDX N");.  
15740 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15750 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
15760 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
15770 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15780 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15790 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
157a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
157b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
157c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
157d0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
157e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
157f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15800 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15810 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75  v[3], &n) ) retu
15820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
15830 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
15840 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d  nd_zeroblob(pStm
15850 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66  t, idx, n);.  if
15860 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
15870 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
15880 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
15890 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
158a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
158b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
158c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
158d0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
158e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
158f0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
15900 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d  e3_bind_int  STM
15910 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
15920 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15930 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66  _bind_int interf
15940 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
15950 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15960 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
15970 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
15980 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
15990 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
159a0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
159b0 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69  binds a 32-bit i
159c0 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
159d0 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
159e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
159f0 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f  t_bind_int(.  vo
15a00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15a10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15a20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15a30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15a40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15a50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15a60 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
15a70 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69    int value;.  i
15a80 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
15a90 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
15aa0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15ab0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
15ac0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
15ad0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
15ae0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
15af0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
15b00 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
15b10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
15b20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15b30 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
15b40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15b50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15b60 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15b70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15b80 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15b90 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15ba0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
15bb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15bc0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15bd0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15be0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
15bf0 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
15c00 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15c10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
15c20 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
15c30 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
15c40 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
15c50 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
15c60 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
15c70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15c80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15c90 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
15ca0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15cb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15cc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
15cd0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
15ce0 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
15cf0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15d00 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15d10 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
15d20 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
15d30 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15d40 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
15d50 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
15d60 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
15d70 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
15d80 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
15d90 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
15da0 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
15db0 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
15dc0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
15dd0 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  ind_int64(.  voi
15de0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15df0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15e00 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15e10 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15e20 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15e30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
15e40 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
15e50 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c   Tcl_WideInt val
15e60 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
15e70 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15e80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15e90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15ea0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15eb0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
15ec0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15ed0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
15ee0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
15ef0 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
15f00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15f10 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15f20 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15f30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15f40 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15f50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15f60 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
15f70 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15f80 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15f90 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
15fa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
15fb0 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
15fc0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15fd0 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
15fe0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15ff0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16000 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
16010 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b  mt, idx, value);
16020 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16030 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16040 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16050 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16060 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16070 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16080 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16090 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
160a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
160b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
160c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
160d0 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c  uble  STMT N VAL
160e0 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
160f0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  e sqlite3_bind_d
16100 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e  ouble interface.
16110 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
16120 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
16130 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
16140 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
16150 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
16160 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
16170 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
16180 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
16190 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
161a0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
161b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
161c0 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  nd_double(.  voi
161d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
161e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
161f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16200 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16210 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16220 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16230 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
16240 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a 20   double value;. 
16250 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
16260 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69   char *zVal;.  i
16270 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63  nt i;.  static c
16280 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
16290 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
162a0 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame;     /* Name
162b0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
162c0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
162d0 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69  alue */.    unsi
162e0 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b  gned int iUpper;
162f0 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62     /* Upper 32 b
16300 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  its */.    unsig
16310 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20  ned int iLower; 
16320 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69    /* Lower 32 bi
16330 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69  ts */.  } aSpeci
16340 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  alFp[] = {.    {
16350 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78    "NaN",      0x
16360 37 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66  7fffffff, 0xffff
16370 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
16380 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66  SNaN",     0x7ff
16390 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  7ffff, 0xfffffff
163a0 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  f },.    {  "-Na
163b0 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66  N",     0xffffff
163c0 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
163d0 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22  ,.    {  "-SNaN"
163e0 2c 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c  ,    0xfff7ffff,
163f0 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
16400 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20     {  "+Inf",   
16410 20 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78    0x7ff00000, 0x
16420 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
16430 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30  {  "-Inf",     0
16440 78 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30  xfff00000, 0x000
16450 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20  00000 },.    {  
16460 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30  "Epsilon",  0x00
16470 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
16480 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45  01 },.    {  "-E
16490 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30  psilon", 0x80000
164a0 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20  000, 0x00000001 
164b0 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22  },.    {  "NaN0"
164c0 2c 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30  ,     0x7ff80000
164d0 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
164e0 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20      {  "-NaN0", 
164f0 20 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30     0xfff80000, 0
16500 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d  x00000000 },.  }
16510 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
16520 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16530 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16540 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16550 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
16560 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16570 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16580 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16590 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
165a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
165b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
165c0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
165d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
165e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
165f0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16600 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16610 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16620 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
16630 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
16640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
16650 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65  /* Intercept the
16660 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e   string "NaN" an
16670 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e  d generate a NaN
16680 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20   value for it.. 
16690 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74   ** All other st
166a0 72 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64  rings are passed
166b0 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f   through to Tcl_
166c0 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
166d0 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74  ()..  ** Tcl_Get
166e0 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20  DoubleFromObj() 
166f0 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e  should understan
16700 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65  d "NaN" but some
16710 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63   versions.  ** c
16720 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20  ontain a bug..  
16730 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f  */.  zVal = Tcl_
16740 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
16750 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
16760 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  <sizeof(aSpecial
16770 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63  Fp)/sizeof(aSpec
16780 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b  ialFp[0]); i++){
16790 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
167a0 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e  aSpecialFp[i].zN
167b0 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b  ame, zVal)==0 ){
167c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
167d0 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78  int64 x;.      x
167e0 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d   = aSpecialFp[i]
167f0 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78  .iUpper;.      x
16800 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78   <<= 32;.      x
16810 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69   |= aSpecialFp[i
16820 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20  ].iLower;.      
16830 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76  assert( sizeof(v
16840 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20  alue)==8 );.    
16850 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16860 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  (x)==8 );.      
16870 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26  memcpy(&value, &
16880 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65  x, 8);.      bre
16890 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
168a0 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53  if( i>=sizeof(aS
168b0 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66  pecialFp)/sizeof
168c0 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20  (aSpecialFp[0]) 
168d0 26 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f  &&.         Tcl_
168e0 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
168f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
16900 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20  , &value) ){.   
16910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16920 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
16930 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
16940 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  e(pStmt, idx, va
16950 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
16960 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
16970 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
16980 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
16990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
169a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
169b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
169c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
169d0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
169e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
169f0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
16a00 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a  d_null  STMT N.*
16a10 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
16a20 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20  lite3_bind_null 
16a30 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
16a40 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
16a50 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
16a60 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
16a70 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
16a80 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16a90 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
16aa0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55  nd.** binds a NU
16ab0 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  LL to the wildca
16ac0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
16ad0 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c  t test_bind_null
16ae0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16af0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16b00 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16b10 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16b20 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16b30 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
16b40 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
16b50 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   idx;.  int rc;.
16b60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
16b70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16b80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16b90 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
16ba0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
16bb0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
16bc0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
16bd0 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22  ], 0), " STMT N"
16be0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
16bf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16c00 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16c10 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16c20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16c30 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16c40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16c50 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16c60 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16c70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
16c80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16c90 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16ca0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
16cb0 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66  Stmt, idx);.  if
16cc0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16cd0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
16ce0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
16cf0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16d00 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
16d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16d20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16d30 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
16d40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
16d50 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
16d60 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54  e3_bind_text  ST
16d70 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45  MT N STRING BYTE
16d80 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
16d90 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
16da0 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  xt interface.  S
16db0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
16dc0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
16dd0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
16de0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16df0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16e00 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16e10 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16e20 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54   UTF-8 string ST
16e30 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64  RING to the wild
16e40 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e  card.  The strin
16e50 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  g is BYTES bytes
16e60 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  .** long..*/.sta
16e70 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
16e80 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a  d_text(.  void *
16e90 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
16ea0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
16eb0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
16ec0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
16ed0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
16ee0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
16ef0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
16f00 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
16f10 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
16f20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
16f30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
16f40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
16f50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16f60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
16f70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16f80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16f90 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16fa0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
16fb0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16fc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16fd0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
16fe0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16ff0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17000 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17020 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17030 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17040 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17060 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68  R;.  value = (ch
17070 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
17080 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
17090 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20  [3], &bytes);.  
170a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
170b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
170c0 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
170d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
170e0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
170f0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
17100 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
17110 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52  bytes, SQLITE_TR
17120 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20  ANSIENT);.  if( 
17130 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17140 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17150 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17160 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17170 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17180 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17190 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
171a0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
171b0 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
171c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
171d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
171e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
171f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
17200 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
17210 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54  6 ?-static? STMT
17220 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
17230 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
17240 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17250 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  16 interface.  S
17260 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
17270 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
17280 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
17290 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
172a0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
172b0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
172c0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
172d0 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53   UTF-16 string S
172e0 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c  TRING to the wil
172f0 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69  dcard.  The stri
17300 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65  ng is BYTES byte
17310 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74  s.** long..*/.st
17320 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
17330 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69  nd_text16(.  voi
17340 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17350 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17360 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17370 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17380 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
17390 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
173a0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
173b0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
173c0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62  int idx;.  int b
173d0 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61  ytes;.  char *va
173e0 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
173f0 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76    void (*xDel)(v
17400 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36  oid*) = (objc==6
17410 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53  ?SQLITE_STATIC:S
17420 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
17430 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74  ;.  Tcl_Obj *oSt
17440 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  mt    = objv[obj
17450 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-4];.  Tcl_Obj 
17460 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76  *oN       = objv
17470 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f  [objc-3];.  Tcl_
17480 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20  Obj *oString  = 
17490 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20  objv[objc-2];.  
174a0 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20  Tcl_Obj *oBytes 
174b0 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d    = objv[objc-1]
174c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
174d0 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20   && objc!=6){.  
174e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
174f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
17500 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
17510 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
17520 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
17530 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
17540 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
17550 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  E BYTES", 0);.  
17560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17570 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
17580 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
17590 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
175a0 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74  ing(oStmt), &pSt
175b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
175c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
175d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
175e0 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78  interp, oN, &idx
175f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17600 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
17610 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
17620 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
17630 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66  String, 0);.  if
17640 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17650 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74  Obj(interp, oByt
17660 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  es, &bytes) ) re
17670 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17680 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17690 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d  bind_text16(pStm
176a0 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29  t, idx, (void *)
176b0 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
176c0 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  el);.  if( sqlit
176d0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
176e0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
176f0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17700 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17710 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17720 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
17730 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17740 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
17750 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
17760 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17770 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  .  }..#endif /* 
17780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
17790 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
177a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
177b0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
177c0 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74  bind_blob ?-stat
177d0 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20  ic? STMT N DATA 
177e0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
177f0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
17800 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  d_blob interface
17810 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17820 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17830 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17840 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17850 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
17860 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
17870 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
17880 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65  ds a BLOB to the
17890 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
178a0 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79  BLOB is BYTES by
178b0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
178c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
178d0 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69  bind_blob(.  voi
178e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
178f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17900 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17910 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17920 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
17930 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
17940 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
17950 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
17960 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
17970 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64   rc;.  sqlite3_d
17980 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78  estructor_type x
17990 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
179a0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a  ITE_TRANSIENT;..
179b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
179c0 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20   objc!=6 ){.    
179d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
179e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
179f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17a00 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
17a10 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
17a20 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
17a30 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42   " STMT N DATA B
17a40 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72  YTES", 0);.    r
17a50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17a60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
17a70 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74  ==6 ){.    xDest
17a80 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
17a90 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76  STATIC;.    objv
17aa0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  ++;.  }..  if( g
17ab0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
17ac0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
17ad0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
17ae0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
17af0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17b00 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17b10 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
17b20 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
17b30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76  n TCL_ERROR;.  v
17b40 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  alue = Tcl_GetSt
17b50 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
17b60 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17b70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17b80 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
17b90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17ba0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17bb0 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53  te3_bind_blob(pS
17bc0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
17bd0 20 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63   bytes, xDestruc
17be0 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tor);.  if( sqli
17bf0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
17c00 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
17c10 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
17c20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17c30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c40 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17c50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17c60 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
17c70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17c80 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17c90 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17ca0 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  t  STMT.**.** Re
17cb0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17cc0 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20  of wildcards in 
17cd0 74 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d  the given statem
17ce0 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
17cf0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  nt test_bind_par
17d00 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20  ameter_count(.  
17d10 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17d20 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17d30 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17d40 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17d50 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17d60 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17d70 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
17d80 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
17d90 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
17da0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
17db0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
17dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17dd0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
17de0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17df0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17e00 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
17e10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e20 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
17e30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
17e40 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
17e50 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
17e60 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  er_count(pStmt))
17e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
17e80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
17e90 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17ea0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
17eb0 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a  e  STMT  N.**.**
17ec0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
17ed0 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64   of the Nth wild
17ee0 63 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74  card.  The first
17ef0 20 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a   wildcard is 1..
17f00 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69  ** An empty stri
17f10 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ng is returned i
17f20 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
17f30 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69  nge or if the wi
17f40 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d  ldcard.** is nam
17f50 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  eless..*/.static
17f60 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
17f70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20  arameter_name(. 
17f80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17f90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17fa0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17fb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17fc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17fd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
17fe0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b  *pStmt;.  int i;
17ff0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
18000 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18010 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18020 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
18030 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
18040 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18050 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
18060 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18070 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18080 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
18090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
180a0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
180b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
180c0 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65  bjv[2], &i) ) re
180d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
180e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
180f0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
18100 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
18110 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  j(sqlite3_bind_p
18120 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
18130 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a  tmt,i),-1).  );.
18140 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18160 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
18170 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20  parameter_index 
18180 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a   STMT  NAME.**.*
18190 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
181a0 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ex of the wildca
181b0 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  rd called NAME. 
181c0 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
181d0 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68  re is.** no such
181e0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
181f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
18200 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
18210 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ex(.  void * cli
18220 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18230 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18240 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18250 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18260 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
18270 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
18280 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
18290 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
182a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
182b0 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22  bjv, "STMT NAME"
182c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
182d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
182e0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
182f0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18300 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18310 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18330 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
18340 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54  (interp, .     T
18350 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20  cl_NewIntObj(.  
18360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
18370 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
18380 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53  x(pStmt,Tcl_GetS
18390 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a  tring(objv[2])).
183a0 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65       ).  );.  re
183b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
183c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
183d0 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
183e0 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f  dings STMT.**.*/
183f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18400 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28  _clear_bindings(
18410 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18420 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18430 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18440 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18450 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18460 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
18470 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
18480 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18490 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
184a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
184b0 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
184c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
184d0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
184e0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
184f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18500 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18520 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
18530 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18540 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
18550 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
18560 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a  dings(pStmt)));.
18570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18590 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
185a0 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f   MILLISECONDS.*/
185b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
185c0 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a  _sleep(.  void *
185d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
185e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
185f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18600 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18610 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
18620 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ms;..  if( objc!
18630 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
18640 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
18650 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c  p, 1, objv, "MIL
18660 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20  LISECONDS");.   
18670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18680 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
18690 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
186a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
186b0 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &ms) ){.    retu
186c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
186d0 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
186e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
186f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
18700 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a  e3_sleep(ms)));.
18710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18730 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
18740 64 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a  d_errcode DB.**.
18750 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74  ** Return the st
18760 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
18770 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
18780 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
18790 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   API.** error co
187a0 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45  de. e.g. "SQLITE
187b0 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74  _ERROR"..*/.stat
187c0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65  ic int test_ex_e
187d0 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
187e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
187f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18800 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18810 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18820 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18830 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
18840 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
18850 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
18860 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
18870 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
18880 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
18890 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
188a0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
188b0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
188c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
188d0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
188e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
188f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18900 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
18910 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18920 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18930 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
18940 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  (db);.  Tcl_Appe
18950 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18960 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
18970 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
18980 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18990 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
189a0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
189b0 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
189c0 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65  the string repre
189d0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
189e0 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
189f0 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72  ite3_* API.** er
18a00 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22  ror code. e.g. "
18a10 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a  SQLITE_ERROR"..*
18a20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
18a30 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
18a40 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18a50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18a60 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18a70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18a80 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18a90 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
18aa0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
18ab0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
18ac0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
18ad0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18ae0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18af0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18b00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18b10 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
18b20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18b30 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18b40 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18b50 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18b60 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18b70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18b80 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
18b90 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
18ba0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18bb0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
18bc0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
18bd0 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
18be0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18bf0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
18c00 65 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a  e3_errmsg DB.**.
18c10 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55  ** Returns the U
18c20 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74  TF-8 representat
18c30 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
18c40 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
18c50 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
18c60 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
18c70 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74   API call..*/.st
18c80 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
18c90 72 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63  rmsg(.  void * c
18ca0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18cb0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18cc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18cd0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18ce0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18cf0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
18d00 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66  har *zErr;..  if
18d10 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18d20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18d30 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18d40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18d50 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18d60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18d70 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18d80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18d90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18da0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18db0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18dc0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18dd0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
18de0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72  L_ERROR;..  zErr
18df0 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73   = sqlite3_errms
18e00 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  g(db);.  Tcl_Set
18e10 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18e20 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
18e30 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20  bj(zErr, -1));. 
18e40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18e50 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18e60 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
18e70 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
18e80 20 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72   the UTF-16 repr
18e90 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
18ea0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
18eb0 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
18ec0 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
18ed0 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
18ee0 2e 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65  . This is a byte
18ef0 20 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74   array object at
18f00 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76   the TCL .** lev
18f10 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75  el, and it inclu
18f20 64 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30  des the 0x00 0x0
18f30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74  0 terminator byt
18f40 65 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  es at the end of
18f50 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73   the.** UTF-16 s
18f60 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
18f70 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
18f80 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
18f90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18fa0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18fb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18fc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
18fd0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
18fe0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
18ff0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
19000 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72   const void *zEr
19010 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  r;.  const char 
19020 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20  *z;.  int bytes 
19030 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
19040 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
19050 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19060 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19070 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19080 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19090 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
190a0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
190b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
190c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
190d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
190e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
190f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
19100 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19110 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  R;..  zErr = sql
19120 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62  ite3_errmsg16(db
19130 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b  );.  if( zErr ){
19140 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20  .    z = zErr;. 
19150 20 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20     for(bytes=0; 
19160 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79  z[bytes] || z[by
19170 74 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32  tes+1]; bytes+=2
19180 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ){}.  }.  Tcl_Se
19190 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
191a0 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
191b0 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74  rayObj(zErr, byt
191c0 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  es));.#endif /* 
191d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
191e0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
191f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
19200 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
19210 65 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74  epare DB sql byt
19220 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a  es ?tailvar?.**.
19230 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f  ** Compile up to
19240 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f   <bytes> bytes o
19250 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53  f the supplied S
19260 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20  QL string <sql> 
19270 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  using.** databas
19280 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54  e handle <DB>. T
19290 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61  he parameter <ta
192a0 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61  ilval> is the na
192b0 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a  me of a global.*
192c0 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20  * variable that 
192d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e  is set to the un
192e0 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20  used portion of 
192f0 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
19300 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65  A.** STMT handle
19310 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
19320 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
19330 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64  _prepare(.  void
19340 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19350 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19360 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19370 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19380 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19390 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
193a0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
193b0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
193c0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
193d0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
193e0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
193f0 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
19400 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
19410 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
19420 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
19430 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19440 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
19450 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
19460 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
19470 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
19480 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
19490 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
194a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
194b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
194c0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
194d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
194e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
194f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
19500 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
19510 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19520 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
19530 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
19540 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
19550 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
19560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
19570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
19580 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
19590 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
195a0 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
195b0 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  : 0);.  Tcl_Rese
195c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
195d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
195e0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
195f0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
19600 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19610 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a  if( zTail && obj
19620 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
19630 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
19640 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
19650 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53  - (int)(zTail-zS
19660 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
19670 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  f( (int)strlen(z
19680 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20  Tail)<bytes ){. 
19690 20 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e       bytes = (in
196a0 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b  t)strlen(zTail);
196b0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
196c0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
196d0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
196e0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
196f0 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
19700 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19720 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
19730 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
19740 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
19750 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
19760 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19770 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
19780 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
19790 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
197a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
197b0 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
197c0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
197d0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
197e0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
197f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19800 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
19810 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19820 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
19830 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
19850 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19860 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
19870 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
19880 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
19890 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
198a0 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
198b0 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
198c0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
198d0 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
198e0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
198f0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
19900 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
19910 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
19920 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
19930 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
19940 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
19950 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
19960 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
19970 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
19980 72 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69  repare_v2(.  voi
19990 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
199a0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
199b0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
199c0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
199d0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
199e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
199f0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
19a00 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
19a10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
19a20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
19a30 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
19a40 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
19a50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
19a60 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
19a70 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
19a80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19a90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
19aa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
19ab0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
19ac0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
19ad0 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
19ae0 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
19af0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19b00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19b10 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19b20 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19b30 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19b40 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19b50 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
19b60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19b70 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
19b80 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
19b90 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
19ba0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
19bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
19bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19bd0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
19be0 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
19bf0 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
19c00 6c 20 3a 20 30 29 3b 0a 20 20 61 73 73 65 72 74  l : 0);.  assert
19c10 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
19c20 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54  | pStmt==0);.  T
19c30 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
19c40 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
19c50 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
19c60 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
19c70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19c80 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  ROR;.  if( zTail
19c90 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20   && objc>=5 ){. 
19ca0 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
19cb0 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
19cc0 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a   bytes - (int)(z
19cd0 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
19ce0 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  }.    Tcl_ObjSet
19cf0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
19d00 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77  v[4], 0, Tcl_New
19d10 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c  StringObj(zTail,
19d20 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d   bytes), 0);.  }
19d30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
19d50 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
19d60 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
19d70 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
19d80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19d90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19da0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
19db0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
19dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19dd0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
19de0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
19df0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
19e00 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
19e10 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
19e20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19e30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19e40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19e50 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
19e60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19e70 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19e80 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
19e90 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e  134 DB.**.** Gen
19ea0 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64  erate a prepared
19eb0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
19ec0 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e   zero-byte strin
19ed0 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66  g as a test.** f
19ee0 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e  or ticket #3134.
19ef0 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f    The string sho
19f00 75 6c 64 20 62 65 20 70 72 65 63 65 65 64 65 64  uld be preceeded
19f10 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
19f20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
19f30 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
19f40 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
19f50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19f60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19f70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19f80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19f90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19fa0 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
19fb0 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
19fc0 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
19fd0 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
19fe0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19ff0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1a000 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1a010 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1a020 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a030 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a040 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a050 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a060 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a070 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1a080 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
1a090 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a0a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a0b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1a0c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a0d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a0e0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1a0f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1a100 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1a110 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
1a120 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
1a130 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1a140 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1a150 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
1a160 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1a170 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1a180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a190 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a1a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1a1b0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1a1c0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
1a1d0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1a1e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a1f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a200 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1a210 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1a220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a230 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1a240 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1a250 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1a260 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1a270 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1a280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a290 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a2a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a2b0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1a2c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a2d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a2e0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 20 44  ite3_prepare16 D
1a2f0 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1a300 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  var.**.** Compil
1a310 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1a320 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1a330 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1a340 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1a350 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a360 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1a370 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1a380 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1a390 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1a3a0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1a3b0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1a3c0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1a3d0 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1a3e0 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1a3f0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1a400 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  nt test_prepare1
1a410 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1a420 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a430 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a440 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a450 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a460 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1a470 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1a480 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1a490 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1a4a0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a4b0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1a4c0 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1a4d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a4e0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1a4f0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1a500 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1a510 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1a520 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1a530 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1a540 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1a550 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1a560 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1a570 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1a580 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1a590 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1a5a0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1a5b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a5c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1a5d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1a5e0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1a5f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1a600 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1a610 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1a620 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a630 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1a640 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1a650 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1a660 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1a670 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1a680 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1a690 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1a6a0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1a6b0 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1a6c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a6d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a6e0 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1a6f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a700 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1a710 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
1a720 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1a730 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1a740 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1a750 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1a760 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1a770 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1a780 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1a790 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1a7a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a7b0 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1a7c0 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1a7d0 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1a7e0 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75  bjlen - (int)((u
1a7f0 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1a800 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1a810 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1a820 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1a830 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1a840 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1a850 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1a860 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1a870 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1a880 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1a890 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1a8a0 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1a8b0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1a8c0 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1a8d0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1a8e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1a8f0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1a900 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1a910 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1a920 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a930 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a940 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a950 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1a960 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1a970 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1a980 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a990 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1a9a0 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20  are16_v2 DB sql 
1a9b0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1a9c0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1a9d0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1a9e0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1a9f0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1aa00 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1aa10 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1aa20 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1aa30 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1aa40 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1aa50 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1aa60 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1aa70 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1aa80 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1aa90 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1aaa0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1aab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1aac0 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32  est_prepare16_v2
1aad0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1aae0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1aaf0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ab00 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1ab10 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ab20 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1ab30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1ab40 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1ab50 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b  onst void *zSql;
1ab60 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1ab70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f  Tail = 0;.  Tcl_
1ab80 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a  Obj *pTail = 0;.
1ab90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1aba0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
1abb0 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69  r zBuf[50]; .  i
1abc0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74  nt rc;.  int byt
1abd0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
1abe0 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65     /* The intege
1abf0 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61  r specified as a
1ac00 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  rg 3 */.  int ob
1ac10 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  jlen;           
1ac20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d      /* The byte-
1ac30 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20  array length of 
1ac40 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20  arg 2 */..  if( 
1ac50 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
1ac60 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
1ac70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ac80 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ac90 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1aca0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1acb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1acc0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1acd0 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
1ace0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1acf0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1ad00 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1ad10 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1ad20 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1ad30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ad40 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1ad50 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1ad60 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
1ad70 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20  &objlen);.  if( 
1ad80 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1ad90 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1ada0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1adb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1adc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1add0 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20  repare16_v2(db, 
1ade0 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1adf0 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1ae00 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66  zTail : 0);.  if
1ae10 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1ae20 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1ae30 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1ae40 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1ae50 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1ae60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1ae70 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b    if( objc>=5 ){
1ae80 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29  .    if( zTail )
1ae90 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1aea0 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28   objlen - (int)(
1aeb0 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20  (u8 *)zTail-(u8 
1aec0 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  *)zSql);.    }el
1aed0 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e  se{.      objlen
1aee0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1aef0 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42  pTail = Tcl_NewB
1af00 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20  yteArrayObj((u8 
1af10 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29  *)zTail, objlen)
1af20 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
1af30 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1af40 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72     Tcl_ObjSetVar
1af50 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  2(interp, objv[4
1af60 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b  ], 0, pTail, 0);
1af70 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1af80 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1af90 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1afa0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1afb0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1afc0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1afd0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1afe0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1aff0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1b000 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1b010 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1b020 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b030 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1b040 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b050 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
1b060 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74  en filename ?opt
1b070 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74  ions-list?.*/.st
1b080 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70  atic int test_op
1b090 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
1b0a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1b0b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1b0c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1b0d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1b0e0 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1b0f0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1b100 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1b110 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1b120 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
1b130 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  & objc!=2 && obj
1b140 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1b150 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b160 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1b170 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1b180 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1b190 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1b1a0 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
1b1b0 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
1b1c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b1d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
1b1e0 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31  ilename = objc>1
1b1f0 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   ? Tcl_GetString
1b200 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20  (objv[1]) : 0;. 
1b210 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46   sqlite3_open(zF
1b220 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1b230 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1b240 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1b250 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1b260 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1b270 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1b280 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b290 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1b2a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b2b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b2c0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49  lite3_open_v2 FI
1b2d0 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53  LENAME FLAGS VFS
1b2e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b2f0 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76  est_open_v2(.  v
1b300 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b310 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b320 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b330 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b340 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b350 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1b360 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  lename;.  const 
1b370 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e  char *zVfs;.  in
1b380 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73  t flags = 0;.  s
1b390 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1b3a0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75  t rc;.  char zBu
1b3b0 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e  f[100];..  int n
1b3c0 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Flag;.  Tcl_Obj 
1b3d0 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20  **apFlag;.  int 
1b3e0 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
1b3f0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
1b400 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b410 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
1b420 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29  NAME FLAGS VFS")
1b430 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1b440 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46  _ERROR;.  }.  zF
1b450 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
1b460 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1b470 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47  ;.  zVfs = Tcl_G
1b480 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
1b490 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d  );.  if( zVfs[0]
1b4a0 3d 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20  ==0x00 ) zVfs = 
1b4b0 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c  0;..  rc = Tcl_L
1b4c0 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
1b4d0 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  s(interp, objv[2
1b4e0 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c  ], &nFlag, &apFl
1b4f0 61 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54  ag);.  if( rc!=T
1b500 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
1b510 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
1b520 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  nFlag; i++){.   
1b530 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20   int iFlag;.    
1b540 73 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20  struct OpenFlag 
1b550 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1b560 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20  ar *zFlag;.     
1b570 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d   int flag;.    }
1b580 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20   aFlag[] = {.   
1b590 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b5a0 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c  N_READONLY", SQL
1b5b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1b5c0 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1b5d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b5e0 49 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE", SQLITE_OPE
1b5f0 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20  N_READWRITE },. 
1b600 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b610 50 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c  PEN_CREATE", SQL
1b620 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1b630 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b640 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1b650 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f  CLOSE", SQLITE_O
1b660 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1b670 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b680 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1b690 49 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  IVE", SQLITE_OPE
1b6a0 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20  N_EXCLUSIVE },. 
1b6b0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b6c0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20  PEN_AUTOPROXY", 
1b6d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
1b6e0 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b  PROXY },.      {
1b6f0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   "SQLITE_OPEN_MA
1b700 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  IN_DB", SQLITE_O
1b710 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20  PEN_MAIN_DB },. 
1b720 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b730 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51  PEN_TEMP_DB", SQ
1b740 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1b750 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  B },.      { "SQ
1b760 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1b770 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f  ENT_DB", SQLITE_
1b780 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
1b790 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  B },.      { "SQ
1b7a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1b7b0 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1b7c0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1b7d0 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1b7e0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1b7f0 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f  OURNAL", SQLITE_
1b800 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1b810 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1b820 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1b830 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1b840 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c  EN_SUBJOURNAL },
1b850 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b860 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1b870 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1b880 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1b890 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1b8a0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
1b8b0 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  X", SQLITE_OPEN_
1b8c0 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20  NOMUTEX },.     
1b8d0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b8e0 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49  FULLMUTEX", SQLI
1b8f0 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1b900 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  X },.      { "SQ
1b910 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
1b920 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f  CACHE", SQLITE_O
1b930 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
1b940 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b950 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1b960 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1b970 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20  EN_PRIVATECACHE 
1b980 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b990 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51  TE_OPEN_WAL", SQ
1b9a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c  LITE_OPEN_WAL },
1b9b0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b9c0 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49  _OPEN_URI", SQLI
1b9d0 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20  TE_OPEN_URI },. 
1b9e0 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
1b9f0 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63    };.    rc = Tc
1ba00 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
1ba10 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20  jStruct(interp, 
1ba20 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67  apFlag[i], aFlag
1ba30 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30  , sizeof(aFlag[0
1ba40 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c  ]), .        "fl
1ba50 61 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20  ag", 0, &iFlag. 
1ba60 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
1ba70 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
1ba80 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20  n rc;.    flags 
1ba90 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e  |= aFlag[iFlag].
1baa0 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  flag;.  }..  rc 
1bab0 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  = sqlite3_open_v
1bac0 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  2(zFilename, &db
1bad0 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a  , flags, zVfs);.
1bae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1baf0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1bb00 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1bb10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bb20 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1bb30 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1bb40 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1bb50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1bb60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1bb70 74 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e  te3_open16 filen
1bb80 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73  ame options.*/.s
1bb90 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f  tatic int test_o
1bba0 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  pen16(.  void * 
1bbb0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1bbc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bbd0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1bbe0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1bbf0 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1bc00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1bc10 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  16.  const void 
1bc20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
1bc30 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
1bc40 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1bc50 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1bc60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1bc70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1bc80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1bc90 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1bca0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1bcb0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1bcc0 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1bcd0 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1bce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bcf0 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1bd00 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1bd10 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
1bd20 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
1bd30 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65  open16(zFilename
1bd40 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28  , &db);.  .  if(
1bd50 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1bd60 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1bd70 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
1bd80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bd90 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1bda0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1bdb0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
1bdc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1bdd0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1bde0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1bdf0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1be00 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36  mplete16 <UTF-16
1be10 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52   string>.**.** R
1be20 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 73  eturn 1 if the s
1be30 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74  upplied argument
1be40 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53   is a complete S
1be50 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72  QL statement, or
1be60 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69   zero.** otherwi
1be70 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
1be80 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31  t test_complete1
1be90 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1bea0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1beb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1bec0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1bed0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1bee0 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  ].){.#if !define
1bef0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
1bf00 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69  MPLETE) && !defi
1bf10 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1bf20 55 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a  UTF16).  char *z
1bf30 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Buf;..  if( objc
1bf40 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1bf50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1bf60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75  rp, 1, objv, "<u
1bf70 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20  tf-16 sql>");.  
1bf80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bf90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20  OR;.  }..  zBuf 
1bfa0 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
1bfb0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
1bfc0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1bfd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1bfe0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1bff0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
1c000 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29  omplete16(zBuf))
1c010 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1c020 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
1c030 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54  E && SQLITE_OMIT
1c040 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1c050 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c060 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c070 65 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a  e3_step STMT.**.
1c080 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73  ** Advance the s
1c090 74 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20  tatement to the 
1c0a0 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  next row..*/.sta
1c0b0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65  tic int test_ste
1c0c0 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
1c0d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c0e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c0f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c100 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c110 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1c120 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1c130 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1c140 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1c150 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c160 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c170 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c180 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c190 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c1a0 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
1c1b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c1c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c1d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1c1e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c1f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c200 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1c210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1c220 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1c230 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66  pStmt);..  /* if
1c240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
1c250 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  E && rc!=SQLITE_
1c260 52 4f 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ROW ) return TCL
1c270 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c  _ERROR; */.  Tcl
1c280 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1c290 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1c2a0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1c2b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c2c0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
1c2d0 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20  est_sql(.  void 
1c2e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c2f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c300 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c310 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c320 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c330 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c340 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1c350 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1c360 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1c370 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
1c380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c390 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c3a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c3b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c3c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c3d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c3e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c3f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c400 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
1c410 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
1c420 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
1c430 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1c440 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c450 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1c460 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a  n_count STMT .**
1c470 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
1c480 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1c490 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
1c4a0 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53   sql statement S
1c4b0 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  TMT..*/.static i
1c4c0 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63  nt test_column_c
1c4d0 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
1c4e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c4f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c500 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c510 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c520 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1c530 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
1c540 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1c550 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c560 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c570 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c580 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1c590 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1c5a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1c5b0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1c5c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1c5d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1c5e0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1c5f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c600 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c610 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1c620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
1c630 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c640 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1c650 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f  ntObj(sqlite3_co
1c660 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
1c670 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
1c680 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c690 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c6a0 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63  lumn_type STMT c
1c6b0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  olumn.**.** Retu
1c6c0 72 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  rn the type of t
1c6d0 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1c6e0 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1c6f0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a  e current row..*
1c700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1c710 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20  t_column_type(. 
1c720 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c730 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c740 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c750 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c760 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c770 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c780 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1c790 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20  l;.  int tp;..  
1c7a0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1c7b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c7c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1c7d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c7e0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1c7f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1c800 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1c810 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1c820 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c830 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1c840 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1c850 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c860 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1c870 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1c880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1c890 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1c8a0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1c8b0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1c8c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1c8d0 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  tp = sqlite3_col
1c8e0 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20  umn_type(pStmt, 
1c8f0 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20  col);.  switch( 
1c900 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  tp ){.    case S
1c910 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a  QLITE_INTEGER: .
1c920 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1c930 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54  ult(interp, "INT
1c940 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49  EGER", TCL_STATI
1c950 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1c960 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1c970 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63  E_NULL:.      Tc
1c980 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1c990 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f  rp, "NULL", TCL_
1c9a0 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1c9b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c9c0 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20  SQLITE_FLOAT:.  
1c9d0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1c9e0 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54  t(interp, "FLOAT
1c9f0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1ca00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ca10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ca20 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  XT:.      Tcl_Se
1ca30 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1ca40 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54  "TEXT", TCL_STAT
1ca50 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1ca60 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1ca70 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54  TE_BLOB:.      T
1ca80 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1ca90 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c  erp, "BLOB", TCL
1caa0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1cab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1cac0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
1cad0 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  t(0);.  }..  ret
1cae0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1caf0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1cb00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1cb10 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1cb20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
1cb30 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1cb40 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1cb50 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73  rent row cast as
1cb60 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d   an.** wide (64-
1cb70 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  bit) integer..*/
1cb80 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1cb90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20  _column_int64(. 
1cba0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1cbb0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1cbc0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1cbd0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1cbe0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1cbf0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1cc00 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1cc10 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a  l;.  i64 iVal;..
1cc20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1cc30 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1cc40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1cc50 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1cc60 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1cc70 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1cc80 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1cc90 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1cca0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ccb0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1ccc0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1ccd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1cce0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ccf0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1cd00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1cd10 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1cd20 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1cd30 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1cd40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1cd50 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    iVal = sqlite3
1cd60 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
1cd70 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
1cd80 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1cd90 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
1cda0 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a  eIntObj(iVal));.
1cdb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1cdc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1cdd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1cde0 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  blob STMT column
1cdf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1ce00 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28  est_column_blob(
1ce10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ce20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ce30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ce40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ce50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ce60 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1ce70 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1ce80 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b  col;..  int len;
1ce90 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1cea0 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Blob;..  if( obj
1ceb0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1cec0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ced0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1cee0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1cef0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1cf00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1cf10 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1cf20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cf30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cf40 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1cf50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1cf60 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cf70 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1cf80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf90 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1cfa0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1cfb0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1cfc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cfd0 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73  RROR;..  len = s
1cfe0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1cff0 74 65 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  tes(pStmt, col);
1d000 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74  .  pBlob = sqlit
1d010 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70  e3_column_blob(p
1d020 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
1d030 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d040 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
1d050 74 65 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62  teArrayObj(pBlob
1d060 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72  , len));.  retur
1d070 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d080 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d090 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20  3_column_double 
1d0a0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1d0b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1d0c0 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c  a in column 'col
1d0d0 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72  umn' of the curr
1d0e0 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20  ent row cast as 
1d0f0 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61  a double..*/.sta
1d100 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1d110 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  umn_double(.  vo
1d120 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d130 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d140 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d150 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d160 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d170 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d180 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1d190 20 20 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a    double rVal;..
1d1a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1d1b0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d1c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1d1d0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d1e0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1d1f0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1d200 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1d210 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1d220 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d230 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1d240 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1d250 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1d260 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1d270 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1d280 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1d290 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1d2a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1d2b0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1d2c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1d2d0 20 20 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    rVal = sqlite3
1d2e0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
1d2f0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63  Stmt, col);.  Tc
1d300 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d310 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f  nterp, Tcl_NewDo
1d320 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a  ubleObj(rVal));.
1d330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1d340 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1d350 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f   sqlite3_data_co
1d360 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
1d370 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1d380 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1d390 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
1d3a0 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
1d3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d3c0 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a  est_data_count(.
1d3d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d3e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d3f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d400 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d410 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d420 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1d430 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1d440 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1d450 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d460 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1d470 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1d480 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1d490 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d4a0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1d4b0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1d4c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d4d0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1d4e0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1d4f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1d500 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1d510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d520 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  RROR;..  Tcl_Set
1d530 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1d540 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1d550 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
1d560 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
1d570 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d580 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d590 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1d5a0 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1d5b0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d5c0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1d5d0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1d5e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1d5f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
1d600 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1d610 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1d620 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64  tmt_utf8(.  void
1d630 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1d640 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1d650 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
1d660 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
1d670 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  voke */.  Tcl_In
1d680 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d690 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d6a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d6b0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1d6c0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1d6d0 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  t col;.  const c
1d6e0 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  har *(*xFunc)(sq
1d6f0 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1d700 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
1d710 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20  *zRet;..  xFunc 
1d720 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 28  = (const char *(
1d730 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1d740 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1d750 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1d760 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d770 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d780 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1d790 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1d7a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1d7b0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1d7c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1d7d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d7e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1d7f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1d800 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1d810 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1d820 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1d830 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d840 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1d850 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1d860 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1d870 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d880 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e 63  ;.  zRet = xFunc
1d890 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1d8a0 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20  if( zRet ){.    
1d8b0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1d8c0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a 52  terp, (char *)zR
1d8d0 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  et, 0);.  }.  re
1d8e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d8f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1d900 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a  global_recover(.
1d910 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d920 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d930 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d940 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d950 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d960 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1d970 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
1d980 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1d990 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
1d9a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1d9b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1d9c0 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
1d9d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d9e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1d9f0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29  global_recover()
1da00 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1da10 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1da20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1da30 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1da40 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1da50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1da60 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1da70 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54  column_text STMT
1da80 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1da90 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1daa0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d  umn_decltype STM
1dab0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1dac0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1dad0 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63  lumn_name STMT c
1dae0 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
1daf0 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  int test_stmt_ut
1db00 66 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  f16(.  void * cl
1db10 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a  ientData,     /*
1db20 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
1db30 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
1db40 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
1db50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1db60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1db70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1db80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1db90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1dba0 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
1dbb0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1dbc0 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f   int col;.  Tcl_
1dbd0 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e  Obj *pRet;.  con
1dbe0 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36  st void *zName16
1dbf0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1dc00 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1dc10 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20  _stmt*, int);.. 
1dc20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
1dc30 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65  void *(*)(sqlite
1dc40 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
1dc50 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1dc60 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1dc70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1dc80 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1dc90 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1dca0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1dcb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1dcc0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1dcd0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1dce0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1dcf0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1dd00 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1dd10 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1dd20 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1dd30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1dd40 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1dd50 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1dd60 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1dd70 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1dd80 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d  L_ERROR;..  zNam
1dd90 65 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  e16 = xFunc(pStm
1dda0 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
1ddb0 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 69 6e  Name16 ){.    in
1ddc0 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t n;.    const c
1ddd0 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36  har *z = zName16
1dde0 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a  ;.    for(n=0; z
1ddf0 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e  [n] || z[n+1]; n
1de00 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65 74 20  +=2){}.    pRet 
1de10 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
1de20 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e  ayObj(zName16, n
1de30 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  +2);.    Tcl_Set
1de40 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1de50 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e  , pRet);.  }.#en
1de60 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1de70 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72  IT_UTF16 */..  r
1de80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1de90 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1dea0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1deb0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1dec0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1ded0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53  3_column_bytes S
1dee0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1def0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1df00 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53  column_bytes16 S
1df10 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f  TMT column.**.*/
1df20 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1df30 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69  _stmt_int(.  voi
1df40 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1df50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1df60 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1df70 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1df80 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
1df90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1dfa0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1dfb0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1dfc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1dfd0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1dfe0 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75  col;.  int (*xFu
1dff0 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1e000 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
1e010 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c  c = (int (*)(sql
1e020 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1e030 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
1e040 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1e050 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e060 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e070 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e080 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1e090 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e0a0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1e0b0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1e0c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e0d0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1e0e0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1e0f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e100 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1e110 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1e120 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1e130 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1e140 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1e150 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1e160 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
1e170 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1e180 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1e190 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d  ntObj(xFunc(pStm
1e1a0 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74  t, col)));.  ret
1e1b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e1c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1e1d0 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44  ite_set_magic  D
1e1e0 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a  B  MAGIC-NUMBER.
1e1f0 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62  **.** Set the db
1e200 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20  ->magic value.  
1e210 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
1e220 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76  test error recov
1e230 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ery logic..*/.st
1e240 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
1e250 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69  set_magic(.  voi
1e260 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1e270 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e280 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1e290 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1e2a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1e2b0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1e2c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1e2d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e2e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1e2f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1e300 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
1e310 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b  " DB MAGIC", 0);
1e320 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e330 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e340 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e350 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1e360 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1e370 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74  _ERROR;.  if( st
1e380 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1e390 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1e3a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1e3b0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1e3c0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65  MAGIC_OPEN;.  }e
1e3d0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1e3e0 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1e3f0 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d  MAGIC_CLOSED")==
1e400 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1e410 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1e420 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73  C_CLOSED;.  }els
1e430 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1e440 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1e450 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b  GIC_BUSY")==0 ){
1e460 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e470 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
1e480 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SY;.  }else if( 
1e490 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1e4a0 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52  "SQLITE_MAGIC_ER
1e4b0 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ROR")==0 ){.    
1e4c0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1e4d0 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
1e4e0 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f    }else if( Tcl_
1e4f0 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1e500 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64  rgv[2], (int*)&d
1e510 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20  b->magic) ){.   
1e520 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e530 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1e540 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e550 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1e560 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a  _interrupt  DB .
1e570 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e  **.** Trigger an
1e580 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42   interrupt on DB
1e590 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e5a0 65 73 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20  est_interrupt(. 
1e5b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e5c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e5d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e5e0 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1e5f0 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
1e600 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1e610 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1e620 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e630 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e640 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e650 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22  , argv[0], " DB"
1e660 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e680 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1e690 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1e6a0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1e6b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
1e6c0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1e6d0 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (db);.  return T
1e6e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
1e6f0 20 75 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61   u8 *sqlite3_sta
1e700 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b  ck_baseline = 0;
1e710 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65  ../*.** Fill the
1e720 20 73 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e   stack with a kn
1e730 6f 77 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a  own bitpattern..
1e740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
1e750 72 65 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a  repStack(void){.
1e760 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62    int i;.  u32 b
1e770 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20  igBuf[65536];.  
1e780 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
1e790 66 28 62 69 67 42 75 66 29 2f 73 69 7a 65 6f 66  f(bigBuf)/sizeof
1e7a0 28 62 69 67 42 75 66 5b 30 5d 29 3b 20 69 2b 2b  (bigBuf[0]); i++
1e7b0 29 20 62 69 67 42 75 66 5b 69 5d 20 3d 20 30 78  ) bigBuf[i] = 0x
1e7c0 64 65 61 64 62 65 65 66 3b 0a 20 20 73 71 6c 69  deadbeef;.  sqli
1e7d0 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1e7e0 6e 65 20 3d 20 28 75 38 2a 29 26 62 69 67 42 75  ne = (u8*)&bigBu
1e7f0 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a  f[65536];.}../*.
1e800 2a 2a 20 47 65 74 20 74 68 65 20 63 75 72 72 65  ** Get the curre
1e810 6e 74 20 73 74 61 63 6b 20 64 65 70 74 68 2e 20  nt stack depth. 
1e820 20 55 73 65 64 20 66 6f 72 20 64 65 62 75 67 67   Used for debugg
1e830 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34  ing only..*/.u64
1e840 20 73 71 6c 69 74 65 33 53 74 61 63 6b 44 65 70   sqlite3StackDep
1e850 74 68 28 76 6f 69 64 29 7b 0a 20 20 75 38 20 78  th(void){.  u8 x
1e860 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 36 34 29  ;.  return (u64)
1e870 28 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  (sqlite3_stack_b
1e880 61 73 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d  aseline - &x);.}
1e890 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1e8a0 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73  sqlite3_stack_us
1e8b0 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20  ed DB SQL.**.** 
1e8c0 54 72 79 20 74 6f 20 6d 65 61 73 75 72 65 20 74  Try to measure t
1e8d0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61  he amount of sta
1e8e0 63 6b 20 73 70 61 63 65 20 75 73 65 64 20 62 79  ck space used by
1e8f0 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
1e900 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69  e3_exec.*/.stati
1e910 63 20 69 6e 74 20 74 65 73 74 5f 73 74 61 63 6b  c int test_stack
1e920 5f 75 73 65 64 28 0a 20 20 76 6f 69 64 20 2a 20  _used(.  void * 
1e930 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e940 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e950 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1e960 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1e970 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e980 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67  int i;.  if( arg
1e990 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e9a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e9b0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e9c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e9d0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1e9e0 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20       " DB SQL", 
1e9f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ea00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ea10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1ea20 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1ea30 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1ea40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65  TCL_ERROR;.  pre
1ea50 70 53 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69  pStack();.  (voi
1ea60 64 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  d)sqlite3_exec(d
1ea70 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30  b, argv[2], 0, 0
1ea80 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35  , 0);.  for(i=65
1ea90 35 33 35 3b 20 69 3e 3d 30 20 26 26 20 28 28 75  535; i>=0 && ((u
1eaa0 33 32 2a 29 73 71 6c 69 74 65 33 5f 73 74 61 63  32*)sqlite3_stac
1eab0 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d  k_baseline)[-i]=
1eac0 3d 30 78 64 65 61 64 62 65 65 66 3b 20 69 2d 2d  =0xdeadbeef; i--
1ead0 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ){}.  Tcl_SetObj
1eae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1eaf0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34  cl_NewIntObj(i*4
1eb00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1eb10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1eb20 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1eb30 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66  te_function DB f
1eb40 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a  unction-name.**.
1eb50 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73  ** Delete the us
1eb60 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e  er function 'fun
1eb70 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ction-name' from
1eb80 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1eb90 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73   DB. It.** is as
1eba0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75  sumed that the u
1ebb0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ser function was
1ebc0 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
1ebd0 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a  , any number of.
1ebe0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68  ** arguments (th
1ebf0 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  e way the TCL in
1ec00 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
1ec10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ec20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28  delete_function(
1ec30 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ec40 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ec50 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ec60 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1ec70 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1ec80 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1ec90 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1eca0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ecb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ecc0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ecd0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1ece0 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1ecf0 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1ed00 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1ed10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ed20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1ed30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1ed40 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1ed50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ed60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1ed70 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
1ed80 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20  b, argv[2], -1, 
1ed90 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1eda0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  0, 0, 0);.  Tcl_
1edb0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1edc0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1edd0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
1ede0 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
1edf0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ee00 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f  * Usage: sqlite_
1ee10 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
1ee20 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61   DB collation-na
1ee30 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  me.**.** Delete 
1ee40 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1ee50 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f  quence 'collatio
1ee60 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1ee70 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
1ee80 20 44 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d   DB. It is assum
1ee90 65 64 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c  ed that the coll
1eea0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
1eeb0 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55 54  as created as UT
1eec0 46 38 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20  F8 (the .** way 
1eed0 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1eee0 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73  e does it)..*/.s
1eef0 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65  tatic int delete
1ef00 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f  _collation(.  vo
1ef10 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ef20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ef30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1ef40 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1ef50 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1ef60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1ef70 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1ef80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ef90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1efa0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1efb0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1efc0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
1efd0 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20  function-name", 
1efe0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1eff0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f000 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1f010 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1f020 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1f030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1f040 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1f050 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61  _collation(db, a
1f060 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55  rgv[2], SQLITE_U
1f070 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  TF8, 0, 0);.  Tc
1f080 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1f090 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
1f0a0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
1f0b0 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
1f0c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1f0d0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1f0e0 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1f0f0 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  t DB.**.** Retur
1f100 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 64 61  n true if the da
1f110 74 61 62 61 73 65 20 44 42 20 69 73 20 63 75 72  tabase DB is cur
1f120 72 65 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63  rently in auto-c
1f130 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52  ommit mode..** R
1f140 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e  eturn false if n
1f150 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
1f160 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  t get_autocommit
1f170 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f180 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f190 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f1a0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1f1b0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72  **argv.){.  char
1f1c0 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c   zBuf[30];.  sql
1f1d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1f1e0 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
1f1f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f200 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f210 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f220 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1f230 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30          " DB", 0
1f240 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f250 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f260 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1f270 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
1f280 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1f290 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70 72 69  CL_ERROR;.  spri
1f2a0 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
1f2b0 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1f2c0 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54  commit(db));.  T
1f2d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f2e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1f2f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f300 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f310 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  e: sqlite3_busy_
1f320 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a  timeout DB MS.**
1f330 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
1f340 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20   timeout.  This 
1f350 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64  is more easily d
1f360 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69  one using the ti
1f370 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20  meout.** method 
1f380 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  of the TCL inter
1f390 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65  face.  But we ne
1f3a0 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74  ed a way to test
1f3b0 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
1f3c0 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  re it returns SQ
1f3d0 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
1f3e0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1f3f0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20  busy_timeout(.  
1f400 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f410 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f420 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1f430 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1f440 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  gv.){.  int rc, 
1f450 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ms;.  sqlite3 *d
1f460 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1f470 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f480 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f490 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1f4a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1f4b0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1f4c0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1f4d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f4e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f4f0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f500 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f510 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f520 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1f530 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
1f540 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75  [2], &ms) ) retu
1f550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f560 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73  rc = sqlite3_bus
1f570 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73  y_timeout(db, ms
1f580 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
1f590 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
1f5a0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1f5b0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1f5c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f5d0 55 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69  Usage:  tcl_vari
1f5e0 61 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42  able_type VARIAB
1f5f0 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74  LENAME.**.** Ret
1f600 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
1f610 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
1f620 72 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  resentation for 
1f630 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
1f640 74 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62  the given variab
1f650 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1f660 74 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74  t tcl_variable_t
1f670 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
1f680 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f690 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f6a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1f6b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f6c0 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a  v[].){.  Tcl_Obj
1f6d0 20 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62   *pVar;.  if( ob
1f6e0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1f6f0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f700 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f710 56 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20  VARIABLE");.    
1f720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f730 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54  ;.  }.  pVar = T
1f740 63 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74  cl_GetVar2Ex(int
1f750 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1f760 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20  ng(objv[1]), 0, 
1f770 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53  TCL_LEAVE_ERR_MS
1f780 47 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d  G);.  if( pVar==
1f790 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
1f7a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72  RROR;.  if( pVar
1f7b0 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20  ->typePtr ){.   
1f7c0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1f7d0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1f7e0 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d  wStringObj(pVar-
1f7f0 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20  >typePtr->name, 
1f800 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  -1));.  }.  retu
1f810 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1f820 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1f830 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
1f840 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74  ry ?N?.**.** Att
1f850 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
1f860 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
1f870 20 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63   held but not ac
1f880 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e  tually required.
1f890 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20  .** The integer 
1f8a0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
1f8b0 6f 66 20 62 79 74 65 73 20 77 65 20 61 72 65 20  of bytes we are 
1f8c0 74 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73  trying to releas
1f8d0 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75  e.  The .** retu
1f8e0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
1f8f0 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79  amount of memory
1f900 20 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73   actually releas
1f910 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1f920 74 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d  t test_release_m
1f930 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20  emory(.  void * 
1f940 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f950 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f960 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f970 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f980 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66  bjv[].){.#if def
1f990 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1f9a0 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
1f9b0 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65  MENT) && !define
1f9c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
1f9d0 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20  SKIO).  int N;. 
1f9e0 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20   int amt;.  if( 
1f9f0 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
1fa00 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1fa10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1fa20 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f  p, 1, objv, "?N?
1fa30 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1fa40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1fa50 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
1fa60 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
1fa70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1fa80 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20   objv[1], &N) ) 
1fa90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1faa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e  ;.  }else{.    N
1fab0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74   = -1;.  }.  amt
1fac0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61   = sqlite3_relea
1fad0 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20  se_memory(N);.  
1fae0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1faf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1fb00 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65  IntObj(amt));.#e
1fb10 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1fb20 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
1fb30 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1fb40 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
1fb50 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d  y DB.**.** Attem
1fb60 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  pt to release me
1fb70 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68  mory currently h
1fb80 65 6c 64 20 62 79 20 64 61 74 61 62 61 73 65 20  eld by database 
1fb90 44 42 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a  DB.  Return the.
1fba0 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28  ** result code (
1fbb0 77 68 69 63 68 20 69 6e 20 74 68 65 20 63 75 72  which in the cur
1fbc0 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rent implementat
1fbd0 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65  ion is always ze
1fbe0 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ro)..*/.static i
1fbf0 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61  nt test_db_relea
1fc00 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69  se_memory(.  voi
1fc10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fc20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fc30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1fc40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1fc50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1fc60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1fc70 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
1fc80 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1fc90 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1fca0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
1fcb0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1fcc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1fcd0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1fce0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1fcf0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1fd00 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1fd10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1fd20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
1fd30 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a  ase_memory(db);.
1fd40 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1fd50 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1fd60 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
1fd70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fd80 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fd90 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
1fda0 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a  name DB DBNAME.*
1fdb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1fdc0 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61  name of a file a
1fdd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
1fde0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
1fdf0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62  atic int test_db
1fe00 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69  _filename(.  voi
1fe10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fe20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fe30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1fe40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1fe50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1fe60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1fe70 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1fe80 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
1fe90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1fea0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1feb0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
1fec0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
1fed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fee0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1fef0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1ff00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ff10 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1ff20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ff30 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
1ff40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
1ff50 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1ff60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
1ff70 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
1ff80 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28  (db, zDbName), (
1ff90 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75  void*)0);.  retu
1ffa0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1ffb0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1ffc0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
1ffd0 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
1ffe0 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66  Return 1 or 0 if
1fff0 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f   DBNAME is reado
20000 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74  nly or not.  Ret
20010 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45  urn -1 if DBNAME
20020 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20030 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
20040 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e  t test_db_readon
20050 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ly(.  void * cli
20060 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20070 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20080 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
20090 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
200a0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
200b0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
200c0 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
200d0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
200e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
200f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
20100 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
20110 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
20120 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
20130 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
20140 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
20150 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
20160 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
20170 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
20180 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
20190 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
201a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
201b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
201c0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72  Obj(sqlite3_db_r
201d0 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e  eadonly(db, zDbN
201e0 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ame)));.  return
201f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20200 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
20210 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
20220 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72  t ?N?.**.** Quer
20230 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66  y or set the sof
20240 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72  t heap limit for
20250 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
20260 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d  ead.  The.** lim
20270 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  it is only chang
20280 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70  ed if the N is p
20290 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65  resent.  The pre
202a0 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69  vious limit.** i
202b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
202c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
202d0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a  oft_heap_limit(.
202e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
202f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20300 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20310 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20320 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20330 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
20340 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64  4 amt;.  Tcl_Wid
20350 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69  eInt N = -1;.  i
20360 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
20370 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20380 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20390 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
203a0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
203b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
203c0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
203d0 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
203e0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
203f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
20400 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
20410 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
20420 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66  mt = sqlite3_sof
20430 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
20440 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
20450 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
20460 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
20470 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  amt));.  return 
20480 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20490 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
204a0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
204b0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
204c0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
204d0 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73  leanup API..*/.s
204e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
204f0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20  hread_cleanup(. 
20500 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20510 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20520 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20530 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20540 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20550 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20560 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
20570 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
20580 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64  _cleanup();.#end
20590 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
205a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
205b0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61  ge:   sqlite3_pa
205c0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44  ger_refcounts  D
205d0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  B.**.** Return a
205e0 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
205f0 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 50   which are the P
20600 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72  agerRefcount for
20610 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f   all.** pagers o
20620 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
20630 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
20640 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
20650 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
20660 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20670 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20680 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20690 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
206a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
206b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
206c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
206d0 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
206e0 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
206f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
20700 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
20710 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
20720 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
20730 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
20740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
20750 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
20760 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
20770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20780 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
20790 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
207a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
207b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
207c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
207d0 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
207e0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
207f0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
20800 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
20810 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
20820 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
20830 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
20840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
20850 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
20860 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
20870 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
20880 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
20890 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
208a0 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
208b0 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
208c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
208d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
208e0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
208f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
20900 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
20910 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
20920 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
20930 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
20940 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
20950 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
20960 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
20970 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
20980 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
20990 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
209a0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
209b0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
209c0 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
209d0 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
209e0 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
209f0 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
20a00 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
20a10 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
20a20 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
20a30 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
20a40 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
20a50 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
20a60 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
20a70 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
20a80 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
20a90 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
20aa0 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
20ab0 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
20ac0 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
20ad0 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
20ae0 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
20af0 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
20b00 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
20b10 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
20b20 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
20b30 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
20b40 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
20b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f  */.static int wo
20b60 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
20b70 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
20b80 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
20b90 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
20ba0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
20bb0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
20bc0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
20bd0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
20be0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
20bf0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
20c00 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20c20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
20c30 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
20c40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
20c50 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
20c60 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
20c70 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
20c80 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
20c90 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
20ca0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
20cb0 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
20cc0 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
20cd0 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
20ce0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
20cf0 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
20d00 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
20d10 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
20d20 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
20d30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
20d40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
20d50 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
20d60 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
20d70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20d80 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
20d90 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
20da0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
20db0 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
20dc0 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
20dd0 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
20de0 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
20df0 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
20e00 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
20e10 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
20e20 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
20e30 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
20e40 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
20e50 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
20e60 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
20e70 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
20e80 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
20e90 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
20ea0 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b  c int vfs_unlink
20eb0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
20ec0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
20ed0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
20ee0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
20ef0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
20f00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20f10 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
20f20 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
20f30 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
20f40 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
20f50 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
20f60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20f70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
20f80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
20f90 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
20fa0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
20fb0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
20fc0 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a  te3_vfs *pMain;.
20fd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61    sqlite3_vfs *a
20fe0 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69  pVfs[20];.  sqli
20ff0 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f  te3_vfs one, two
21000 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
21010 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20  _unregister(0); 
21020 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
21030 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c  of NULL is harml
21040 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61  ess */.  one.zNa
21050 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20  me = "__one";.  
21060 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74  two.zName = "__t
21070 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  wo";..  /* Calli
21080 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  ng sqlite3_vfs_r
21090 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e 64  egister with 2nd
210a0 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64   argument of 0 d
210b0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61  oes not.  ** cha
210c0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
210d0 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e  VFS.  */.  pMain
210e0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
210f0 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  ind(0);.  sqlite
21100 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
21110 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  one, 0);.  asser
21120 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70  t( pMain==0 || p
21130 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66  Main==sqlite3_vf
21140 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73  s_find(0) );.  s
21150 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21160 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20  ter(&two, 0);.  
21170 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
21180 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
21190 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
211a0 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66  ;..  /* We can f
211b0 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74 73  ind a VFS by its
211c0 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72   name */.  asser
211d0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
211e0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
211f0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
21200 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21210 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
21220 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  );..  /* Calling
21230 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69   sqlite_vfs_regi
21240 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ster with non-ze
21250 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  ro second parame
21260 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a  ter changes the.
21270 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53    ** default VFS
21280 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73  , even if the 1s
21290 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
212a0 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74 68  n existig VFS th
212b0 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69  at is.  ** previ
212c0 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
212d0 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61   as the non-defa
212e0 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ult..  */.  sqli
212f0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21300 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73  (&one, 1);.  ass
21310 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21320 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
21330 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
21340 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21350 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
21360 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
21370 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21380 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71  0)==&one );.  sq
21390 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
213a0 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61  er(&two, 1);.  a
213b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
213c0 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
213d0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
213e0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
213f0 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
21400 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
21410 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21420 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  d(0)==&two );.  
21430 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20  if( pMain ){.   
21440 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21450 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b  ister(pMain, 1);
21460 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
21470 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
21480 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
21490 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
214a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
214b0 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
214c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
214d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
214e0 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a  pMain );.  }.  .
214f0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
21500 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65  default VFS.  Re
21510 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65  peat until there
21520 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53   are no more VFS
21530 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  es.  ** register
21540 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
21550 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56  =0; i<sizeof(apV
21560 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73  fs)/sizeof(apVfs
21570 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
21580 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
21590 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
215a0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
215b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
215c0 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
215d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
215e0 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
215f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
21600 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
21610 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  Vfs[i]);.      a
21620 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
21630 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
21640 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
21650 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
21660 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
21670 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a  s_find(0) );.  .
21680 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
21690 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f  e main VFS as no
216a0 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20  n-default (will 
216b0 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c  be made default,
216c0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c   since.  ** it'l
216d0 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e  l be the only on
216e0 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e  e in existence).
216f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
21700 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
21710 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  in, 0);.  assert
21720 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21730 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
21740 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73    .  /* Un-regis
21750 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
21760 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72   again to restor
21770 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c  e an empty VFS l
21780 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
21790 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
217a0 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74  pMain);.  assert
217b0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
217c0 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f  _find(0) );..  /
217d0 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53  * Relink all VFS
217e0 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
217f0 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28  der. */  .  for(
21800 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i=sizeof(apVfs)/
21810 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
21820 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
21830 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
21840 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
21850 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61  3_vfs_register(a
21860 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20  pVfs[i], 1);.   
21870 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
21880 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
21890 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20  _find(0) );.    
218a0 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
218b0 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
218c0 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
218d0 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Name) );.    }. 
218e0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73   }..  /* Unregis
218f0 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56  ter out sample V
21900 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  FSes. */.  sqlit
21910 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
21920 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
21930 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
21940 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55  r(&two);..  /* U
21950 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 56  nregistering a V
21960 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63  FS that is not c
21970 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65  urrently registe
21980 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20  red is harmless 
21990 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
219a0 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65  _unregister(&one
219b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
219c0 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f  _unregister(&two
219d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
219e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
219f0 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61  _one")==0 );.  a
21a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21a10 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
21a20 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  ==0 );..  /* We 
21a30 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77  should be left w
21a40 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ith the original
21a50 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61 63   default VFS bac
21a60 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72  k as the.  ** or
21a70 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65  iginal */.  asse
21a80 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21a90 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
21aa0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
21ab0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
21ac0 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66  cmd:   vfs_initf
21ad0 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54  ail_test.**.** T
21ae0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
21af0 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f  attempts to vfs_
21b00 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67  find and vfs_reg
21b10 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  ister when the.*
21b20 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
21b30 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65  lize() interface
21b40 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c   is failing.  Al
21b50 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66  l calls should f
21b60 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ail..*/.static i
21b70 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  nt vfs_initfail_
21b80 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
21b90 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
21ba0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
21bb0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
21bc0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
21bd0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21be0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
21bf0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
21c00 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
21c10 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
21c20 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
21c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21c40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
21c50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
21c60 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
21c70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21c80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
21c90 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  e;.  one.zName =
21ca0 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28   "__one";..  if(
21cb0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21cc0 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
21cd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
21ce0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21cf0 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  &one, 0);.  if( 
21d00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21d10 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
21d20 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
21d30 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
21d40 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  one, 1);.  if( s
21d50 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21d60 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
21d70 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
21d80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21d90 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a   Saved VFSes.*/.
21da0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
21db0 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73  fs *apVfs[20];.s
21dc0 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d  tatic int nVfs =
21dd0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   0;../*.** tclcm
21de0 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73  d:   vfs_unregis
21df0 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e  ter_all.**.** Un
21e00 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  register all VFS
21e10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
21e20 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  t vfs_unregister
21e30 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
21e40 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
21e50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
21e60 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
21e70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
21e80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21e90 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
21ea0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
21eb0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
21ec0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
21ed0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
21ee0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
21ef0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
21f00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
21f10 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
21f20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21f30 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
21f40 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
21f50 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  apVfs); i++){.  
21f60 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
21f70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21f80 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
21f90 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i]==0 ) break;. 
21fa0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
21fb0 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
21fc0 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20  i]);.  }.  nVfs 
21fd0 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = i;.  return TC
21fe0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
21ff0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65  lcmd:   vfs_rere
22000 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
22010 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53   Restore all VFS
22020 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65 6d  es that were rem
22030 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75  oved using vfs_u
22040 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f  nregister_all.*/
22050 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
22060 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  reregister_all(.
22070 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22080 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
22090 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
220a0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
220b0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
220c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
220d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
220e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
220f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22100 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22120 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22130 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22140 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22150 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22160 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22170 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
22180 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVfs; i++){.    
22190 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
221a0 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69  ster(apVfs[i], i
221b0 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
221c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
221d0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
221e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
221f0 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
22200 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
22210 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
22220 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
22230 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
22240 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
22250 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
22260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22270 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
22280 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
22290 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
222a0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
222b0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
222c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
222d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
222e0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
222f0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
22300 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
22310 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
22320 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
22340 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22350 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22360 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22370 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22380 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73  nt iArg = 0;.  s
22390 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
223a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
223b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
223c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
223d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
223e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
223f0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
22400 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
22410 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
22420 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
22430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22440 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
22450 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
22460 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22470 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
22480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22490 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
224a0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c  e_control(db, 0,
224b0 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73   0, &iArg);.  as
224c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
224d0 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72  _NOTFOUND );.  r
224e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
224f0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
22500 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
22510 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
22520 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
22530 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22540 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
22550 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
22560 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
22570 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
22580 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22590 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
225a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
225b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
225c0 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
225d0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
225e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
225f0 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
22600 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75  ERROR );..  retu
22610 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
22620 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
22630 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
22640 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a  errno_test DB.**
22650 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
22660 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
22670 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22680 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
22690 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
226a0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
226b0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53  f the SQLITE_LAS
226c0 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f  T_ERRNO verb..*/
226d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
226e0 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
226f0 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
22700 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
22710 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
22720 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
22730 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
22740 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22750 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
22760 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
22770 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
22780 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
22790 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
227a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
227b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
227c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
227d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
227e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
227f0 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
22800 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
22810 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
22820 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
22830 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
22840 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
22850 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
22860 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
22870 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
22880 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
22890 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
228a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
228b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
228c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
228d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
228e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
228f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
22900 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22910 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
22920 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
22930 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
22940 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
22950 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
22960 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
22970 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
22980 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
22990 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
229a0 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
229b0 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
229c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
229d0 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
229e0 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
229f0 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
22a00 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
22a10 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
22a20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
22a30 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
22a40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22a50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
22a60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
22a70 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22a80 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63    file_control_c
22a90 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42  hunksize_test DB
22aa0 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a   DBNAME SIZE.**.
22ab0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
22ac0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
22ad0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22ae0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
22af0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
22b00 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
22b10 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
22b20 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
22b30 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
22b40 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
22b50 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
22b60 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22b70 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a  chunksize_test(.
22b80 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22b90 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
22ba0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
22bb0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
22bc0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
22bd0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
22be0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
22bf0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
22c00 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22c10 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22c30 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22c40 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22c50 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22c60 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22c70 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22c80 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
22c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22ca0 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f  ew chunk size */
22cb0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cd0 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22     /* Db name ("
22ce0 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
22cf0 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  c.) */.  sqlite3
22d00 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
22d10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
22d20 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
22d30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d50 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   /* file_control
22d60 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
22d70 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  /..  if( objc!=4
22d80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
22d90 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
22da0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
22db0 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20  NAME SIZE");.   
22dc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22dd0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22de0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22df0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22e00 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a  objv[1]), &db) .
22e10 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74     || Tcl_GetInt
22e20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
22e30 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29  objv[3], &nSize)
22e40 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  .  ){.   return 
22e50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22e60 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
22e70 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
22e80 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30   if( zDb[0]=='\0
22e90 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a  ' ) zDb = NULL;.
22ea0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22eb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22ec0 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e   zDb, SQLITE_FCN
22ed0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28  TL_CHUNK_SIZE, (
22ee0 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
22ef0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
22f00 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
22f10 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
22f20 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
22f30 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
22f40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22f50 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
22f60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
22f70 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
22f80 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
22f90 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d  nt_test DB DBNAM
22fa0 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69  E SIZE.**.** Thi
22fb0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
22fc0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
22fd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
22fe0 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20 53  rface .** with S
22ff0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
23000 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20  _HINT.*/.static 
23010 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
23020 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a  _sizehint_test(.
23030 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23040 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23050 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23060 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23070 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23080 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23090 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
230a0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
230b0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
230c0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
230d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
230e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
230f0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
23100 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
23110 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
23120 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
23130 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b 20 20  WideInt nSize;  
23140 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
23150 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20  inted size */.  
23160 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
23170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23180 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69  /* Db name ("mai
23190 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
231a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
231b0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
231c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
231d0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
231e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23200 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20   file_control() 
23210 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  return code */..
23220 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
23230 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
23240 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
23250 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
23260 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65  E SIZE");.    re
23270 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23280 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
23290 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
232a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
232b0 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20  v[1]), &db) .   
232c0 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  || Tcl_GetWideIn
232d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
232e0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
232f0 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
23300 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23310 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
23320 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
23330 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
23340 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
23350 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
23360 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
23370 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
23380 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28  NTL_SIZE_HINT, (
23390 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
233a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
233b0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
233c0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
233d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
233e0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
233f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23400 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
23410 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
23420 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
23430 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
23440 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57 44 0a  oxy_test DB PWD.
23450 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23460 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
23470 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23480 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
23490 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
234a0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
234b0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47   of the SQLITE_G
234c0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
234d0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   and.** SQLITE_S
234e0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
234f0 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69   verbs..*/.stati
23500 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
23510 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
23520 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23530 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23540 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23550 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23560 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23570 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23580 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23590 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
235a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
235b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
235c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
235d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
235e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
235f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23600 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23610 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
23620 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20  qlite3 *db;.  . 
23630 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
23640 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
23650 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
23660 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
23670 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
236a0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
236b0 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30 29 3b  , " DB PWD", 0);
236c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
236d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
236e0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
236f0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23700 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23710 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  b) ){.   return 
23720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23730 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
23740 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
23750 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69  KING_STYLE).#  i
23760 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
23770 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65  E__).#    define
23780 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
23790 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23  OCKING_STYLE 1.#
237a0 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
237b0 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
237c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30  _LOCKING_STYLE 0
237d0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
237e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
237f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
23800 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
23810 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63  PLE__).  {.    c
23820 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a 20  har *testPath;. 
23830 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
23840 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e  nt nPwd;.    con
23850 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20  st char *zPwd;. 
23860 20 20 20 63 68 61 72 20 70 72 6f 78 79 50 61 74     char proxyPat
23870 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20  h[400];.    .   
23880 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74 53   zPwd = Tcl_GetS
23890 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
238a0 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20  v[2], &nPwd);.  
238b0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72 6f    if( sizeof(pro
238c0 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30 20  xyPath)<nPwd+20 
238d0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
238e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
238f0 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22 2c  , "PWD too big",
23900 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20   (void*)0);.    
23910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23920 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 70  OR;.    }.    sp
23930 72 69 6e 74 66 28 70 72 6f 78 79 50 61 74 68 2c  rintf(proxyPath,
23940 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22   "%s/test.proxy"
23950 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20  , zPwd);.    rc 
23960 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
23970 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
23980 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
23990 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79  PROXYFILE, proxy
239a0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72  Path);.    if( r
239b0 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  c ){.      Tcl_S
239c0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
239d0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
239e0 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72  j(rc)); .      r
239f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23a00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
23a10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23a20 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
23a30 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
23a40 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61  OXYFILE, &testPa
23a50 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72  th);.    if( str
23a60 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74  ncmp(proxyPath,t
23a70 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20  estPath,11) ){. 
23a80 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
23a90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c  esult(interp, "L
23aa0 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64  ock proxy file d
23ab0 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  id not match the
23ac0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73    "previously as
23af0 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30  signed value", 0
23b00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23b10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
23b20 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
23b30 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
23b40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
23b50 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
23b60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
23b70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
23b80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23b90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
23ba0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53  , NULL, SQLITE_S
23bb0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
23bc0 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
23bd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23be0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
23bf0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
23c00 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
23c10 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
23c20 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
23c30 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
23c40 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69   TCL_OK;  .}..#i
23c50 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
23c60 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23c70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
23c80 33 32 5f 61 76 5f 72 65 74 72 79 20 44 42 20 20  32_av_retry DB  
23c90 4e 52 45 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a  NRETRY  DELAY.**
23ca0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
23cb0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
23cc0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23cd0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
23ce0 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
23cf0 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
23d00 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  ETRY opcode..*/.
23d10 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23d20 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76  control_win32_av
23d30 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e 74  _retry(.  Client
23d40 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23d50 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23d60 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
23d70 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
23d80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23d90 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23da0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23db0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23dc0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23dd0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23df0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23e00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23e10 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23e20 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23e30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
23e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
23e50 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b   a[2];.  char z[
23e60 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
23e70 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
23e80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23e90 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23ea0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23eb0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
23ec0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23ed0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
23ee0 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22 2c  B NRETRY DELAY",
23ef0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23f10 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
23f20 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
23f30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
23f40 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
23f50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23f60 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
23f70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
23f80 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b  rp, objv[2], &a[
23f90 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  0]) ) return TCL
23fa0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
23fb0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
23fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
23fd0 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72 6e   &a[1]) ) return
23fe0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
23ff0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
24000 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
24010 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  , SQLITE_FCNTL_W
24020 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20 28  IN32_AV_RETRY, (
24030 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69  void*)a);.  sqli
24040 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
24050 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
24060 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c  d %d", rc, a[0],
24070 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70   a[1]);.  Tcl_Ap
24080 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
24090 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
240a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
240b0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
240c0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
240d0 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61  rol_win32_set_ha
240e0 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a  ndle DB HANDLE.*
240f0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
24100 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
24110 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24120 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69  rol interface wi
24130 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  th.** the SQLITE
24140 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
24150 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a  _HANDLE opcode..
24160 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
24170 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
24180 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43  _set_handle(.  C
24190 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
241a0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
241b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
241c0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
241d0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
241e0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
241f0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24200 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24210 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24220 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24240 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24250 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
24260 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
24270 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24280 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
24290 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
242a0 20 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d    HANDLE hFile =
242b0 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b   NULL;.  char z[
242c0 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
242d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
242e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
242f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
24300 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
24310 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
24320 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
24330 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
24340 42 20 48 41 4e 44 4c 45 22 2c 20 30 29 3b 0a 20  B HANDLE", 0);. 
24350 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24360 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
24370 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
24380 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
24390 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
243a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
243b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
243c0 69 66 28 20 67 65 74 57 69 6e 33 32 48 61 6e 64  if( getWin32Hand
243d0 6c 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  le(interp, Tcl_G
243e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
243f0 29 2c 20 26 68 46 69 6c 65 29 20 29 7b 0a 20 20  ), &hFile) ){.  
24400 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24410 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
24420 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24430 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24440 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
24450 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20  _SET_HANDLE,.   
24460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24470 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
24480 26 68 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74  &hFile);.  sqlit
24490 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
244a0 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70  of(z), z, "%d %p
244b0 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a 29 68 46  ", rc, (void*)hF
244c0 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ile);.  Tcl_Appe
244d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
244e0 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
244f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
24500 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   .}.#endif../*.*
24510 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24520 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
24530 5f 77 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d  _wal DB PERSIST-
24540 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  FLAG.**.** This 
24550 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24560 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
24570 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
24580 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
24590 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
245a0 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e  SIST_WAL opcode.
245b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
245c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
245d0 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e  ist_wal(.  Clien
245e0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
245f0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24600 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24610 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24620 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24630 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
24640 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24650 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
24660 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
24670 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
24680 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24690 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
246a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
246b0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
246c0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
246d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
246e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
246f0 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68  t bPersist;.  ch
24700 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
24710 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
24720 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
24730 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
24740 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
24750 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
24760 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
24770 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
24780 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29  , " DB FLAG", 0)
24790 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
247a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
247b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
247c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
247d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
247e0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
247f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24800 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
24810 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
24820 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73   objv[2], &bPers
24830 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  ist) ) return TC
24840 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
24850 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24860 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
24870 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
24880 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29  IST_WAL, (void*)
24890 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71  &bPersist);.  sq
248a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
248b0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
248c0 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69   %d", rc, bPersi
248d0 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  st);.  Tcl_Appen
248e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
248f0 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
24900 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
24910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
24920 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
24930 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
24940 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41  rite DB PSOW-FLA
24950 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
24960 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
24970 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
24980 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
24990 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
249a0 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
249b0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70  AFE_OVERWRITE op
249c0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
249d0 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
249e0 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
249f0 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  rite(.  ClientDa
24a00 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
24a10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
24a20 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
24a30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24a40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24a50 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24a60 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24a70 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24a80 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24a90 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24aa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24ab0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24ac0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24ad0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24ae0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24af0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24b00 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
24b10 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
24b20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
24b30 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
24b40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24b50 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
24b60 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
24b70 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24b80 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
24b90 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
24ba0 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
24bb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24bc0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24bd0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24be0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24bf0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
24c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24c10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
24c20 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
24c30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
24c40 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
24c50 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
24c60 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24c70 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49  rol(db,NULL,SQLI
24c80 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
24c90 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f  FE_OVERWRITE,(vo
24ca0 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74  id*)&b);.  sqlit
24cb0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
24cc0 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
24cd0 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c  ", rc, b);.  Tcl
24ce0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24cf0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
24d00 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
24d10 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
24d20 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
24d30 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20  control_vfsname 
24d40 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a  DB ?AUXDB?.**.**
24d50 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
24d60 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
24d70 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53  the stack of VFS
24d80 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
24d90 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76  t file_control_v
24da0 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74  fsname(.  Client
24db0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
24dc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
24dd0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
24de0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24df0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24e00 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24e10 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24e20 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24e30 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24e40 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24e50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24e60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24e70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
24e80 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
24e90 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
24ea0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
24eb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24ec0 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  DbName = "main";
24ed0 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d  .  char *zVfsNam
24ee0 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  e = 0;..  if( ob
24ef0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=2 && objc!=3
24f00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
24f10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24f20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
24f30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
24f40 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
24f50 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
24f60 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41  [0], 0), " DB ?A
24f70 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20  UXDB?", 0);.    
24f80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24f90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
24fa0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
24fb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24fc0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
24fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24fe0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24ff0 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20   objc==3 ){.    
25000 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
25010 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
25020 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
25030 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
25040 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45   zDbName, SQLITE
25050 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28  _FCNTL_VFSNAME,(
25060 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29  void*)&zVfsName)
25070 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
25080 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66  sult(interp, zVf
25090 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  sName, (char*)0)
250a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
250b0 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65  (zVfsName);.  re
250c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
250d0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
250e0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
250f0 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f  empfilename DB ?
25100 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74  AUXDB?.**.** Ret
25110 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
25120 74 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  t is a temporary
25130 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61   filename.*/.sta
25140 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
25150 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
25160 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25170 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25180 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25190 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
251a0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
251b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
251c0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
251d0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
251e0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
251f0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25210 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25220 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25230 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25240 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25250 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
25260 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
25270 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
25280 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68  e = "main";.  ch
25290 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a  ar *zTName = 0;.
252a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26  .  if( objc!=2 &
252b0 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  & objc!=3 ){.   
252c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
252d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
252e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
252f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25300 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
25310 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
25320 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c  , " DB ?AUXDB?",
25330 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
25340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25350 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
25360 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
25370 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
25380 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
25390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
253a0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
253b0 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65  3 ){.    zDbName
253c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
253d0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20  (objv[2]);.  }. 
253e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
253f0 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d  ntrol(db, zDbNam
25400 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
25410 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76  TEMPFILENAME, (v
25420 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20  oid*)&zTName);. 
25430 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25440 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65  t(interp, zTName
25450 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73  , (char*)0);.  s
25460 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61  qlite3_free(zTNa
25470 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  me);.  return TC
25480 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  L_OK;  .}.../*.*
25490 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69  * tclcmd:   sqli
254a0 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a  te3_vfs_list.**.
254b0 2a 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63  **   Return a tc
254c0 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  l list containin
254d0 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  g the names of a
254e0 6c 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66  ll registered vf
254f0 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s's..*/.static i
25500 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43  nt vfs_list(.  C
25510 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
25520 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
25530 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
25540 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
25550 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
25560 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
25570 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
25580 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
25590 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
255a0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
255b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
255c0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
255d0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
255e0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
255f0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
25600 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
25610 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63  _vfs *pVfs;.  Tc
25620 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63  l_Obj *pRet = Tc
25630 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66  l_NewObj();.  if
25640 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
25650 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
25660 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
25670 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
25680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25690 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c  }.  for(pVfs=sql
256a0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
256b0 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66  ; pVfs; pVfs=pVf
256c0 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54  s->pNext){.    T
256d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
256e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
256f0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
25700 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61  ingObj(pVfs->zNa
25710 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  me, -1));.  }.  
25720 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
25730 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
25740 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25750 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
25760 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69  md:   sqlite3_li
25770 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a  mit DB ID VALUE.
25780 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
25790 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
257a0 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e  sqlite3_limit in
257b0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
257c0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
257d0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
257e0 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
257f0 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28   int test_limit(
25800 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25810 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25820 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25830 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25840 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25850 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25860 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25870 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25880 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25890 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258b0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
258c0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
258d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
258e0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
258f0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
25900 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
25910 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  rc;.  static con
25920 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
25930 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
25940 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61     int id;.  } a
25950 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  Id[] = {.    { "
25960 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
25970 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  GTH",           
25980 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
25990 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
259a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
259b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
259c0 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
259d0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53    SQLITE_LIMIT_S
259e0 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  QL_LENGTH       
259f0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25a00 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
25a10 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  N",             
25a20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
25a30 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20  LUMN            
25a40 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
25a50 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
25a60 45 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  EPTH",          
25a70 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
25a80 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20  R_DEPTH         
25a90 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25aa0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
25ab0 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53  D_SELECT",     S
25ac0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
25ad0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20  OUND_SELECT     
25ae0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25af0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22  E_LIMIT_VDBE_OP"
25b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,             SQ
25b10 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
25b20 4f 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20  OP              
25b30 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25b40 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
25b50 41 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c  ARG",        SQL
25b60 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
25b70 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d  ON_ARG         }
25b80 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25b90 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c  LIMIT_ATTACHED",
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25bb0 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
25bc0 44 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  D             },
25bd0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25be0 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
25bf0 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54  N_LENGTH", SQLIT
25c00 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
25c10 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a  TERN_LENGTH  },.
25c20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25c30 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
25c40 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45  BER",     SQLITE
25c50 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
25c60 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20  NUMBER      },. 
25c70 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
25c80 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
25c90 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
25ca0 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
25cb0 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  PTH        },.  
25cc0 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66    .    /* Out of
25cd0 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73 65   range test case
25ce0 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49  s */.    { "SQLI
25cf0 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c  TE_LIMIT_TOOSMAL
25d00 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d  L",            -
25d10 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d30 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25d40 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c  E_LIMIT_TOOBIG",
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
25d60 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
25d70 45 52 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20  ER_DEPTH+1      
25d80 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c  },.  };.  int i,
25d90 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a   id;.  int val;.
25da0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
25db0 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  d;..  if( objc!=
25dc0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
25dd0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
25de0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
25df0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
25e00 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
25e10 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
25e20 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49  v[0], 0), " DB I
25e30 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  D VALUE", 0);.  
25e40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25e50 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
25e60 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
25e70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
25e80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25e90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25ea0 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f  OR;.  zId = Tcl_
25eb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
25ec0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
25ed0 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  <sizeof(aId)/siz
25ee0 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b  eof(aId[0]); i++
25ef0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
25f00 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e  p(zId, aId[i].zN
25f10 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
25f20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b   id = aId[i].id;
25f30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
25f40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
25f50 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  =sizeof(aId)/siz
25f60 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20  eof(aId[0]) ){. 
25f70 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25f80 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
25f90 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a  nown limit type:
25fa0 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29   ", zId, (char*)
25fb0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
25fc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25fd0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
25fe0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
25ff0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
26000 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26010 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26020 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61  limit(db, id, va
26030 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
26040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
26050 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
26060 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
26070 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
26080 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e  clcmd:  save_prn
26090 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61  g_state.**.** Sa
260a0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
260b0 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  the pseudo-rando
260c0 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
260d0 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61  or..** At the sa
260e0 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20  me time, verify 
260f0 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73  that sqlite3_tes
26100 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  t_control works 
26110 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c  even when.** cal
26120 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d  led with an out-
26130 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e  of-range opcode.
26140 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
26150 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
26160 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
26170 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
26180 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
26190 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
261a0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
261b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
261c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
261d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
261e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
261f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26210 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26220 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26230 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26240 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26250 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
26260 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
26270 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
26280 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
26290 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
262a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
262b0 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
262c0 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
262d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
262e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
262f0 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
26300 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
26310 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
26320 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
26330 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
26340 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
26350 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26360 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26370 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26380 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26390 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
263a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
263b0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
263c0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
263d0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
263e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26400 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26410 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26420 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26430 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26440 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26450 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
26460 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
26470 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29  RL_PRNG_RESTORE)
26480 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26490 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
264a0 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  d:  reset_prng_s
264b0 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
264c0 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  nt reset_prng_st
264d0 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
264e0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
264f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26500 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26510 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26520 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26530 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26540 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26550 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26560 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26570 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26580 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26590 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
265a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
265b0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
265c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
265d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
265e0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
265f0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
26600 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
26610 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
26620 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d  cmd:  database_m
26630 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a  ay_be_corrupt.**
26640 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
26650 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
26660 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
26670 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
26680 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d  ds, set the norm
26690 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f  al.** state of o
266a0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
266b0 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
266c0 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28  _may_be_corrupt(
266d0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
266e0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
266f0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
26700 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
26710 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
26720 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
26730 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
26740 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
26750 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
26760 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26780 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
26790 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
267a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
267b0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
267c0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
267d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
267e0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
267f0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
26800 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
26810 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
26820 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f  lcmd:  database_
26830 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a  never_corrupt.**
26840 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
26850 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
26860 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c   are always well
26870 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65  -formed.  This e
26880 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61 73 73  nables extra ass
26890 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
268a0 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f  nts that test co
268b0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72  nditions that ar
268c0 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f  e always true fo
268d0 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  r well-formed da
268e0 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74  tabases..*/.stat
268f0 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f  ic int database_
26900 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20  never_corrupt(. 
26910 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26920 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26930 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26940 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26950 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26960 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26970 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26980 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26990 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
269a0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
269b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
269c0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
269d0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
269e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
269f0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26a00 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26a10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
26a20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
26a30 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31  NEVER_CORRUPT, 1
26a40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
26a50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
26a60 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61  cmd:  pcache_sta
26a70 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
26a80 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
26a90 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ts(.  ClientData
26aa0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26ab0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26ac0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26ad0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26ae0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26af0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26b00 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26b10 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26b20 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26b30 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26b40 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26b50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26b60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26b70 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26b80 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26b90 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20  int nMin;.  int 
26ba0 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72  nMax;.  int nCur
26bb0 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rent;.  int nRec
26bc0 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f  yclable;.  Tcl_O
26bd0 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c  bj *pRet;..  sql
26be0 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28  ite3PcacheStats(
26bf0 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78  &nCurrent, &nMax
26c00 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63  , &nMin, &nRecyc
26c10 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20  lable);..  pRet 
26c20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
26c30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26c40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
26c50 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
26c60 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65  StringObj("curre
26c70 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  nt", -1));.  Tcl
26c80 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26c90 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26ca0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
26cb0 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  j(nCurrent));.  
26cc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
26cd0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26ce0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
26cf0 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d  ringObj("max", -
26d00 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
26d10 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26d20 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
26d30 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78  l_NewIntObj(nMax
26d40 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
26d50 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
26d60 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
26d70 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
26d80 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  in", -1));.  Tcl
26d90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
26da0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
26db0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
26dc0 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f  j(nMin));.  Tcl_
26dd0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26de0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
26df0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
26e00 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22  Obj("recyclable"
26e10 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
26e20 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26e30 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26e40 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
26e50 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20  Recyclable));.. 
26e60 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
26e70 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
26e80 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
26e90 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
26ea0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
26eb0 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
26ec0 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  void test_unlock
26ed0 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20  _notify_cb(void 
26ee0 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  **aArg, int nArg
26ef0 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  ){.  int ii;.  f
26f00 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67  or(ii=0; ii<nArg
26f10 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ; ii++){.    Tcl
26f20 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74  _EvalEx((Tcl_Int
26f30 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20  erp *)aArg[ii], 
26f40 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
26f50 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
26f60 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  OBAL);.  }.}.#en
26f70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
26f80 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
26f90 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  FY */../*.** tcl
26fa0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e  cmd:  sqlite3_un
26fb0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a  lock_notify db.*
26fc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26fd0 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
26fe0 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20  TIFY.static int 
26ff0 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
27000 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  fy(.  ClientData
27010 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27020 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
27030 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27040 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27050 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27060 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27070 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27080 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
270a0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
270b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
270c0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
270d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
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 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
27110 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
27120 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
27130 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
27140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27150 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
27160 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
27170 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27180 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
27190 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
271a0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
271b0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
271c0 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f  fy(db, test_unlo
271d0 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76  ck_notify_cb, (v
271e0 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20  oid *)interp);. 
271f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
27200 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
27210 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
27220 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
27230 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27240 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
27250 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
27260 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
27270 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69   ?NAME?.*/.stati
27280 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63  c int test_wal_c
27290 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
272a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
272b0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
272c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
272d0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
272e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
272f0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27300 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27310 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27330 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27340 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27350 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27360 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
27370 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
27380 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
27390 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
273a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
273b0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
273c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
273d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
273e0 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a  , "DB ?NAME?");.
273f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27400 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
27410 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27420 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27430 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27440 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
27450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27460 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
27470 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
27480 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
27490 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
274a0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
274b0 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
274c0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
274d0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
274e0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
274f0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
27500 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27510 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27520 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
27530 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44  kpoint_v2 db MOD
27540 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?NAME?.**.** T
27550 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c  his command call
27560 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70  s the wal_checkp
27570 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69  oint_v2() functi
27580 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63  on with the spec
27590 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72  ified.** mode ar
275a0 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c  gument (passive,
275b0 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74   full or restart
275c0 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  ). If present, t
275d0 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
275e0 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73  .** NAME is pass
275f0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27600 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c   argument to wal
27610 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
27620 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e  . If it the.** N
27630 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20  AME argument is 
27640 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e  not present, a N
27650 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70  ULL pointer is p
27660 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  assed instead..*
27670 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63  *.** If wal_chec
27680 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75  kpoint_v2() retu
27690 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
276a0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
276b0 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  BUSY or.** SQLIT
276c0 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20  E_OK, then this 
276d0 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
276e0 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54  TCL_ERROR. The T
276f0 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  cl result is set
27700 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72  .** to the error
27710 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65   message obtaine
27720 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
27730 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  rrmsg()..**.** O
27740 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63  therwise, this c
27750 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ommand returns a
27760 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69   list of three i
27770 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72  ntegers. The fir
27780 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73  st integer.** is
27790 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53   1 if SQLITE_BUS
277a0 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20  Y was returned, 
277b0 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
277c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
277d0 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72  o integers.** ar
277e0 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  e the values ret
277f0 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75  urned via the ou
27800 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20  tput parameters 
27810 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  by wal_checkpoin
27820 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20  t_v2() -.** the 
27830 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
27840 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20   in the log and 
27850 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
27860 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a  ames in the log.
27870 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ** that have bee
27880 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  n checkpointed..
27890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
278a0 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
278b0 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  t_v2(.  ClientDa
278c0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
278d0 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
278e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
278f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27900 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27910 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27920 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27930 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27940 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27950 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27960 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27970 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27980 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27990 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
279a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
279b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74    int rc;..  int
279c0 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c   eMode;.  int nL
279d0 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74  og = -555;.  int
279e0 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20   nCkpt = -555;. 
279f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
27a00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
27a10 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73  aMode[] = { "pas
27a20 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22  sive", "full", "
27a30 72 65 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20  restart", 0 };. 
27a40 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
27a50 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
27a60 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  VE==0 );.  asser
27a70 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
27a80 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a  OINT_FULL==1 );.
27a90 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
27aa0 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
27ab0 41 52 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28  ART==2 );..  if(
27ac0 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
27ad0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
27ae0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27af0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
27b00 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a   MODE ?NAME?");.
27b10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27b20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
27b30 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20   objc==4 ){.    
27b40 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
27b50 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
27b60 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
27b70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
27b80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27b90 31 5d 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20  1]), &db).   || 
27ba0 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
27bb0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
27bc0 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64  [2], aMode, "mod
27bd0 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a  e", 0, &eMode) .
27be0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
27bf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
27c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
27c10 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
27c20 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c  (db, zDb, eMode,
27c30 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b   &nLog, &nCkpt);
27c40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
27c50 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
27c60 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54  TE_BUSY ){.    T
27c70 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
27c80 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
27c90 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
27ca0 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27cb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27cc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
27cd0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
27ce0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27cf0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27d00 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27d10 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c  ewIntObj(rc==SQL
27d20 49 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a  ITE_BUSY?1:0));.
27d30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27d40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27d50 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27d60 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20  IntObj(nLog));. 
27d70 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27d80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27d90 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27da0 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20  ntObj(nCkpt));. 
27db0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27dc0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
27dd0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
27de0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
27df0 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65  md:  test_sqlite
27e00 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a  3_log ?SCRIPT?.*
27e10 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
27e20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20  LogCallback {.  
27e30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74  Tcl_Interp *pInt
27e40 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
27e50 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62  pObj;.} logcallb
27e60 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74  ack = {0, 0};.st
27e70 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61  atic void xLogca
27e80 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75  llback(void *unu
27e90 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68  sed, int err, ch
27ea0 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c  ar *zMsg){.  Tcl
27eb0 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c  _Obj *pNew = Tcl
27ec0 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f  _DuplicateObj(lo
27ed0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
27ee0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
27ef0 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c  unt(pNew);.  Tcl
27f00 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
27f10 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20  ement(.      0, 
27f20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
27f30 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
27f40 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a  rName(err), -1).
27f50 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f    );.  Tcl_ListO
27f60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27f70 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
27f80 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20  StringObj(zMsg, 
27f90 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
27fa0 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63  ObjEx(logcallbac
27fb0 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c  k.pInterp, pNew,
27fc0 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
27fd0 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
27fe0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
27ff0 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73  Count(pNew);.}.s
28000 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
28010 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c  qlite3_log(.  Cl
28020 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
28030 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
28040 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
28050 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
28060 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
28070 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
28080 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
28090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
280a0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
280b0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
280c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
280d0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
280e0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f  ts */.){.  if( o
280f0 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc>2 ){.    Tcl
28100 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
28110 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
28120 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65  SCRIPT");.    re
28130 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28140 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c    }.  if( logcal
28150 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20  lback.pObj ){.  
28160 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
28170 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
28180 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
28190 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a  lback.pObj = 0;.
281a0 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
281b0 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20  pInterp = 0;.   
281c0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
281d0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
281e0 47 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  G, 0, 0);.  }.  
281f0 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
28200 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f    logcallback.pO
28210 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20  bj = objv[1];.  
28220 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
28230 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
28240 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
28250 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
28260 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69  interp;.    sqli
28270 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
28280 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c  E_CONFIG_LOG, xL
28290 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a  ogcallback, 0);.
282a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
282b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
282c0 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f    tcl_objproc CO
282d0 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e  MMANDNAME ARGS..
282e0 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43  ..**.** Run a TC
282f0 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20  L command using 
28300 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65  its objProc inte
28310 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e  rface.  Throw an
28320 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65   error if.** the
28330 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20   command has no 
28340 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
28350 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
28360 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20   runAsObjProc(. 
28370 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
28380 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
28390 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
283a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
283b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
283c0 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63  .  Tcl_CmdInfo c
283d0 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62  mdInfo;.  if( ob
283e0 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
283f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
28400 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
28410 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
28420 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28430 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54  OR;.  }.  if( !T
28440 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
28450 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  o(interp, Tcl_Ge
28460 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
28470 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
28480 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
28490 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
284a0 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
284b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
284c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
284d0 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
284e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
284f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28500 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
28510 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  ==0 ){.    Tcl_A
28520 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28530 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73  rp, "command has
28540 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a   no objProc: ",.
28550 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
28560 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
28570 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ), (char*)0);.  
28580 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28590 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
285a0 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63   cmdInfo.objProc
285b0 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  (cmdInfo.objClie
285c0 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20  ntData, interp, 
285d0 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b  objc-1, objv+1);
285e0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
285f0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
28600 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54  /*.** WARNING: T
28610 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
28620 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c  ction, printExpl
28630 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69  ainQueryPlan() i
28640 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f  s an exact.** co
28650 70 79 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f  py of example co
28660 64 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28  de from eqp.in (
28670 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68  eqp.html). If th
28680 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66  is code is modif
28690 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  ied,.** then the
286a0 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63   documentation c
286b0 6f 70 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  opy needs to be 
286c0 6d 6f 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c  modified as well
286d0 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  ..*/./*.** Argum
286e0 65 6e 74 20 70 53 74 6d 74 20 69 73 20 61 20 70  ent pStmt is a p
286f0 72 65 70 61 72 65 64 20 53 51 4c 20 73 74 61 74  repared SQL stat
28700 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  ement. This func
28710 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a  tion compiles.**
28720 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52   an EXPLAIN QUER
28730 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74  Y PLAN command t
28740 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20  o report on the 
28750 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
28760 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74  nt,.** and print
28770 73 20 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20  s the report to 
28780 73 74 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69  stdout using pri
28790 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72  ntf()..*/.int pr
287a0 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
287b0 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  lan(sqlite3_stmt
287c0 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73   *pStmt){.  cons
287d0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20  t char *zSql;   
287e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
287f0 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68  nput SQL */.  ch
28800 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20  ar *zExplain;   
28810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28820 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49   SQL with EXPLAI
28830 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65  N QUERY PLAN pre
28840 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  pended */.  sqli
28850 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61  te3_stmt *pExpla
28860 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  in;         /* C
28870 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20  ompiled EXPLAIN 
28880 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
28890 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  nd */.  int rc; 
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
288c0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69  n code from sqli
288d0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29  te3_prepare_v2()
288e0 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71   */..  zSql = sq
288f0 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29  lite3_sql(pStmt)
28900 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
28910 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28920 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61  ERROR;..  zExpla
28930 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  in = sqlite3_mpr
28940 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55  intf("EXPLAIN QU
28950 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53  ERY PLAN %s", zS
28960 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c  ql);.  if( zExpl
28970 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ain==0 ) return 
28980 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
28990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
289a0 65 70 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33  epare_v2(sqlite3
289b0 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74  _db_handle(pStmt
289c0 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c  ), zExplain, -1,
289d0 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
289e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
289f0 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20  Explain);.  if( 
28a00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28a10 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68  return rc;..  wh
28a20 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
28a30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45  =sqlite3_step(pE
28a40 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69  xplain) ){.    i
28a50 6e 74 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73  nt iSelectid = s
28a60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
28a70 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a  t(pExplain, 0);.
28a80 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d      int iOrder =
28a90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
28aa0 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29  int(pExplain, 1)
28ab0 3b 0a 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20  ;.    int iFrom 
28ac0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
28ad0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32  _int(pExplain, 2
28ae0 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
28af0 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f  r *zDetail = (co
28b00 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
28b10 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
28b20 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20  Explain, 3);..  
28b30 20 20 70 72 69 6e 74 66 28 22 25 64 20 25 64 20    printf("%d %d 
28b40 25 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63  %d %s\n", iSelec
28b50 74 69 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72  tid, iOrder, iFr
28b60 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20  om, zDetail);.  
28b70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
28b80 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
28b90 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69  plain);.}..stati
28ba0 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74  c int test_print
28bb0 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  _eqp(.  void * c
28bc0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
28bd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28be0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
28bf0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28c00 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
28c10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
28c20 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
28c30 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
28c40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
28c50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
28c60 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
28c70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28c80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
28c90 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
28ca0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28cb0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
28cc0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
28cd0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e  ROR;.  rc = prin
28ce0 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
28cf0 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54  n(pStmt);.  /* T
28d00 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e  his is needed on
28d10 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74   Windows so that
28d20 20 61 20 74 65 73 74 20 63 61 73 65 20 75 73 69   a test case usi
28d30 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75  ng this .  ** fu
28d40 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20  nction can open 
28d50 61 20 72 65 61 64 20 70 69 70 65 20 61 6e 64 20  a read pipe and 
28d60 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f  get the output o
28d70 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c  f.  ** printExpl
28d80 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69  ainQueryPlan() i
28d90 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
28da0 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
28db0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
28dc0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
28dd0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
28de0 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
28df0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
28e00 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
28e10 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a  _EXPLAIN */../*.
28e20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  ** sqlite3_test_
28e30 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47  control VERB ARG
28e40 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  S....*/.static i
28e50 6e 74 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e  nt test_test_con
28e60 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
28e70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
28e80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28e90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
28ea0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28eb0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74  jv[].){.  struct
28ec0 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73   Verb {.    cons
28ed0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
28ee0 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56     int i;.  } aV
28ef0 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  erb[] = {.    { 
28f00 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
28f10 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
28f20 22 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ", SQLITE_TESTCT
28f30 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
28f40 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51  LT }, .    { "SQ
28f50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
28f60 52 54 45 52 5f 4d 4d 41 50 22 2c 20 53 51 4c 49  RTER_MMAP", SQLI
28f70 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
28f80 45 52 5f 4d 4d 41 50 20 7d 2c 20 0a 20 20 7d 3b  ER_MMAP }, .  };
28f90 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
28fa0 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
28fb0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
28fc0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
28fd0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28fe0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
28ff0 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
29000 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29010 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
29020 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
29030 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
29040 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
29050 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
29060 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
29070 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
29080 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
29090 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
290a0 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
290b0 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
290c0 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
290d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
290e0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
290f0 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
29100 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
29110 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
29120 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
29130 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
29140 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
29150 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29160 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
29170 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
29180 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
29190 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
291a0 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
291b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
291c0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
291d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
291e0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
291f0 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
29200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29210 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
29220 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
29230 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
29240 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20    int val;.     
29250 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29260 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
29270 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
29280 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
29290 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 2, objv, "DB
292a0 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20   LIMIT");.      
292b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
292c0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
292d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
292e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
292f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
29300 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
29310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
29320 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
29330 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
29340 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
29350 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29360 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
29370 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
29380 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
29390 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76  RTER_MMAP, db, v
293a0 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
293b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
293c0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
293d0 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
293e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20   TCL_OK;.}..#if 
293f0 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23  SQLITE_OS_UNIX.#
29400 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
29410 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
29420 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a  ys/resource.h>..
29430 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
29440 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69  getrusage(.  voi
29450 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
29460 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29470 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
29480 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
29490 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
294a0 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20  har buf[1024];. 
294b0 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 72   struct rusage r
294c0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30  ;.  memset(&r, 0
294d0 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  , sizeof(r));.  
294e0 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
294f0 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73  _SELF, &r);..  s
29500 70 72 69 6e 74 66 28 62 75 66 2c 20 22 72 75 5f  printf(buf, "ru_
29510 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75  utime=%d.%06d ru
29520 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72  _stime=%d.%06d r
29530 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d  u_minflt=%d ru_m
29540 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20  ajflt=%d", .    
29550 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e  (int)r.ru_utime.
29560 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72  tv_sec, (int)r.r
29570 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c  u_utime.tv_usec,
29580 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
29590 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69  stime.tv_sec, (i
295a0 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76  nt)r.ru_stime.tv
295b0 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74  _usec, .    (int
295c0 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69  )r.ru_minflt, (i
295d0 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20  nt)r.ru_majflt. 
295e0 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   );.  Tcl_SetObj
295f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
29600 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29610 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  buf, -1));.  ret
29620 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
29630 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
29640 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e  _OS_WIN./*.** In
29650 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
29660 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
29670 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77  hread into the w
29680 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b  indows file lock
29690 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64  er.** background
296a0 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75   thread..*/.stru
296b0 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
296c0 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e  er {.  char *evN
296d0 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
296e0 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73  me of event to s
296f0 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61  ignal thread sta
29700 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  rtup */.  HANDLE
29710 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   h;           /*
29720 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66   Handle of the f
29730 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
29740 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31   */.  int delay1
29750 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c  ;         /* Del
29760 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e  ay before lockin
29770 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79  g */.  int delay
29780 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  2;         /* De
29790 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63  lay before unloc
297a0 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  king */.  int ok
297b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
297c0 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a   Finished ok */.
297d0 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20    int err;      
297e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
297f0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
29800 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a   */.};.#endif...
29810 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
29820 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63  N.#include <proc
29830 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65  ess.h>./*.** The
29840 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
29850 61 64 20 74 68 61 74 20 64 6f 65 73 20 66 69 6c  ad that does fil
29860 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
29870 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33 32 5f  atic void win32_
29880 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64  file_locker(void
29890 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 73   *pAppData){.  s
298a0 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
298b0 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74 72 75  ocker *p = (stru
298c0 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
298d0 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a 20 20  er*)pAppData;.  
298e0 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b  if( p->evName ){
298f0 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76 20 3d  .    HANDLE ev =
29900 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45 4e 54   OpenEvent(EVENT
29910 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c 20 46  _MODIFY_STATE, F
29920 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29  ALSE, p->evName)
29930 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20 29 7b  ;.    if ( ev ){
29940 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e 74 28  .      SetEvent(
29950 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65  ev);.      Close
29960 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20  Handle(ev);.    
29970 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64  }.  }.  if( p->d
29980 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28 70 2d  elay1 ) Sleep(p-
29990 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66 28 20  >delay1);.  if( 
299a0 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30  LockFile(p->h, 0
299b0 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20  , 0, 100000000, 
299c0 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65 70 28  0) ){.    Sleep(
299d0 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20 20 20  p->delay2);.    
299e0 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  UnlockFile(p->h,
299f0 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
29a00 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20  , 0);.    p->ok 
29a10 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
29a20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20    p->err = 1;.  
29a30 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  }.  CloseHandle(
29a40 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20  p->h);.  p->h = 
29a50 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d  0;.  p->delay1 =
29a60 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20   0;.  p->delay2 
29a70 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  = 0;.}.#endif..#
29a80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29a90 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b  ./*.**      lock
29aa0 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45  _win32_file FILE
29ab0 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41  NAME DELAY1 DELA
29ac0 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20  Y2.**.** Get an 
29ad0 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64 69 74  exclusive mandit
29ae0 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65  ory lock on file
29af0 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c   for DELAY2 mill
29b00 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69  iseconds..** Wai
29b10 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65  t DELAY1 millise
29b20 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61 63 71  conds before acq
29b30 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e  uiring the lock.
29b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29b50 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 28 0a  in32_file_lock(.
29b60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
29b70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
29b80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
29b90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
29ba0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
29bb0 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  {.  static struc
29bc0 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65  t win32FileLocke
29bd0 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32 5f 66  r x = { "win32_f
29be0 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20 30 2c  ile_lock", 0, 0,
29bf0 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 63 6f   0, 0, 0 };.  co
29c00 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
29c10 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  ame;.  char zBuf
29c20 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72 65 74  [200];.  int ret
29c30 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45  ry = 0;.  HANDLE
29c40 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77 52 65   ev;.  DWORD wRe
29c50 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f  sult;.  .  if( o
29c60 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d  bjc!=4 && objc!=
29c70 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
29c80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29c90 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
29ca0 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45 4c 41  NAME DELAY1 DELA
29cb0 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Y2");.    return
29cc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29cd0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20 29 7b    if( objc==1 ){
29ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29cf0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
29d00 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20 25 64  f), zBuf, "%d %d
29d10 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20 20 20   %d %d %d",.    
29d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d30 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20 78 2e   x.ok, x.err, x.
29d40 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61 79 32  delay1, x.delay2
29d50 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63 6c 5f  , x.h);.    Tcl_
29d60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29d70 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  erp, zBuf, (char
29d80 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
29d90 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 77   TCL_OK;.  }.  w
29da0 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72 65 74  hile( x.h && ret
29db0 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72 65 74  ry<30 ){.    ret
29dc0 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65 70 28  ry++;.    Sleep(
29dd0 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  100);.  }.  if( 
29de0 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  x.h ){.    Tcl_A
29df0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
29e00 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63 68 61  rp, "busy", (cha
29e10 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
29e20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29e30 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
29e40 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
29e50 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64 65 6c   objv[2], &x.del
29e60 61 79 31 29 20 29 20 72 65 74 75 72 6e 20 54 43  ay1) ) return TC
29e70 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
29e80 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
29e90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
29ea0 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29 20 72  , &x.delay2) ) r
29eb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29ec0 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
29ed0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
29ee0 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d 20 43  v[1]);.  x.h = C
29ef0 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e  reateFile(zFilen
29f00 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52 45 41  ame, GENERIC_REA
29f10 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  D|GENERIC_WRITE,
29f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
29f30 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 7c 46  ILE_SHARE_READ|F
29f40 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
29f50 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c   0, OPEN_ALWAYS,
29f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46  .              F
29f70 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
29f80 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20  RMAL, 0);.  if( 
29f90 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c 5f  !x.h ){.    Tcl_
29fa0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29fb0 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  erp, "cannot ope
29fc0 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69 6c 65  n file: ", zFile
29fd0 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  name, (char*)0);
29fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29ff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 76 20  ERROR;.  }.  ev 
2a000 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28 4e 55  = CreateEvent(NU
2a010 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53 45 2c  LL, TRUE, FALSE,
2a020 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20 69 66   x.evName);.  if
2a030 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20 54 63   ( !ev ){.    Tc
2a040 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2a050 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 63  nterp, "cannot c
2a060 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22 2c 20  reate event: ", 
2a070 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61 72 2a  x.evName, (char*
2a080 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2a090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2a0a0 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28 77 69   _beginthread(wi
2a0b0 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 2c  n32_file_locker,
2a0c0 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29 3b 0a   0, (void*)&x);.
2a0d0 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20 69 66    Sleep(0);.  if
2a0e0 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20 57 61   ( (wResult = Wa
2a0f0 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
2a100 74 28 65 76 2c 20 31 30 30 30 30 29 29 21 3d 57  t(ev, 10000))!=W
2a110 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29 7b 0a  AIT_OBJECT_0 ){.
2a120 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a130 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
2a140 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78 22 2c  ), zBuf, "0x%x",
2a150 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 54   wResult);.    T
2a160 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2a170 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20 66 61  interp, "wait fa
2a180 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c 20 28  iled: ", zBuf, (
2a190 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 43 6c  char*)0);.    Cl
2a1a0 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20  oseHandle(ev);. 
2a1b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a1c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65  ROR;.  }.  Close
2a1d0 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20 72 65  Handle(ev);.  re
2a1e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2a1f0 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69 73 74  /*.**      exist
2a200 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50 41 54  s_win32_path PAT
2a210 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  H.**.** Returns 
2a220 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2a230 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 65  specified path e
2a240 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66 75 6c  xists, whose ful
2a250 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
2a260 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65 64 20  e.** may exceed 
2a270 32 36 30 20 63 68 61 72 61 63 74 65 72 73 20 69  260 characters i
2a280 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
2a290 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
2a2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
2a2b0 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20  2_exists_path(. 
2a2c0 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2a2d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2a2e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2a2f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2a300 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2a310 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2a320 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2a330 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2a340 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a   objv, "PATH");.
2a350 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a360 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
2a370 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2a380 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
2a390 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65  eanObj(.      Ge
2a3a0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
2a3b0 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  ( Tcl_GetUnicode
2a3c0 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41  (objv[1]))!=INVA
2a3d0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
2a3e0 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e  TES ));.  return
2a3f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2a400 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33  *      find_win3
2a410 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a  2_file PATTERN.*
2a420 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c  *.** Returns a l
2a430 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ist of entries i
2a440 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68  n a directory th
2a450 61 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65  at match the spe
2a460 63 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a  cified pattern,.
2a470 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  ** whose fully q
2a480 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
2a490 79 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61  y exceed 248 cha
2a4a0 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2a4b0 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a   prefixed with.*
2a4c0 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  * "\\?\"..*/.sta
2a4d0 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69  tic int win32_fi
2a4e0 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  nd_file(.  void 
2a4f0 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2a500 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a510 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2a520 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2a530 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44  objv[].){.  HAND
2a540 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49  LE hFindFile = I
2a550 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2a560 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e  LUE;.  WIN32_FIN
2a570 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61 74 61  D_DATAW findData
2a580 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73  ;.  Tcl_Obj *lis
2a590 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61  tObj;.  DWORD la
2a5a0 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  stErrno;.  if( o
2a5b0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2a5c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2a5d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2a5e0 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20  "PATTERN");.    
2a5f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a600 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c  ;.  }.  hFindFil
2a610 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c  e = FindFirstFil
2a620 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  eW(Tcl_GetUnicod
2a630 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e  e(objv[1]), &fin
2a640 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46  dData);.  if( hF
2a650 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44  indFile==INVALID
2a660 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
2a670 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2a680 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2a690 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2a6a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2a6b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a6c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69  _ERROR;.  }.  li
2a6d0 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  stObj = Tcl_NewO
2a6e0 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  bj();.  Tcl_Incr
2a6f0 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a  RefCount(listObj
2a700 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63  );.  do {.    Tc
2a710 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2a720 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
2a730 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55  istObj, Tcl_NewU
2a740 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20  nicodeObj(.     
2a750 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c     findData.cFil
2a760 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20  eName, -1));.   
2a770 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2a780 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2a790 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e  , listObj, Tcl_N
2a7a0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20  ewWideIntObj(.  
2a7b0 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64        findData.d
2a7c0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 29  wFileAttributes)
2a7d0 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69  );.  } while( Fi
2a7e0 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e  ndNextFileW(hFin
2a7f0 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61  dFile, &findData
2a800 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f  ) );.  lastErrno
2a810 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28   = GetLastError(
2a820 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72  );.  if( lastErr
2a830 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20  no!=NO_ERROR && 
2a840 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
2a850 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29  _NO_MORE_FILES )
2a860 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28  {.    FindClose(
2a870 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20  hFindFile);.    
2a880 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2a890 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54  (listObj);.    T
2a8a0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2a8b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2a8c0 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2a8d0 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2a8e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a8f0 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73  ;.  }.  FindClos
2a900 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
2a910 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2a920 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
2a930 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2a940 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2a950 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66    delete_win32_f
2a960 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a  ile FILENAME.**.
2a970 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65 20 73  ** Deletes the s
2a980 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77  pecified file, w
2a990 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2a9a0 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2a9b0 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72  ceed 260.** char
2a9c0 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2a9d0 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2a9e0 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2a9f0 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65 74 65  int win32_delete
2aa00 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
2aa10 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2aa20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2aa30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2aa40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2aa50 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
2aa60 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2aa70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2aa80 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2aa90 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
2aaa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2aab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c  ;.  }.  if( !Del
2aac0 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74  eteFileW(Tcl_Get
2aad0 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2aae0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2aaf0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2ab00 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2ab10 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2ab20 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2ab30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2ab40 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2ab50 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2ab60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2ab70 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77  *.**      make_w
2ab80 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f  in32_dir DIRECTO
2ab90 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73  RY.**.** Creates
2aba0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
2abb0 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20  irectory, whose 
2abc0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2abd0 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
2abe0 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  248.** character
2abf0 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2ac00 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
2ac10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2ac20 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f  in32_mkdir(.  vo
2ac30 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2ac40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ac50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2ac60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2ac70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2ac80 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2ac90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2aca0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2acb0 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29  jv, "DIRECTORY")
2acc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2acd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2ace0 28 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f  ( !CreateDirecto
2acf0 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  ryW(Tcl_GetUnico
2ad00 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  de(objv[1]), NUL
2ad10 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  L) ){.    Tcl_Se
2ad20 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2ad30 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2ad40 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2ad50 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2ad60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ad70 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2ad80 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2ad90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ada0 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76  /*.**      remov
2adb0 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45  e_win32_dir DIRE
2adc0 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f  CTORY.**.** Remo
2add0 76 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  ves the specifie
2ade0 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f  d directory, who
2adf0 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2ae00 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2ae10 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63  ed 248.** charac
2ae20 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
2ae30 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
2ae40 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2ae50 74 20 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20  t win32_rmdir(. 
2ae60 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2ae70 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2ae80 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2ae90 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2aea0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2aeb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2aec0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2aed0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2aee0 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52   objv, "DIRECTOR
2aef0 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y");.    return 
2af00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2af10 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69 72 65   if( !RemoveDire
2af20 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e  ctoryW(Tcl_GetUn
2af30 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20  icode(objv[1])) 
2af40 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2af50 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2af60 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2af70 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2af80 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2af90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2afa0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2afb0 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2afc0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2afd0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  if.../*.**      
2afe0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2aff0 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c  trol DB OPT BOOL
2b000 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65  EAN.**.** Enable
2b010 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75 65 72   or disable quer
2b020 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  y optimizations 
2b030 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
2b040 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29  3_test_control()
2b050 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20 20  .** interface.  
2b060 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45  Disable if BOOLE
2b070 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  AN is false and 
2b080 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41  enable if BOOLEA
2b090 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50  N is true..** OP
2b0a0 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  T is the name of
2b0b0 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   the optimizatio
2b0c0 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  n to be disabled
2b0d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b0e0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2b0f0 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  trol(.  void * c
2b100 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2b110 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2b120 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2b130 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b140 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
2b150 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2b160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
2b170 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b  pt;.  int onoff;
2b180 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b  .  int mask = 0;
2b190 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2b1a0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
2b1b0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d  st char *zOptNam
2b1c0 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b  e;.    int mask;
2b1d0 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a  .  } aOpt[] = {.
2b1e0 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20      { "all",    
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2b200 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20  ITE_AllOpts     
2b210 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e     },.    { "non
2b220 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2b230 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
2b240 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b250 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e  { "query-flatten
2b260 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  er",     SQLITE_
2b270 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d  QueryFlattener }
2b280 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d  ,.    { "column-
2b290 63 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 53  cache",        S
2b2a0 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68  QLITE_ColumnCach
2b2b0 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67  e    },.    { "g
2b2c0 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20  roupby-order",  
2b2d0 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75       SQLITE_Grou
2b2e0 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20  pByOrder   },.  
2b2f0 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73    { "factor-cons
2b300 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54  tants",    SQLIT
2b310 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
2b320 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69   },.    { "disti
2b330 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20  nct-opt",       
2b340 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
2b350 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Opt    },.    { 
2b360 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22  "cover-idx-scan"
2b370 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f  ,      SQLITE_Co
2b380 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a  verIdxScan   },.
2b390 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d      { "order-by-
2b3a0 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c  idx-join",   SQL
2b3b0 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
2b3c0 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61  in },.    { "tra
2b3d0 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20  nsitive",       
2b3e0 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69     SQLITE_Transi
2b3f0 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  tive     },.    
2b400 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f  { "subquery-coro
2b410 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f  utine",  SQLITE_
2b420 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d  SubqCoroutine  }
2b430 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f  ,.    { "omit-no
2b440 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53  op-join",      S
2b450 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f  QLITE_OmitNoopJo
2b460 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73  in   },.    { "s
2b470 74 61 74 33 22 2c 20 20 20 20 20 20 20 20 20 20  tat3",          
2b480 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74       SQLITE_Stat
2b490 33 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  3          },.  
2b4a0 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  };..  if( objc!=
2b4b0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
2b4c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2b4d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f  , 1, objv, "DB O
2b4e0 50 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  PT BOOLEAN");.  
2b4f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b500 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2b510 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2b520 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2b530 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2b540 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2b550 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
2b560 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
2b570 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2b580 20 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75 72   &onoff) ) retur
2b590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
2b5a0 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Opt = Tcl_GetStr
2b5b0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2b5c0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2b5d0 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2b5e0 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Opt[0]); i++){. 
2b5f0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
2b600 70 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74  pt, aOpt[i].zOpt
2b610 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2b620 20 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d    mask = aOpt[i]
2b630 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72 65  .mask;.      bre
2b640 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2b650 69 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b  if( onoff ) mask
2b660 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20   = ~mask;.  if( 
2b670 69 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f  i>=sizeof(aOpt)/
2b680 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20  sizeof(aOpt[0]) 
2b690 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2b6a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b6b0 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a  "unknown optimiz
2b6c0 61 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62  ation - should b
2b6d0 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20  e one of:",.    
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6f0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2b700 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2b710 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2b720 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Opt[0]); i++){. 
2b730 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
2b740 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
2b750 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e  ", aOpt[i].zOptN
2b760 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2b770 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2b780 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b790 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2b7a0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2b7b0 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2b7c0 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b  IONS, db, mask);
2b7d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2b7e0 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
2b7f0 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  uct sqlite3_api_
2b800 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65 33  routines sqlite3
2b810 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f  _api_routines;./
2b820 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74  *.**     load_st
2b830 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44  atic_extension D
2b840 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  B NAME ....**.**
2b850 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72   Load one or mor
2b860 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  e statically lin
2b870 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a  ked extensions..
2b880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
2b890 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
2b8a0 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20  sionCmd(.  void 
2b8b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2b8c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b8d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2b8e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b8f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
2b900 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b910 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69  amatch_init(sqli
2b920 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2b930 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b940 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2b950 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
2b960 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69  losure_init(sqli
2b970 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2b980 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2b990 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2b9a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
2b9b0 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69 74  ileio_init(sqlit
2b9c0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2b9d0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2b9e0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2b9f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  n int sqlite3_fu
2ba00 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  zzer_init(sqlite
2ba10 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2ba20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2ba30 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2ba40 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65 65   int sqlite3_iee
2ba50 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2ba60 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2ba70 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2ba80 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2ba90 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68  t sqlite3_nextch
2baa0 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ar_init(sqlite3*
2bab0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2bac0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2bad0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2bae0 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65  nt sqlite3_perce
2baf0 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74  ntile_init(sqlit
2bb00 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2bb10 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2bb20 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2bb30 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  n int sqlite3_re
2bb40 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65  gexp_init(sqlite
2bb50 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2bb60 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2bb70 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2bb80 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65   int sqlite3_spe
2bb90 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74  llfix_init(sqlit
2bba0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2bbb0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2bbc0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2bbd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  n int sqlite3_to
2bbe0 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  type_init(sqlite
2bbf0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2bc00 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2bc10 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2bc20 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f   int sqlite3_who
2bc30 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71  lenumber_init(sq
2bc40 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2bc50 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2bc60 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74  routines*);.  st
2bc70 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2bc80 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2bc90 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20  ar *zExtName;.  
2bca0 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73    int (*pInit)(s
2bcb0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2bcc0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2bcd0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d  _routines*);.  }
2bce0 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20   aExtension[] = 
2bcf0 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22  {.    { "amatch"
2bd00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bd10 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
2bd20 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2bd30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f     },.    { "clo
2bd40 73 75 72 65 22 2c 20 20 20 20 20 20 20 20 20 20  sure",          
2bd50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
2bd60 73 75 72 65 5f 69 6e 69 74 20 20 20 20 20 20 20  sure_init       
2bd70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2bd80 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20  "fileio",       
2bd90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bda0 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20  _fileio_init    
2bdb0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bdc0 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20    { "fuzzer",   
2bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2bde0 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74  ite3_fuzzer_init
2bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2be00 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34  ,.    { "ieee754
2be10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2be20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e   sqlite3_ieee_in
2be30 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2be40 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78     },.    { "nex
2be50 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20 20  tchar",         
2be60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78       sqlite3_nex
2be70 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20  tchar_init      
2be80 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2be90 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20  "percentile",   
2bea0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2beb0 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74  _percentile_init
2bec0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bed0 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20 20    { "regexp",   
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2bef0 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74  ite3_regexp_init
2bf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2bf10 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69  ,.    { "spellfi
2bf20 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
2bf30 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69   sqlite3_spellfi
2bf40 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  x_init          
2bf50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74     },.    { "tot
2bf60 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
2bf70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74       sqlite3_tot
2bf80 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ype_init        
2bf90 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2bfa0 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20  "wholenumber",  
2bfb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2bfc0 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69  _wholenumber_ini
2bfd0 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  t          },.  
2bfe0 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  };.  sqlite3 *db
2bff0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2c000 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20  zName;.  int i, 
2c010 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  j, rc;.  char *z
2c020 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66  ErrMsg = 0;.  if
2c030 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20  ( objc<3 ){.    
2c040 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2c050 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2c060 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29  , "DB NAME ...")
2c070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c080 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2c090 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2c0a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2c0b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2c0c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2c0d0 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d  _ERROR;.  for(j=
2c0e0 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b  2; j<objc; j++){
2c0f0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
2c100 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2c110 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
2c120 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45  ; i<ArraySize(aE
2c130 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b  xtension); i++){
2c140 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2c150 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73  p(zName, aExtens
2c160 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29  ion[i].zExtName)
2c170 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2c180 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72   }.    if( i>=Ar
2c190 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69  raySize(aExtensi
2c1a0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  on) ){.      Tcl
2c1b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c1c0 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65  terp, "no such e
2c1d0 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61  xtension: ", zNa
2c1e0 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2c1f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2c200 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2c210 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e   rc = aExtension
2c220 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a  [i].pInit(db, &z
2c230 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
2c240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c250 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a  K || zErrMsg ){.
2c260 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2c270 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2c280 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
2c290 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66 61  f ", zName, " fa
2c2a0 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73 67  iled: ", zErrMsg
2c2b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c2c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2c2d0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2c2e0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
2c2f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
2c300 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
2c310 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
2c320 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2c330 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b   sorter_test_fak
2c340 65 68 65 61 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f  eheap BOOL.**.*/
2c350 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
2c360 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
2c370 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2c380 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2c390 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2c3a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2c3b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2c3c0 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67 3b 0a  .){.  int bArg;.
2c3d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2c3e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2c3f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2c400 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b 0a   objv, "BOOL");.
2c410 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2c420 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2c430 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
2c440 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2c450 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29 20 29  bjv[1], &bArg) )
2c460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2c470 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
2c480 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20 20 69  f( bArg ){.    i
2c490 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2c4a0 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
2c4b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c4c0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2c4d0 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ap = SQLITE_INT_
2c4e0 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20 20 20  TO_PTR(-1);.    
2c4f0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
2c500 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2c510 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 53 51  Config.pHeap==SQ
2c520 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2c530 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  -1) ){.      sql
2c540 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2c550 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20 20 20  .pHeap = 0;.    
2c560 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73  }.  }..  Tcl_Res
2c570 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2c580 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c590 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2c5a0 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74  sorter_test_sort
2c5b0 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51 4c 31  4_helper DB SQL1
2c5c0 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a 0a 2a   NSTEP SQL2.**.*
2c5d0 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20 73 74  * Compile SQL st
2c5e0 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20 61 6e  atement $SQL1 an
2c5f0 64 20 73 74 65 70 20 69 74 20 24 4e 53 54 45 50  d step it $NSTEP
2c600 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61 63 68   times. For each
2c610 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63 6b 20   row, .** check 
2c620 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d 6f 73  that the leftmos
2c630 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73 74 20  t and rightmost 
2c640 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
2c650 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65 67 65   are both intege
2c660 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20  rs,.** and that 
2c670 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74 68 65  both contain the
2c680 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a   same value..**.
2c690 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74 65 20  ** Then execute 
2c6a0 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 32 2e  statement $SQL2.
2c6b0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2c6c0 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
2c6d0 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73 65  s the same.** se
2c6e0 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69 6e  t of integers in
2c6f0 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20   the same order 
2c700 61 73 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  as in the previo
2c710 75 73 20 73 74 65 70 20 28 75 73 69 6e 67 20 24  us step (using $
2c720 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  SQL1)..*/.static
2c730 20 69 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74   int sorter_test
2c740 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20  _sort4_helper(. 
2c750 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2c760 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2c770 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2c780 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2c790 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2c7a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c7b0 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Sql1;.  const ch
2c7c0 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74  ar *zSql2;.  int
2c7d0 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69   nStep; .  int i
2c7e0 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 43 6b  Step; .  int iCk
2c7f0 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 69 6e 74  sum1 = 0; .  int
2c800 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20 0a 20   iCksum2 = 0; . 
2c810 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2c820 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  B;.  sqlite3 *db
2c830 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
2c840 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20 69 66   *pStmt;.  .  if
2c850 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
2c860 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2c870 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2c880 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53 54 45  v, "DB SQL1 NSTE
2c890 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20 72 65  P SQL2");.    re
2c8a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2c8b0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
2c8c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2c8d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2c8e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
2c8f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c900 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c 5f 47  .  zSql1 = Tcl_G
2c910 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2c920 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
2c930 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2c940 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 74  p, objv[3], &nSt
2c950 65 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ep) ) return TCL
2c960 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 32 20  _ERROR;.  zSql2 
2c970 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2c980 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72 63 20  objv[4]);..  rc 
2c990 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2c9a0 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31 2c 20  e_v2(db, zSql1, 
2c9b0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2c9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c9d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65  _OK ) goto sql_e
2c9e0 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20 73 71  rror;..  iB = sq
2c9f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
2ca00 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20 20 66  nt(pStmt)-1;.  f
2ca10 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53 74 65  or(iStep=0; iSte
2ca20 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c 49 54  p<nStep && SQLIT
2ca30 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2ca40 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65  tep(pStmt); iSte
2ca50 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  p++){.    int a 
2ca60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2ca70 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
2ca80 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c 69 74      if( a!=sqlit
2ca90 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2caa0 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20 20 20  tmt, iB) ){.    
2cab0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2cac0 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61 74 61  lt(interp, "data
2cad0 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29 22 2c   error: (a!=b)",
2cae0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
2caf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2cb00 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d 31 20   }..    iCksum1 
2cb10 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c 20 33  += (iCksum1 << 3
2cb20 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20  ) + a;.  }.  rc 
2cb30 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
2cb40 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
2cb50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cb60 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
2cb70 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2cb80 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
2cb90 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d  zSql2, -1, &pStm
2cba0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
2cbb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cbc0 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66  o sql_error;.  f
2cbd0 6f 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49  or(iStep=0; SQLI
2cbe0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2cbf0 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
2cc00 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
2cc10 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2cc20 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
2cc30 0a 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20  .    iCksum2 += 
2cc40 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b  (iCksum2 << 3) +
2cc50 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   a;.  }.  rc = s
2cc60 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2cc70 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
2cc80 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cc90 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20  to sql_error;.. 
2cca0 20 69 66 28 20 69 43 6b 73 75 6d 31 21 3d 69 43   if( iCksum1!=iC
2ccb0 6b 73 75 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c  ksum2 ){.    Tcl
2ccc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2ccd0 74 65 72 70 2c 20 22 63 68 65 63 6b 73 75 6d 20  terp, "checksum 
2cce0 6d 69 73 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20  mismatch", 0);. 
2ccf0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2cd00 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
2cd10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f  rn TCL_OK;. sql_
2cd20 65 72 72 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70  error:.  Tcl_App
2cd30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2cd40 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c  , "sql error: ",
2cd50 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2cd60 64 62 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  db), 0);.  retur
2cd70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
2cd80 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
2cd90 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68  commands with th
2cda0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2cdb0 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65  r..*/.int Sqlite
2cdc0 74 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49  test1_Init(Tcl_I
2cdd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a  nterp *interp){.
2cde0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2cdf0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
2ce00 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2ce10 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
2ce20 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2ce30 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  t sqlite3_interr
2ce40 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  upt_count;.  ext
2ce50 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2ce60 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b  open_file_count;
2ce70 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2ce80 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
2ce90 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2cea0 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2ceb0 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ime;.#if SQLITE_
2cec0 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
2ced0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2cee0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cef0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65  OCKING_STYLE.  e
2cf00 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2cf10 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65  3_hostid_num;.#e
2cf20 6e 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e  ndif.  extern in
2cf30 74 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  t sqlite3_max_bl
2cf40 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e  obsize;.  extern
2cf50 20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65   int sqlite3Btre
2cf60 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f  eSharedCacheRepo
2cf70 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20  rt(void*,.      
2cf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c      Tcl_Interp*,
2cfb0 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53  int,Tcl_Obj*CONS
2cfc0 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74  T*);.  static st
2cfd0 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
2cfe0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
2cff0 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  l_CmdProc *xProc
2d000 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b  ;.  } aCmd[] = {
2d010 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65  .     { "db_ente
2d020 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2d030 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d040 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20  dProc*)db_enter 
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2d060 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76  .     { "db_leav
2d070 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2d080 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d090 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20  dProc*)db_leave 
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2d0b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d0c0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  _mprintf_int",  
2d0d0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d0e0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d0f0 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c  printf_int    },
2d100 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d110 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c  _mprintf_int64",
2d120 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d130 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d140 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c  printf_int64  },
2d150 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d160 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20  _mprintf_long", 
2d170 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d180 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d190 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c  printf_long   },
2d1a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d1b0 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20  _mprintf_str",  
2d1c0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d1d0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d1e0 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c  printf_str    },
2d1f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d200 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  _snprintf_str", 
2d210 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2d220 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73  dProc*)sqlite3_s
2d230 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c  nprintf_str   },
2d240 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d250 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
2d260 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
2d270 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d280 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c  printf_stronly},
2d290 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d2a0 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22  _mprintf_double"
2d2b0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2d2c0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d2d0 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c  printf_double },
2d2e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d2f0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22  _mprintf_scaled"
2d300 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2d310 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2d320 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c  printf_scaled },
2d330 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d340 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
2d350 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50  le",   (Tcl_CmdP
2d360 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2d370 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c  intf_hexdouble},
2d380 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2d390 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22  _mprintf_z_test"
2d3a0 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2d3b0 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
2d3c0 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_z        },.
2d3d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2d3e0 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c  mprintf_n_test",
2d3f0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2d400 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e  Proc*)test_mprin
2d410 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20  tf_n        },. 
2d420 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2d430 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20  nprintf_int",   
2d440 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2d450 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e  roc*)test_snprin
2d460 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20  tf_int     },.  
2d470 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61     { "sqlite3_la
2d480 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22  st_insert_rowid"
2d490 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72  ,     (Tcl_CmdPr
2d4a0 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f  oc*)test_last_ro
2d4b0 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  wid       },.   
2d4c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2d4d0 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  c_printf",      
2d4e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2d4f0 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69  c*)test_exec_pri
2d500 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ntf      },.    
2d510 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2d520 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20 20 20  _hex",          
2d530 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2d540 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20  *)test_exec_hex 
2d550 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2d560 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22  { "sqlite3_exec"
2d570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d580 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2d590 29 74 65 73 74 5f 65 78 65 63 20 20 20 20 20 20  )test_exec      
2d5a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2d5b0 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e   "sqlite3_exec_n
2d5c0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2d5d0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2d5e0 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20  test_exec_nr    
2d5f0 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
2d600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54   SQLITE_OMIT_GET
2d610 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73  _TABLE.     { "s
2d620 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
2d630 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28  _printf",      (
2d640 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2d650 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e  t_get_table_prin
2d660 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  tf },.#endif.   
2d670 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f    { "sqlite3_clo
2d680 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  se",            
2d690 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2d6a0 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  c*)sqlite_test_c
2d6b0 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  lose     },.    
2d6c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73   { "sqlite3_clos
2d6d0 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  e_v2",          
2d6e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2d6f0 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c  *)sqlite_test_cl
2d700 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20  ose_v2  },.     
2d710 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2d720 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20  e_function",    
2d730 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2d740 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e  )test_create_fun
2d750 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b  ction  },.     {
2d760 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
2d770 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20 20  _aggregate",    
2d780 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2d790 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72  test_create_aggr
2d7a0 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20  egate },.     { 
2d7b0 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72  "sqlite_register
2d7c0 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
2d7d0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2d7e0 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
2d7f0 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  c    },.     { "
2d800 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20  sqlite_abort",  
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d820 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2d830 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20  lite_abort      
2d840 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2d850 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20  qlite_bind",    
2d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d870 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2d880 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20 20  t_bind          
2d890 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72     },.     { "br
2d8a0 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20  eakpoint",      
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2d8c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2d8d0 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20  _breakpoint     
2d8e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2d8f0 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20  ite3_key",      
2d900 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2d910 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2d920 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20 20  key             
2d930 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d940 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20  te3_rekey",     
2d950 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2d960 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72  _CmdProc*)test_r
2d970 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  ekey            
2d980 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2d990 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20  e_set_magic",   
2d9a0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2d9b0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
2d9c0 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d  set_magic      }
2d9d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d9e0 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20  3_interrupt",   
2d9f0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2da00 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74  mdProc*)test_int
2da10 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c  errupt        },
2da20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2da30 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22  delete_function"
2da40 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2da50 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75  dProc*)delete_fu
2da60 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a  nction       },.
2da70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64       { "sqlite_d
2da80 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22  elete_collation"
2da90 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2daa0 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c  Proc*)delete_col
2dab0 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20  lation      },. 
2dac0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2dad0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20  et_autocommit", 
2dae0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2daf0 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d  roc*)get_autocom
2db00 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  mit        },.  
2db10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2db20 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20  ack_used",      
2db30 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2db40 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75  oc*)test_stack_u
2db50 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  sed       },.   
2db60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73    { "sqlite3_bus
2db70 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20  y_timeout",     
2db80 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2db90 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d  c*)test_busy_tim
2dba0 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  eout     },.    
2dbb0 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20   { "printf",    
2dbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbd0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2dbe0 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20  *)test_printf   
2dbf0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2dc00 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63  { "sqlite3IoTrac
2dc10 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2dc20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2dc30 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20  est_io_trace    
2dc40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2dc50 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61  clang_sanitize_a
2dc60 64 64 72 65 73 73 22 2c 20 20 20 20 20 20 20 20  ddress",        
2dc70 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c  (Tcl_CmdProc*)cl
2dc80 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64  ang_sanitize_add
2dc90 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73  ress },.  };.  s
2dca0 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2dcb0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2dcc0 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64  .     Tcl_ObjCmd
2dcd0 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20  Proc *xProc;.   
2dce0 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2dcf0 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b  ta;.  } aObjCmd[
2dd00 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71  ] = {.     { "sq
2dd10 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e  lite3_connection
2dd20 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65  _pointer",    ge
2dd30 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72  t_sqlite_pointer
2dd40 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
2dd50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22  qlite3_bind_int"
2dd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
2dd70 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20  est_bind_int,   
2dd80 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2dd90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
2dda0 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  oblob",         
2ddb0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
2ddc0 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
2ddd0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e  "sqlite3_bind_in
2dde0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  t64",           
2ddf0 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34   test_bind_int64
2de00 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
2de10 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64   "sqlite3_bind_d
2de20 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
2de30 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62    test_bind_doub
2de40 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  le,   0 },.     
2de50 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2de60 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  null",          
2de70 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c     test_bind_nul
2de80 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  l     ,0 },.    
2de90 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2dea0 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20  _text",         
2deb0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
2dec0 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt     ,0 },.   
2ded0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2dee0 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20  d_text16",      
2def0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74       test_bind_t
2df00 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20  ext16   ,0 },.  
2df10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2df20 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  nd_blob",       
2df30 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2df40 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20  blob     ,0 },. 
2df50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2df60 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
2df70 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64  unt",  test_bind
2df80 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
2df90 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
2dfa0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
2dfb0 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65  eter_name",   te
2dfc0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
2dfd0 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20  r_name,  0},.   
2dfe0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2dff0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
2e000 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  x",  test_bind_p
2e010 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20  arameter_index, 
2e020 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2e030 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
2e040 67 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  gs",        test
2e050 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c  _clear_bindings,
2e060 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2e070 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20 20  ite3_sleep",    
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2e090 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20 20  t_sleep,        
2e0a0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2e0b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20  lite3_errcode", 
2e0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
2e0d0 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20  st_errcode      
2e0e0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2e0f0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
2e100 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 74  errcode",      t
2e110 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20 20  est_ex_errcode  
2e120 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2e130 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c  sqlite3_errmsg",
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20  test_errmsg     
2e160 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2e170 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31  "sqlite3_errmsg1
2e180 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2e190 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20   test_errmsg16  
2e1a0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2e1b0 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c   "sqlite3_open",
2e1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1d0 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20    test_open     
2e1e0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2e1f0 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  { "sqlite3_open1
2e200 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2e210 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20     test_open16  
2e220 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2e230 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
2e240 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
2e250 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32      test_open_v2
2e260 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2e270 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d    { "sqlite3_com
2e280 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20  plete16",       
2e290 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65       test_comple
2e2a0 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20  te16    ,0 },.. 
2e2b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
2e2c0 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20  repare",        
2e2d0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
2e2e0 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  are       ,0 },.
2e2f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e300 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20  prepare16",     
2e310 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
2e320 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c  pare16     ,0 },
2e330 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e340 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20 20  _prepare_v2",   
2e350 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
2e360 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20 7d  epare_v2    ,0 }
2e370 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2e380 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  3_prepare_tkt313
2e390 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  4",       test_p
2e3a0 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c 20  repare_tkt3134, 
2e3b0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2e3c0 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
2e3d0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
2e3e0 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20 2c  _prepare16_v2  ,
2e3f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2e400 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20  ite3_finalize", 
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2e420 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20 20  t_finalize      
2e430 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2e440 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
2e450 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  s",           te
2e460 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20  st_stmt_status  
2e470 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2e480 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20  qlite3_reset",  
2e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2e4a0 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20  est_reset       
2e4b0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2e4c0 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22  sqlite3_expired"
2e4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e4e0 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20  test_expired    
2e4f0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2e500 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  "sqlite3_transfe
2e510 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
2e520 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62   test_transfer_b
2e530 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ind ,0 },.     {
2e540 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65   "sqlite3_change
2e550 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  s",             
2e560 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20    test_changes  
2e570 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2e580 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22  { "sqlite3_step"
2e590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e5a0 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20     test_step    
2e5b0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2e5c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c 22   { "sqlite3_sql"
2e5d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e5e0 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20 20      test_sql    
2e5f0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2e600 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65 78    { "sqlite3_nex
2e610 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20 20  t_stmt",        
2e620 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f 73       test_next_s
2e630 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  tmt     ,0 },.  
2e640 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2e650 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20  mt_readonly",   
2e660 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
2e670 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a 20  readonly ,0 },. 
2e680 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2e690 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20 20 20  tmt_busy",      
2e6a0 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
2e6b0 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d 2c 0a  _busy     ,0 },.
2e6c0 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73 74 6d       { "uses_stm
2e6d0 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20 20 20  t_journal",     
2e6e0 20 20 20 20 20 20 20 20 75 73 65 73 5f 73 74 6d          uses_stm
2e6f0 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a  t_journal ,0 },.
2e700 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e710 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
2e720 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65  ,        test_re
2e730 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20  lease_memory,   
2e740 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
2e750 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
2e760 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 74 65  _memory",     te
2e770 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  st_db_release_me
2e780 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20 20 20  mory,  0},.     
2e790 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 66 69  { "sqlite3_db_fi
2e7a0 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20  lename",        
2e7b0 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e     test_db_filen
2e7c0 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a  ame,        0},.
2e7d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2e7e0 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20  db_readonly",   
2e7f0 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
2e800 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20  readonly,       
2e810 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2e820 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
2e830 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74 65 73  imit",       tes
2e840 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
2e850 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  t,    0},.     {
2e860 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64   "sqlite3_thread
2e870 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20 20 20  _cleanup",      
2e880 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c    test_thread_cl
2e890 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20  eanup,     0},. 
2e8a0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
2e8b0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c  ager_refcounts",
2e8c0 20 20 20 20 20 20 20 74 65 73 74 5f 70 61 67 65         test_page
2e8d0 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20 20 20  r_refcounts,    
2e8e0 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c  0},..     { "sql
2e8f0 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
2e900 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74 65 73  ion",        tes
2e910 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
2e920 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
2e930 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
2e940 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22  _load_extension"
2e950 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  , test_enable_lo
2e960 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ad,        0},. 
2e970 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2e980 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
2e990 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78 74 65  odes", test_exte
2e9a0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
2e9b0 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
2e9c0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20  qlite3_limit",  
2e9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2e9e0 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20  est_limit,      
2e9f0 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a             0},..
2ea00 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e       { "save_prn
2ea10 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
2ea20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e          save_prn
2ea30 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c  g_state,    0 },
2ea40 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65  .     { "restore
2ea50 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
2ea60 20 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65           restore
2ea70 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d  _prng_state, 0 }
2ea80 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f  ,.     { "reset_
2ea90 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
2eaa0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 74 5f            reset_
2eab0 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20  prng_state,   0 
2eac0 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62  },.     { "datab
2ead0 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70  ase_never_corrup
2eae0 74 22 2c 20 20 20 20 20 20 20 20 64 61 74 61 62  t",        datab
2eaf0 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70  ase_never_corrup
2eb00 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64  t, 0},.     { "d
2eb10 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2eb20 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 64  orrupt",       d
2eb30 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2eb40 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20  orrupt, 0},.    
2eb50 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   { "optimization
2eb60 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20  _control",      
2eb70 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e      optimization
2eb80 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66  _control,0},.#if
2eb90 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
2eba0 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33      { "lock_win3
2ebb0 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20  2_file",        
2ebc0 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6c         win32_fil
2ebd0 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a  e_lock,    0 },.
2ebe0 20 20 20 20 20 7b 20 22 65 78 69 73 74 73 5f 77       { "exists_w
2ebf0 69 6e 33 32 5f 70 61 74 68 22 2c 20 20 20 20 20  in32_path",     
2ec00 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 65 78          win32_ex
2ec10 69 73 74 73 5f 70 61 74 68 2c 20 20 30 20 7d 2c  ists_path,  0 },
2ec20 0a 20 20 20 20 20 7b 20 22 66 69 6e 64 5f 77 69  .     { "find_wi
2ec30 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
2ec40 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66           win32_f
2ec50 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30 20 7d  ind_file,    0 }
2ec60 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c 65 74 65  ,.     { "delete
2ec70 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
2ec80 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
2ec90 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20 30 20  delete_file,  0 
2eca0 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b 65 5f  },.     { "make_
2ecb0 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20  win32_dir",     
2ecc0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
2ecd0 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 30  _mkdir,        0
2ece0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 6d 6f   },.     { "remo
2ecf0 76 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20  ve_win32_dir",  
2ed00 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
2ed10 32 5f 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  2_rmdir,        
2ed20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20  0 },.#endif.    
2ed30 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22   { "tcl_objproc"
2ed40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed50 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63      runAsObjProc
2ed60 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20  ,       0 },..  
2ed70 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f     /* sqlite3_co
2ed80 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a  lumn_*() API */.
2ed90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2eda0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20  column_count",  
2edb0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
2edc0 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c  umn_count  ,0 },
2edd0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ede0 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20  _data_count",   
2edf0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61           test_da
2ee00 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d  ta_count    ,0 }
2ee10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ee20 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20  3_column_type", 
2ee30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2ee40 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20  olumn_type   ,0 
2ee50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ee60 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c  e3_column_blob",
2ee70 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2ee80 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30  column_blob   ,0
2ee90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2eea0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
2eeb0 65 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  e",         test
2eec0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c  _column_double ,
2eed0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2eee0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
2eef0 34 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  4",          tes
2ef00 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20  t_column_int64  
2ef10 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2ef20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ef30 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  t",   test_stmt_
2ef40 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71  utf8,  (void*)sq
2ef50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2ef60 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  t },.     { "sql
2ef70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2ef80 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",   test_stmt_u
2ef90 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c  tf8,  (void*)sql
2efa0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2efb0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2efc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c  te3_column_int",
2efd0 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e      test_stmt_in
2efe0 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  t,   (void*)sqli
2eff0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20  te3_column_int  
2f000 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f010 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22  e3_column_bytes"
2f020 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ,  test_stmt_int
2f030 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  ,   (void*)sqlit
2f040 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d  e3_column_bytes}
2f050 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
2f060 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
2f070 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2f080 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c  olumn_decltype",
2f090 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2f0a0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2f0b0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a  lumn_decltype},.
2f0c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2f0d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2f0e0 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73  MN_METADATA.{ "s
2f0f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
2f100 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73  tabase_name",tes
2f110 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
2f120 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2f130 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d  n_database_name}
2f140 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
2f150 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c  umn_table_name",
2f160 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
2f170 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2f180 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d  lumn_table_name}
2f190 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  ,.{ "sqlite3_col
2f1a0 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22  umn_origin_name"
2f1b0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
2f1c0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2f1d0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2f1e0 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  e},.#endif..#ifn
2f1f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f200 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71  UTF16.     { "sq
2f210 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
2f220 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  es16", test_stmt
2f230 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c  _int, (void*)sql
2f240 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
2f250 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s16 },.     { "s
2f260 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2f270 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d  xt16",  test_stm
2f280 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
2f290 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2f2a0 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22  ext16},.     { "
2f2b0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
2f2c0 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74  ame16",  test_st
2f2d0 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
2f2e0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2f2f0 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20  name16},.     { 
2f300 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74  "add_alignment_t
2f310 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c  est_collations",
2f320 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
2f330 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20  est_collations, 
2f340 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65  0      },.#ifnde
2f350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
2f360 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
2f370 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2f380 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73  cltype16",test_s
2f390 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a  tmt_utf16,(void*
2f3a0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2f3b0 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e  decltype16},.#en
2f3c0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
2f3d0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2f3e0 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74  METADATA.{"sqlit
2f3f0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2f400 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65  se_name16",.  te
2f410 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
2f420 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2f430 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
2f440 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33  me16},.{"sqlite3
2f450 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
2f460 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  me16", test_stmt
2f470 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
2f480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
2f490 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ble_name16},.{"s
2f4a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
2f4b0 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65  igin_name16", te
2f4c0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
2f4d0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2f4e0 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
2f4f0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64  16},.#endif.#end
2f500 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
2f510 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
2f520 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72  ion_v2", test_cr
2f530 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
2f540 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  2, 0 },.     { "
2f550 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
2f560 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73  ecover",     tes
2f570 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  t_global_recover
2f580 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  , 0   },.     { 
2f590 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69  "working_64bit_i
2f5a0 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f  nt",          wo
2f5b0 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c  rking_64bit_int,
2f5c0 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
2f5d0 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73   "vfs_unlink_tes
2f5e0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 76  t",            v
2f5f0 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20  fs_unlink_test, 
2f600 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
2f610 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  { "vfs_initfail_
2f620 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
2f630 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
2f640 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
2f650 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74   { "vfs_unregist
2f660 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  er_all",        
2f670 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
2f680 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  all,  0   },.   
2f690 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73    { "vfs_reregis
2f6a0 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20  ter_all",       
2f6b0 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
2f6c0 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20  _all,  0   },.  
2f6d0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2f6e0 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  ol_test",       
2f6f0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
2f700 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  test,   0   },. 
2f710 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
2f720 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
2f730 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
2f740 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
2f750 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
2f760 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c   "file_control_l
2f770 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20  ockproxy_test", 
2f780 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
2f790 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20  kproxy_test,  0 
2f7a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
2f7b0 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
2f7c0 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f  ize_test", file_
2f7d0 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
2f7e0 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a  e_test,  0   },.
2f7f0 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
2f800 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
2f810 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72  st",  file_contr
2f820 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74  ol_sizehint_test
2f830 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53  ,   0   },.#if S
2f840 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20  QLITE_OS_WIN.   
2f850 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2f860 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
2f870 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2f880 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20  win32_av_retry, 
2f890 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2f8a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
2f8b0 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20  32_set_handle", 
2f8c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
2f8d0 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30  32_set_handle, 0
2f8e0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
2f8f0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2f900 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c 20 20  _persist_wal",  
2f910 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
2f920 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20 20 20  ersist_wal,     
2f930 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2f940 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
2f950 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 22  rsafe_overwrite"
2f960 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f  ,file_control_po
2f970 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
2f980 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69  e,0},.     { "fi
2f990 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
2f9a0 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69 6c 65  me",        file
2f9b0 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
2f9c0 2c 20 20 20 20 20 20 20 20 20 30 20 20 20 7d 2c  ,         0   },
2f9d0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2f9e0 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
2f9f0 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74  me",   file_cont
2fa00 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
2fa10 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  ,    0   },.    
2fa20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f   { "sqlite3_vfs_
2fa30 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  list",          
2fa40 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30   vfs_list,     0
2fa50 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2fa60 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
2fa70 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ction_v2", test_
2fa80 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f  create_function_
2fa90 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f  v2, 0 },..     /
2faa0 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d  * Functions from
2fab0 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66   os.h */.#ifndef
2fac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2fad0 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  16.     { "add_t
2fae0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20  est_collate",   
2faf0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74       test_collat
2fb00 65 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  e, 0            
2fb10 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
2fb20 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
2fb30 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ed", test_collat
2fb40 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20 20 20  e_needed, 0     
2fb50 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
2fb60 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  est_function",  
2fb70 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63 74 69       test_functi
2fb80 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20 20 20  on, 0           
2fb90 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 74  },.     { "add_t
2fba0 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
2fbb0 6c 61 74 65 22 2c 20 20 20 20 74 65 73 74 5f 75  late",    test_u
2fbc0 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c  tf16bin_collate,
2fbd0 20 30 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e   0        },.#en
2fbe0 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2fbf0 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 22  te3_test_errstr"
2fc00 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72 73 74  ,     test_errst
2fc10 72 2c 20 30 20 20 20 20 20 20 20 20 20 20 20 20  r, 0            
2fc20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f   },.     { "tcl_
2fc30 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22 2c 20  variable_type", 
2fc40 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69 61 62        tcl_variab
2fc50 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20 20 20  le_type, 0      
2fc60 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
2fc70 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
2fc80 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ACHE.     { "sql
2fc90 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
2fca0 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73 74 5f  ed_cache", test_
2fcb0 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c 20 30  enable_shared, 0
2fcc0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2fcd0 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61 63 68  ite3_shared_cach
2fce0 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c 69 74  e_report", sqlit
2fcf0 65 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63  e3BtreeSharedCac
2fd00 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65  heReport, 0},.#e
2fd10 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2fd20 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  ite3_libversion_
2fd30 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f 6c 69  number", test_li
2fd40 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c  bversion_number,
2fd50 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51   0  },.#ifdef SQ
2fd60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2fd70 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20 20 20 20  MN_METADATA.    
2fd80 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c   { "sqlite3_tabl
2fd90 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
2fda0 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  a", test_table_c
2fdb0 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20  olumn_metadata, 
2fdc0 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  0  },.#endif.#if
2fdd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2fde0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b  _INCRBLOB.     {
2fdf0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
2fe00 65 61 64 22 2c 20 20 20 74 65 73 74 5f 62 6c 6f  ead",   test_blo
2fe10 62 5f 72 65 61 64 2c 20 30 20 20 7d 2c 0a 20 20  b_read, 0  },.  
2fe20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c     { "sqlite3_bl
2fe30 6f 62 5f 77 72 69 74 65 22 2c 20 20 74 65 73 74  ob_write",  test
2fe40 5f 62 6c 6f 62 5f 77 72 69 74 65 2c 20 30 20 20  _blob_write, 0  
2fe50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2fe60 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c  e3_blob_reopen",
2fe70 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
2fe80 6e 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  n, 0  },.     { 
2fe90 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79  "sqlite3_blob_by
2fea0 74 65 73 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62  tes",  test_blob
2feb0 5f 62 79 74 65 73 2c 20 30 20 20 7d 2c 0a 20 20  _bytes, 0  },.  
2fec0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c     { "sqlite3_bl
2fed0 6f 62 5f 63 6c 6f 73 65 22 2c 20 20 74 65 73 74  ob_close",  test
2fee0 5f 62 6c 6f 62 5f 63 6c 6f 73 65 2c 20 30 20 20  _blob_close, 0  
2fef0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2ff00 20 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c   "pcache_stats",
2ff10 20 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63         test_pcac
2ff20 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a  he_stats, 0  },.
2ff30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2ff40 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
2ff50 46 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  FY.     { "sqlit
2ff60 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
2ff70 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  ", test_unlock_n
2ff80 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e  otify, 0  },.#en
2ff90 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2ffa0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2ffb0 6e 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f  nt",   test_wal_
2ffc0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d  checkpoint, 0  }
2ffd0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ffe0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
2fff0 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68  _v2",test_wal_ch
30000 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20  eckpoint_v2, 0  
30010 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f  },.     { "test_
30020 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20  sqlite3_log",   
30030 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
30040 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69  e3_log, 0  },.#i
30050 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30060 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b  T_EXPLAIN.     {
30070 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f   "print_explain_
30080 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73  query_plan", tes
30090 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20  t_print_eqp, 0  
300a0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
300b0 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   "sqlite3_test_c
300c0 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65  ontrol", test_te
300d0 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69  st_control },.#i
300e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
300f0 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73 61  .     { "getrusa
30100 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75 73  ge", test_getrus
30110 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  age },.#endif.  
30120 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69     { "load_stati
30130 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63  c_extension", tc
30140 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
30150 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20  sionCmd },.     
30160 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  { "sorter_test_f
30170 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65 72  akeheap", sorter
30180 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 7d  _test_fakeheap }
30190 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72  ,.     { "sorter
301a0 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
301b0 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74  er", sorter_test
301c0 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c  _sort4_helper },
301d0 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69  .  };.  static i
301e0 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20  nt bitmask_size 
301f0 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  = sizeof(Bitmask
30200 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  )*8;.  int i;.  
30210 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30220 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73  e3_sync_count, s
30230 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
30240 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
30250 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
30260 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  temp_count;.  ex
30270 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
30280 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _like_count;.  e
30290 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
302a0 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b  3_xferopt_count;
302b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
302c0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
302d0 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
302e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
302f0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
30300 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
30310 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
30320 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66  ritej_count;.#if
30330 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
30340 20 65 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c   extern LONG vol
30350 61 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73  atile sqlite3_os
30360 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69  _type;.#endif.#i
30370 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
30380 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  G.  extern int s
30390 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
303a0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
303b0 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20  qlite3OSTrace;. 
303c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
303d0 74 65 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e  te3WalTrace;.#en
303e0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
303f0 45 5f 54 45 53 54 0a 23 69 66 64 65 66 20 53 51  E_TEST.#ifdef SQ
30400 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
30410 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
30420 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
30430 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23  e_parentheses;.#
30440 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
30450 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
30460 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  f(aCmd)/sizeof(a
30470 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
30480 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d     Tcl_CreateCom
30490 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d  mand(interp, aCm
304a0 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64  d[i].zName, aCmd
304b0 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29  [i].xProc, 0, 0)
304c0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
304d0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d   i<sizeof(aObjCm
304e0 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d  d)/sizeof(aObjCm
304f0 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
30500 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
30510 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f  mmand(interp, aO
30520 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  bjCmd[i].zName, 
30530 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64  .        aObjCmd
30540 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43  [i].xProc, aObjC
30550 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61  md[i].clientData
30560 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  , 0);.  }.  Tcl_
30570 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
30580 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63  "sqlite_search_c
30590 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
305a0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65  har*)&sqlite3_se
305b0 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  arch_count, TCL_
305c0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
305d0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
305e0 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63   "sqlite_found_c
305f0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
30600 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f  har*)&sqlite3_fo
30610 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  und_count, TCL_L
30620 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
30630 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
30640 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75  "sqlite_sort_cou
30650 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
30660 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74  r*)&sqlite3_sort
30670 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
30680 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
30690 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
306a0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
306b0 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  ze", .      (cha
306c0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f  r*)&sqlite3_max_
306d0 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  blobsize, TCL_LI
306e0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
306f0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
30700 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
30710 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
30720 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  *)&sqlite3_like_
30730 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
30740 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
30750 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
30760 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  ite_interrupt_co
30770 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
30780 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74  ar*)&sqlite3_int
30790 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43  errupt_count, TC
307a0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
307b0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
307c0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  p, "sqlite_open_
307d0 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  file_count", .  
307e0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
307f0 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
30800 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
30810 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
30820 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
30830 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c  e_current_time",
30840 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
30850 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
30860 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  time, TCL_LINK_I
30870 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  NT);.#if SQLITE_
30880 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
30890 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
308a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
308b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54  OCKING_STYLE.  T
308c0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
308d0 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69  p, "sqlite_hosti
308e0 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28  d_num", .      (
308f0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68  char*)&sqlite3_h
30900 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c  ostid_num, TCL_L
30910 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
30920 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
30930 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
30940 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a  xferopt_count",.
30950 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
30960 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
30970 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
30980 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
30990 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
309a0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
309b0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
309c0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
309d0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
309e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
309f0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
30a00 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
30a10 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
30a20 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
30a30 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
30a40 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c  r_writedb_count,
30a50 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
30a60 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
30a70 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
30a80 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
30a90 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
30aa0 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
30ab0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43  writej_count, TC
30ac0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
30ad0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
30ae0 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e  _UTF16.  Tcl_Lin
30af0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e  kVar(interp, "un
30b00 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
30b10 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28  ounter",.      (
30b20 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64  char*)&unaligned
30b30 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c  _string_counter,
30b40 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
30b50 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
30b60 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
30b70 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
30b80 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
30b90 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61  ast_needed_colla
30ba0 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68  tion",.      (ch
30bb0 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c  ar*)&pzNeededCol
30bc0 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b  lation, TCL_LINK
30bd0 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b  _STRING|TCL_LINK
30be0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  _READ_ONLY);.#en
30bf0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  dif.#if SQLITE_O
30c00 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b  S_WIN.  Tcl_Link
30c10 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
30c20 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20  ite_os_type",.  
30c30 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
30c40 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c  te3_os_type, TCL
30c50 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e  _LINK_LONG);.#en
30c60 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30c70 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73  E_TEST.  {.    s
30c80 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
30c90 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22   *query_plan = "
30ca0 2a 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52  *** OBSOLETE VAR
30cb0 49 41 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20  IABLE ***";.    
30cc0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
30cd0 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72  rp, "sqlite_quer
30ce0 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20  y_plan",.       
30cf0 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c  (char*)&query_pl
30d00 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  an, TCL_LINK_STR
30d10 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
30d20 44 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e  D_ONLY);.  }.#en
30d30 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30d40 45 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69  E_DEBUG.  Tcl_Li
30d50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
30d60 71 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63  qlite_where_trac
30d70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
30d80 29 26 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  )&sqlite3WhereTr
30d90 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
30da0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
30db0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
30dc0 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20  e_os_trace",.   
30dd0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
30de0 65 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c  e3OSTrace, TCL_L
30df0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65  INK_INT);.#ifnde
30e00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
30e10 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  L.  Tcl_LinkVar(
30e20 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
30e30 77 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20  wal_trace",.    
30e40 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
30e50 33 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c  3WalTrace, TCL_L
30e60 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
30e70 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
30e80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
30e90 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  IO.  Tcl_LinkVar
30ea0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
30eb0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22  _opentemp_count"
30ec0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
30ed0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
30ee0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
30ef0 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
30f00 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
30f10 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
30f20 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a  ic_bind_value",.
30f30 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
30f40 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
30f50 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _value, TCL_LINK
30f60 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
30f70 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
30f80 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
30f90 69 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20  ind_nbyte",.    
30fa0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
30fb0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
30fc0 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  te, TCL_LINK_INT
30fd0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
30fe0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
30ff0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22  _temp_directory"
31000 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
31010 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
31020 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b  ectory, TCL_LINK
31030 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
31040 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
31050 22 73 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72  "sqlite_data_dir
31060 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28  ectory",.      (
31070 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64  char*)&sqlite3_d
31080 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54  ata_directory, T
31090 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
310a0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
310b0 6e 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f  nterp, "bitmask_
310c0 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68  size",.      (ch
310d0 61 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a  ar*)&bitmask_siz
310e0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c  e, TCL_LINK_INT|
310f0 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
31100 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  LY);.  Tcl_LinkV
31110 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
31120 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a  te_sync_count",.
31130 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
31140 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
31150 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
31160 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
31170 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66  nterp, "sqlite_f
31180 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a  ullsync_count",.
31190 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
311a0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
311b0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
311c0 4e 54 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  NT);.#if defined
311d0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46  (SQLITE_ENABLE_F
311e0 54 53 33 29 20 26 26 20 64 65 66 69 6e 65 64 28  TS3) && defined(
311f0 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54  SQLITE_TEST).  T
31200 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
31210 70 2c 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f  p, "sqlite_fts3_
31220 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
31230 65 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  es",.      (char
31240 2a 29 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  *)&sqlite3_fts3_
31250 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
31260 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  es, TCL_LINK_INT
31270 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
31280 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a           rn TCL_OK;.}.