/ Hex Artifact Content
Login

Artifact 899bddeb0c7fb2b8062de6f03af4a4e4f48f9df5:


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 65 78 74 65 72 6e  CL_OK;.}..extern
0b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
0b20: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29  ite3ErrName(int)
0b30: 3b 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f  ;.#define t1Erro
0b40: 72 4e 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72  rName sqlite3Err
0b50: 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  Name../*.** Conv
0b60: 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73  ert an sqlite3_s
0b70: 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c  tmt* into an sql
0b80: 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70  ite3*.  This dep
0b90: 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66  ends on the.** f
0ba0: 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71 6c  act that the sql
0bb0: 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69 72  ite3* is the fir
0bc0: 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
0bd0: 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a  Vdbe structure..
0be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54  */.#define StmtT
0bf0: 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65 33  oDb(X)   sqlite3
0c00: 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f  _db_handle(X)../
0c10: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74  *.** Check a ret
0c20: 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b  urn value to mak
0c30: 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65 73  e sure it agrees
0c40: 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
0c50: 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  s.** from sqlite
0c60: 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  3_errcode..*/.in
0c70: 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  t sqlite3TestErr
0c80: 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20  Code(Tcl_Interp 
0c90: 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  *interp, sqlite3
0ca0: 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20   *db, int rc){. 
0cb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72   if( sqlite3_thr
0cc0: 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20  eadsafe()==0 && 
0cd0: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
0ce0: 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  E && rc!=SQLITE_
0cf0: 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  OK.   && sqlite3
0d00: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63  _errcode(db)!=rc
0d10: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
0d20: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20  f[200];.    int 
0d30: 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  r2 = sqlite3_err
0d40: 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73 70  code(db);.    sp
0d50: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72 72  rintf(zBuf, "err
0d60: 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29 20  or code %s (%d) 
0d70: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73  does not match s
0d80: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 25  qlite3_errcode %
0d90: 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20 20  s (%d)",.       
0da0: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
0db0: 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65   rc, t1ErrorName
0dc0: 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20 54  (r2), r2);.    T
0dd0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
0de0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
0df0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0e00: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0e10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0e20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0e30: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e50: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0e80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e90: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0ea0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0eb0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0ec0: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0ed0: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0ee0: 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  t*)sqlite3TestTe
0ef0: 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20  xtToPtr(zArg);. 
0f00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
0f20: 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65  e a text represe
0f30: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69  ntation of a poi
0f40: 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  nter that can be
0f50: 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62   understood.** b
0f60: 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74  y the getDbPoint
0f70: 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e  er and getVmPoin
0f80: 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f  ter routines abo
0f90: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ve..**.** The pr
0fa0: 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d  oblem is, on som
0fb0: 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61  e machines (Sola
0fc0: 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61  ris) if you do a
0fd0: 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20   printf with.** 
0fe0: 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20  "%p" you cannot 
0ff0: 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20  turn around and 
1000: 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20  do a scanf with 
1010: 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e  the same "%p" an
1020: 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f  d.** get your po
1030: 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75  inter back.  You
1040: 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64   have to prepend
1050: 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69   a "0x" before i
1060: 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20  t will.** work. 
1070: 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61   Or at least tha
1080: 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70  t is what is rep
1090: 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68  orted to me (drh
10a0: 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20  ).  But this.** 
10b0: 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20  behavior varies 
10c0: 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20  from machine to 
10d0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f  machine.  The so
10e0: 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20  lution used her 
10f0: 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  is.** to test th
1100: 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61  e string right a
1110: 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72  fter it is gener
1120: 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69  ated to see if i
1130: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65  t can be.** unde
1140: 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c  rstood by scanf,
1150: 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79   and if not, try
1160: 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22   prepending an "
1170: 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  0x" to see if.**
1180: 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66   that helps.  If
1190: 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20   nothing works, 
11a0: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73  a fatal error is
11b0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 69   generated..*/.i
11c0: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  nt sqlite3TestMa
11d0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
11e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11f0: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
1200: 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  d *p){.  sqlite3
1210: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a  _snprintf(100, z
1220: 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a 20  Ptr, "%p", p);. 
1230: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  }../*.** The cal
1250: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f  lback routine fo
1260: 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  r sqlite3_exec_p
1270: 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74  rintf()..*/.stat
1280: 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e  ic int exec_prin
1290: 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67  tf_cb(void *pArg
12a0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
12b0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
12c0: 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74  name){.  Tcl_DSt
12d0: 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c  ring *str = (Tcl
12e0: 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a  _DString*)pArg;.
12f0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1300: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
1310: 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  h(str)==0 ){.   
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
1340: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1350: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65  lement(str, name
1360: 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20  [i] ? name[i] : 
1370: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
1380: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1390: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
13a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
13b0: 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72  dElement(str, ar
13c0: 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20  gv[i] ? argv[i] 
13d0: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20  : "NULL");.  }. 
13e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13f0: 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61 63  .** The I/O trac
1400: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ing callback..*/
1410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
1430: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1440: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
1450: 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  E).static FILE *
1460: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30  iotrace_file = 0
1470: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f  ;.static void io
1480: 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28  _trace_callback(
1490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
14a0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
14b0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
14c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
14d0: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f 74  ;.  vfprintf(iot
14e0: 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d  race_file, zForm
14f0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1500: 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  d(ap);.  fflush(
1510: 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 7d  iotrace_file);.}
1520: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
1530: 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65 20  sage:  io_trace 
1540: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54  FILENAME.**.** T
1550: 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  urn I/O tracing 
1560: 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20 46  on or off.  If F
1570: 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20 61  ILENAME is not a
1580: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 0a  n empty string,.
1590: 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 62  ** I/O tracing b
15a0: 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74 6f  egins going into
15b0: 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46 49   FILENAME. If FI
15c0: 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d 70  LENAME is an emp
15d0: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49 2f  ty.** string, I/
15e0: 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75 72  O tracing is tur
15f0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
1600: 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f 74  ic int test_io_t
1610: 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  race(.  void *No
1620: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
1630: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1640: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1650: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1660: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1670: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1690: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
16a0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
16b0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
16c0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
16d0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
16e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
1700: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1710: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
1720: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1730: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1750: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1760: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1770: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[0],.          
1780: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
1790: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
17b0: 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20  f( iotrace_file 
17c0: 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  ){.    if( iotra
17d0: 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74 20  ce_file!=stdout 
17e0: 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21  && iotrace_file!
17f0: 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20  =stderr ){.     
1800: 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 5f   fclose(iotrace_
1810: 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  file);.    }.   
1820: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
1830: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
1840: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trace = 0;.  }. 
1850: 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d 20   if( argv[1][0] 
1860: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1870: 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f 75  p(argv[1],"stdou
1880: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
1890: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 73  iotrace_file = s
18a0: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
18b0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
18c0: 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d 30  [1],"stderr")==0
18d0: 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63   ){.      iotrac
18e0: 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72 3b  e_file = stderr;
18f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1900: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
1910: 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20   fopen(argv[1], 
1920: 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "w");.    }.    
1930: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
1940: 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61   io_trace_callba
1950: 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ck;.  }.#endif. 
1960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1970: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1980: 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f   clang_sanitize_
1990: 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a 2a 20 52  address .**.** R
19a0: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
19b0: 68 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 63  he program was c
19c0: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 63 6c  ompiled using cl
19d0: 61 6e 67 20 77 69 74 68 20 74 68 65 20 0a 2a 2a  ang with the .**
19e0: 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61 64 64 72   -fsanitize=addr
19f0: 65 73 73 20 73 77 69 74 63 68 20 6f 6e 20 74 68  ess switch on th
1a00: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20  e command line. 
1a10: 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  False otherwise.
1a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1a30: 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64  lang_sanitize_ad
1a40: 64 72 65 73 73 28 0a 20 20 76 6f 69 64 20 2a 4e  dress(.  void *N
1a50: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
1a60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
1a70: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
1a80: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
1a90: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
1aa0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ac0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
1ad0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
1ae0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
1af0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
1b00: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
1b10: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 23    int res = 0;.#
1b20: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 68 61 73  if defined(__has
1b30: 5f 66 65 61 74 75 72 65 29 0a 23 20 69 66 20 5f  _feature).# if _
1b40: 5f 68 61 73 5f 66 65 61 74 75 72 65 28 61 64 64  _has_feature(add
1b50: 72 65 73 73 5f 73 61 6e 69 74 69 7a 65 72 29 0a  ress_sanitizer).
1b60: 20 20 72 65 73 20 3d 20 31 3b 0a 23 20 65 6e 64    res = 1;.# end
1b70: 69 66 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  if.#endif.  Tcl_
1b80: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1b90: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1ba0: 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75  bj(res));.  retu
1bb0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a  rn TCL_OK;.}.  .
1bc0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1bd0: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1be0: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
1bf0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f  TRING.**.** Invo
1c00: 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65  ke the sqlite3_e
1c10: 78 65 63 5f 70 72 69 6e 74 66 28 29 20 69 6e 74  xec_printf() int
1c20: 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65  erface using the
1c30: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a   open database.*
1c40: 2a 20 44 42 2e 20 20 54 68 65 20 53 51 4c 20 69  * DB.  The SQL i
1c50: 73 20 74 68 65 20 73 74 72 69 6e 67 20 46 4f 52  s the string FOR
1c60: 4d 41 54 2e 20 20 54 68 65 20 66 6f 72 6d 61 74  MAT.  The format
1c70: 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20 63   string should c
1c80: 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73  ontain.** one %s
1c90: 20 6f 72 20 25 71 2e 20 20 53 54 52 49 4e 47 20   or %q.  STRING 
1ca0: 69 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 73  is the value ins
1cb0: 65 72 74 65 64 20 69 6e 74 6f 20 25 73 20 6f 72  erted into %s or
1cc0: 20 25 71 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   %q..*/.static i
1cd0: 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 70 72 69  nt test_exec_pri
1ce0: 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ntf(.  void *Not
1cf0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
1d00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
1d10: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
1d20: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
1d30: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
1d40: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d60: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
1d70: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
1d80: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
1d90: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
1da0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
1db0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
1dc0: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
1dd0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1de0: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
1df0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
1e00: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
1e10: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
1e20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e30: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e40: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e50: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e60: 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 4f 52  .       " DB FOR
1e70: 4d 41 54 20 53 54 52 49 4e 47 22 2c 20 30 29 3b  MAT STRING", 0);
1e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1ea0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1eb0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1ec0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1ed0: 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53  _ERROR;.  Tcl_DS
1ee0: 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b  tringInit(&str);
1ef0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1f00: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32  3_mprintf(argv[2
1f10: 5d 2c 20 61 72 67 76 5b 33 5d 29 3b 0a 20 20 72  ], argv[3]);.  r
1f20: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f30: 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f  (db, zSql, exec_
1f40: 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c  printf_cb, &str,
1f50: 20 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74   &zErr);.  sqlit
1f60: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1f70: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1f80: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
1f90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1fa0: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54  terp, zBuf);.  T
1fb0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
1fc0: 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c  (interp, rc==SQL
1fd0: 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74  ITE_OK ? Tcl_DSt
1fe0: 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20  ringValue(&str) 
1ff0: 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44  : zErr);.  Tcl_D
2000: 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29  StringFree(&str)
2010: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
2020: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
2030: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
2040: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
2050: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
2060: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2070: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
2090: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68    sqlite3_exec_h
20a0: 65 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a  ex  DB  HEX.**.*
20b0: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
20c0: 69 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61  ite3_exec() on a
20d0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
20e0: 6f 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e  obtained by tran
20f0: 73 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69  slating.** HEX i
2100: 6e 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74  nto ASCII.  Most
2110: 20 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20   characters are 
2120: 74 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73  translated as is
2130: 2e 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a  .  %HH becomes.*
2140: 2a 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65  * a hex characte
2150: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2160: 20 74 65 73 74 5f 65 78 65 63 5f 68 65 78 28 0a   test_exec_hex(.
2170: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2180: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2190: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21a0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21b0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21c0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21d0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
21e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21f0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2200: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2220: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2230: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2240: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2250: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2260: 20 72 63 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61   rc, i, j;.  cha
2270: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63  r *zErr = 0;.  c
2280: 68 61 72 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61  har *zHex;.  cha
2290: 72 20 7a 53 71 6c 5b 35 30 30 5d 3b 0a 20 20 63  r zSql[500];.  c
22a0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
22b0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
22c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2300: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2310: 48 45 58 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  HEX", 0);.    re
2320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2330: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2340: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2350: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2360: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2370: 0a 20 20 7a 48 65 78 20 3d 20 61 72 67 76 5b 32  .  zHex = argv[2
2380: 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  ];.  for(i=j=0; 
2390: 69 3c 73 69 7a 65 6f 66 28 7a 53 71 6c 29 20 26  i<sizeof(zSql) &
23a0: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
23b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
23c0: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
23d0: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
23e0: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
23f0: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
2400: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
2410: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
2420: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
2430: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
2440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
2450: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
2460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
2470: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
2480: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2490: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
24a0: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
24b0: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
24c0: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
24d0: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
24e0: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
24f0: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
2500: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
2510: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
2520: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
2530: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
2540: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
2550: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
2560: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
2570: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
2580: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2590: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
25a0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
25b0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
25c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25d0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
25f0: 3a 20 20 64 62 5f 65 6e 74 65 72 20 44 42 0a 2a  :  db_enter DB.*
2600: 2a 20 20 20 20 20 20 20 20 20 64 62 5f 6c 65 61  *         db_lea
2610: 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20 45 6e 74 65  ve DB.**.** Ente
2620: 72 20 6f 72 20 6c 65 61 76 65 20 74 68 65 20 6d  r or leave the m
2630: 75 74 65 78 20 6f 6e 20 61 20 64 61 74 61 62 61  utex on a databa
2640: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
2650: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62 5f  /.static int db_
2660: 65 6e 74 65 72 28 0a 20 20 76 6f 69 64 20 2a 4e  enter(.  void *N
2670: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2680: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2690: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26a0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26b0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26e0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26f0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2700: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2710: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2720: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2730: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2740: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
2750: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2760: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
2770: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
2780: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
2790: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
27a0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
27b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
27c0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
27d0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
27e0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
27f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2800: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2810: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
2820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2830: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  .}.static int db
2840: 5f 6c 65 61 76 65 28 0a 20 20 76 6f 69 64 20 2a  _leave(.  void *
2850: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
2860: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2870: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2880: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2890: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
28a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
28b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
28d0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
28e0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
28f0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
2900: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
2910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2920: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
2930: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2940: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2950: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2960: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
2970: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
2980: 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
2990: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29a0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
29b0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
29c0: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
29d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
29f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
2a00: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
2a20: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20  :  sqlite3_exec 
2a30: 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49   DB  SQL.**.** I
2a40: 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65  nvoke the sqlite
2a50: 33 5f 65 78 65 63 20 69 6e 74 65 72 66 61 63 65  3_exec interface
2a60: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
2a70: 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2f 0a 73  database DB.*/.s
2a80: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
2a90: 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  xec(.  void *Not
2aa0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
2ab0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2ac0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2ad0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2ae0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2af0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2b10: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2b20: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
2b30: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
2b40: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
2b50: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
2b60: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54  sqlite3 *db;.  T
2b70: 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a  cl_DString str;.
2b80: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2b90: 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68   *zErr = 0;.  ch
2ba0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
2bb0: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 42 75  i, j;.  char zBu
2bc0: 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67  f[30];.  if( arg
2bd0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2be0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2bf0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2c00: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2c10: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
2c20: 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30      " DB SQL", 0
2c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
2c90: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
2ca0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
2cb0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
2cc0: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 66 6f  , argv[2]);.  fo
2cd0: 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b 69 5d  r(i=j=0; zSql[i]
2ce0: 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c  ;){.    if( zSql
2cf0: 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [i]=='%' ){.    
2d00: 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 28 74    zSql[j++] = (t
2d10: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2d20: 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73  [i+1])<<4) + tes
2d30: 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69  tHexToInt(zSql[i
2d40: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  +2]);.      i +=
2d50: 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   3;.    }else{. 
2d60: 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d       zSql[j++] =
2d70: 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20 20 20   zSql[i++];.    
2d80: 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a 5d 20  }.  }.  zSql[j] 
2d90: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 0;.  rc = sqli
2da0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2db0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2dc0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2dd0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2de0: 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66  zSql);.  sprintf
2df0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29  (zBuf, "%d", rc)
2e00: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2e10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
2e20: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
2e30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2e40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
2e50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
2e60: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
2e70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2e80: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
2e90: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
2ea0: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
2eb0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2ec0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2ed0: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2ee0: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2ef0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2f00: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2f10: 33 5f 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53  3_exec_nr  DB  S
2f20: 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  QL.**.** Invoke 
2f30: 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63  the sqlite3_exec
2f40: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
2f50: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
2f60: 73 65 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a  se DB.  Discard.
2f70: 2a 2a 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a  ** all results.*
2f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2f90: 74 5f 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69  t_exec_nr(.  voi
2fa0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2fb0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2fc0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2fd0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2fe0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2ff0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3000: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3010: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3020: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3030: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
3040: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
3050: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
3060: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
3070: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
3080: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
3090: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
30a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
30b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
30c0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
30d0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
30e0: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
30f0: 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
3100: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3110: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
3120: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
3130: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
3140: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3150: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
3160: 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
3170: 5d 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b  ], 0, 0, &zErr);
3180: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
3190: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
31a0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
31b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
31c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
31d0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
31e0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
31f0: 7a 5f 74 65 73 74 20 20 53 45 50 41 52 41 54 4f  z_test  SEPARATO
3200: 52 20 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e  R  ARG0  ARG1 ..
3210: 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  ..**.** Test the
3220: 20 25 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71   %z format of sq
3230: 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20  lite_mprintf(). 
3240: 20 55 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70   Use multiple mp
3250: 72 69 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f  rintf() calls to
3260: 20 0a 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65   .** concatenate
3270: 20 61 72 67 30 20 74 68 72 6f 75 67 68 20 61 72   arg0 through ar
3280: 67 6e 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  gn using separat
3290: 6f 72 20 61 73 20 74 68 65 20 73 65 70 61 72 61  or as the separa
32a0: 74 6f 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  tor..** Return t
32b0: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
32c0: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70  atic int test_mp
32d0: 72 69 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20  rintf_z(.  void 
32e0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
32f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3300: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3310: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3320: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
3330: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
3340: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
3350: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
3360: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
3370: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
3380: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3390: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
33a0: 7b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c  {.  char *zResul
33b0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
33c0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72  .  for(i=2; i<ar
33d0: 67 63 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a  gc && (i==2 || z
33e0: 52 65 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  Result); i++){. 
33f0: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c     zResult = sql
3400: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a  ite3_mprintf("%z
3410: 25 73 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20  %s%s", zResult, 
3420: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d  argv[1], argv[i]
3430: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
3440: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3450: 2c 20 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  , zResult, 0);. 
3460: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52   sqlite3_free(zR
3470: 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
3480: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
3490: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
34a0: 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
34b0: 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54    STRING.**.** T
34c0: 65 73 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61  est the %n forma
34d0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34e0: 6e 74 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74  ntf().  Return t
34f0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
3500: 0a 2a 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67  .** input string
3510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3520: 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a  test_mprintf_n(.
3530: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3540: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3550: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3560: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
3570: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
3580: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
3590: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
35a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
35b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
35c0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
35e0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
35f0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
3600: 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d  *zStr;.  int n =
3610: 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c   0;.  zStr = sql
3620: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
3630: 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  %n", argv[1], &n
3640: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3650: 65 28 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53  e(zStr);.  Tcl_S
3660: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3670: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
3680: 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  j(n));.  return 
3690: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
36a0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
36b0: 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53  _snprintf_int  S
36c0: 49 5a 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a  IZE FORMAT  INT.
36d0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f  **.** Test the o
36e0: 66 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  f sqlite3_snprin
36f0: 74 66 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  tf() routine.  S
3700: 49 5a 45 20 69 73 20 74 68 65 20 73 69 7a 65 20  IZE is the size 
3710: 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
3720: 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
3730: 2e 20 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  .  The maximum s
3740: 69 7a 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52  ize is 100.  FOR
3750: 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f  MAT is the.** fo
3760: 72 6d 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e  rmat string.  IN
3770: 54 20 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e  T is a single in
3780: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20  teger argument. 
3790: 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73   The FORMAT.** s
37a0: 74 72 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69  tring must requi
37b0: 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  re no more than 
37c0: 74 68 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72  this one integer
37d0: 20 61 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a   argument.  If.*
37e0: 2a 20 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20  * You pass in a 
37f0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68  format string th
3800: 61 74 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65  at requires more
3810: 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65   than one argume
3820: 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67  nt,.** bad thing
3830: 73 20 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a  s will happen..*
3840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3850: 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a  t_snprintf_int(.
3860: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
3870: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
3880: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
3890: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
38a0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
38b0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
38c0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
38d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
38e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
38f0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
3900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
3910: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
3920: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
3930: 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74  zStr[100];.  int
3940: 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31   n = atoi(argv[1
3950: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
3960: 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76   *zFormat = argv
3970: 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20  [2];.  int a1 = 
3980: 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20  atoi(argv[3]);. 
3990: 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53   if( n>sizeof(zS
39a0: 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66  tr) ) n = sizeof
39b0: 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zStr);.  sqlite
39c0: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
39d0: 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22  f(zStr), zStr, "
39e0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
39f0: 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20  qrstuvwxyz");.  
3a00: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
3a10: 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61  (n, zStr, zForma
3a20: 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70  t, a1);.  Tcl_Ap
3a30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3a40: 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72  p, zStr, 0);.  r
3a50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3a60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3a70: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a  OMIT_GET_TABLE..
3a80: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3a90: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f  lite3_get_table_
3aa0: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
3ab0: 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e  AT  STRING  ?--n
3ac0: 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20  o-counts?.**.** 
3ad0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
3ae0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  e3_get_table_pri
3af0: 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65 20  ntf() interface 
3b00: 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64  using the open d
3b10: 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20  atabase.** DB.  
3b20: 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20 73  The SQL is the s
3b30: 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54  tring FORMAT.  T
3b40: 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67  he format string
3b50: 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a   should contain.
3b60: 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e  ** one %s or %q.
3b70: 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65 20    STRING is the 
3b80: 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69  value inserted i
3b90: 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f  nto %s or %q..*/
3ba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
3bb0: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3bc0: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
3bd0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
3be0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
3bf0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3c00: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3c10: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3c20: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3c40: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3c50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3c60: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3c70: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3c80: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
3c90: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c  lite3 *db;.  Tcl
3ca0: 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20  _DString str;.  
3cb0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3cc0: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  zErr = 0;.  int 
3cd0: 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a 20 20 63 68  nRow, nCol;.  ch
3ce0: 61 72 20 2a 2a 61 52 65 73 75 6c 74 3b 0a 20 20  ar **aResult;.  
3cf0: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
3d00: 75 66 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a  uf[30];.  char *
3d10: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 65 73 43  zSql;.  int resC
3d20: 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20 20 69 66 28  ount = -1;.  if(
3d30: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
3d40: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
3d50: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
3d60: 26 72 65 73 43 6f 75 6e 74 29 20 29 20 72 65 74  &resCount) ) ret
3d70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
3d80: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34   }.  if( argc!=4
3d90: 20 26 26 20 61 72 67 63 21 3d 35 20 29 7b 0a 20   && argc!=5 ){. 
3da0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3db0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
3dc0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
3dd0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
3de0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
3df0: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 20 3f 43  FORMAT STRING ?C
3e00: 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a 20 20 20 20  OUNT?", 0);.    
3e10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3e20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
3e30: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
3e40: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
3e50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3e60: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
3e70: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
3e80: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
3e90: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 61 72 67  intf(argv[2],arg
3ea0: 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 61 72 67  v[3]);.  if( arg
3eb0: 63 3d 3d 35 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==5 ){.    rc =
3ec0: 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62   sqlite3_get_tab
3ed0: 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52  le(db, zSql, &aR
3ee0: 65 73 75 6c 74 2c 20 30 2c 20 30 2c 20 26 7a 45  esult, 0, 0, &zE
3ef0: 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
3f00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
3f10: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
3f20: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 26 6e 52  l, &aResult, &nR
3f30: 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26 7a 45 72 72  ow, &nCol, &zErr
3f40: 29 3b 0a 20 20 20 20 72 65 73 43 6f 75 6e 74 20  );.    resCount 
3f50: 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e 43 6f 6c 3b  = (nRow+1)*nCol;
3f60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
3f70: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
3f80: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3f90: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
3fa0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3fb0: 2c 20 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72  , zBuf);.  if( r
3fc0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3fd0: 20 20 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20      if( argc==4 
3fe0: 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
3ff0: 28 7a 42 75 66 2c 20 22 25 64 22 2c 20 6e 52 6f  (zBuf, "%d", nRo
4000: 77 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  w);.      Tcl_Ap
4010: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4020: 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20  rp, zBuf);.     
4030: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
4040: 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20  %d", nCol);.    
4050: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
4060: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
4070: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
4080: 28 69 3d 30 3b 20 69 3c 72 65 73 43 6f 75 6e 74  (i=0; i<resCount
4090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
40a0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
40b0: 69 6e 74 65 72 70 2c 20 61 52 65 73 75 6c 74 5b  interp, aResult[
40c0: 69 5d 20 3f 20 61 52 65 73 75 6c 74 5b 69 5d 20  i] ? aResult[i] 
40d0: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  : "NULL");.    }
40e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
40f0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4100: 69 6e 74 65 72 70 2c 20 7a 45 72 72 29 3b 0a 20  interp, zErr);. 
4110: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
4120: 65 5f 74 61 62 6c 65 28 61 52 65 73 75 6c 74 29  e_table(aResult)
4130: 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73  ;.  if( zErr ) s
4140: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
4150: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
4160: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
4170: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
4180: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4190: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
41a0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
41b0: 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
41c0: 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55  BLE */.../*.** U
41d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6c  sage:  sqlite3_l
41e0: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
41f0: 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
4200: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 52 4f  s the integer RO
4210: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
4220: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 2e 0a 2a  recent insert..*
4230: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4240: 74 5f 6c 61 73 74 5f 72 6f 77 69 64 28 0a 20 20  t_last_rowid(.  
4250: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
4260: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4270: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
4280: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
4290: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
42a0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
42b0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
42c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
42d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
42e0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
4300: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
4310: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
4320: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
4330: 66 5b 33 30 5d 3b 0a 0a 20 20 69 66 28 20 61 72  f[30];..  if( ar
4340: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4350: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4360: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4370: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4380: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20 44  "", argv[0], " D
4390: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
43a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
43b0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
43c0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
43d0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
43e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
43f0: 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c  .  sprintf(zBuf,
4400: 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65 33   "%lld", sqlite3
4410: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
4420: 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  id(db));.  Tcl_A
4430: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4440: 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
4450: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4470: 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20 44  :  sqlite3_key D
4480: 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74 20  B KEY.**.** Set 
4490: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
44a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
44b0: 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e  t_key(.  void *N
44c0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
44d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
44e0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
44f0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
4500: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
4510: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4530: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
4540: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
4550: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
4560: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
4570: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
4580: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
4590: 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69 74 65  S_CODEC.  sqlite
45a0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
45b0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
45c0: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
45d0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
45e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
45f0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4600: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4610: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4620: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4630: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4640: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4650: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
4660: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
4670: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
4680: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
4690: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
46a0: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
46b0: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Key);.  sqlite3_
46c0: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
46d0: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
46e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
46f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4700: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
4710: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
4720: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4730: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4740: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
4750: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4760: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4770: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4780: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4790: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
47a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
47b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
47c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
47d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
47e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
47f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4800: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4810: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4820: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
4830: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4840: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4850: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4860: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4870: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4880: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4890: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
48a0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
48b0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
48c0: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
48d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
48e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
48f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4900: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4920: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
4930: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4940: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
4950: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
4960: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4980: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4990: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
49a0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
49b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
49c0: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
49d0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
49e0: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
49f0: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
4a00: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4a10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4a20: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4a30: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4a40: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4a50: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4a70: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4a80: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4a90: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4aa0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4ab0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4ac0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4ad0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4ae0: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4af0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4b00: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4b10: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4b20: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4b30: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4b40: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4b50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4b60: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4b70: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4b80: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4b90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4ba0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4bb0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
4bc0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
4bd0: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
4be0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
4bf0: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
4c00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4c10: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4c20: 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a 0a 2a  close_v2 DB.**.*
4c30: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4c40: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4c50: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4c60: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4c70: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32  te_test_close_v2
4c80: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4c90: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4ca0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4cb0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4cc0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4cd0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4ce0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4cf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4d00: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4d10: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4d30: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4d40: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4d50: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
4d60: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
4d70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4d80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4d90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4da0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4db0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4dc0: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4dd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4de0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4df0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4e00: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4e10: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4e20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
4e30: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4e40: 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  2(db);.  Tcl_Set
4e50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
4e60: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
4e70: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
4e80: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
4e90: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
4ea0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
4eb0: 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28   the x_coalesce(
4ec0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52  ) function..** R
4ed0: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
4ee0: 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c  argument non-NUL
4ef0: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  L argument..*/.s
4f00: 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66  tatic void t1_if
4f10: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
4f20: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
4f30: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
4f40: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
4f50: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
4f60: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
4f70: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
4f80: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
4f90: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
4fa0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
4fb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
4fc0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
4fd0: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
4fe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
4ff0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5000: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5010: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5020: 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  i]),.          n
5030: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5040: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
5050: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5060: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
5070: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  est functions.  
5080: 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72    hex8() interpr
5090: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
50a0: 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20   as.** UTF8 and 
50b0: 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e  returns a hex en
50c0: 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65  coding.  hex16le
50d0: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
50e0: 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73  s argument.** as
50f0: 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74   UTF16le and ret
5100: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
5110: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5120: 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c  oid hex8Func(sql
5130: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5140: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5150: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5160: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5170: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
5180: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
5190: 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [200];.  z = sql
51a0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
51b0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
51c0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
51d0: 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69  uf)/2 - 2 && z[i
51e0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72  ]; i++){.    spr
51f0: 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a 32 5d 2c  intf(&zBuf[i*2],
5200: 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 26 30 78   "%02x", z[i]&0x
5210: 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ff);.  }.  zBuf[
5220: 69 2a 32 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  i*2] = 0;.  sqli
5230: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5240: 70 2c 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20  p, (char*)zBuf, 
5250: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
5260: 49 45 4e 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  IENT);.}.#ifndef
5270: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
5280: 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  16.static void h
5290: 65 78 31 36 46 75 6e 63 28 73 71 6c 69 74 65 33  ex16Func(sqlite3
52a0: 5f 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74  _context *p, int
52b0: 20 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76   argc, sqlite3_v
52c0: 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20  alue **argv){.  
52d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 73  const unsigned s
52e0: 68 6f 72 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69  hort int *z;.  i
52f0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75  nt i;.  char zBu
5300: 66 5b 34 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71  f[400];.  z = sq
5310: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5320: 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66  16(argv[0]);.  f
5330: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
5340: 28 7a 42 75 66 29 2f 34 20 2d 20 34 20 26 26 20  (zBuf)/4 - 4 && 
5350: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
5360: 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69 2a  sprintf(&zBuf[i*
5370: 34 5d 2c 20 22 25 30 34 78 22 2c 20 7a 5b 69 5d  4], "%04x", z[i]
5380: 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42  &0xff);.  }.  zB
5390: 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73  uf[i*4] = 0;.  s
53a0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
53b0: 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75  xt(p, (char*)zBu
53c0: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
53d0: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64  ANSIENT);.}.#end
53e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  if../*.** A stru
53f0: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
5400: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
5410: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
5420: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
5430: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
5440: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
5450: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
5460: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
5470: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
5480: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
5490: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
54a0: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
54b0: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
54c0: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
54d0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
54e0: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
54f0: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
5500: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
5510: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
5520: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
5530: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
5540: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
5550: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
5560: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
5570: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
5580: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
5590: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
55a0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
55b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29  lite3_free(p->z)
55c0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
55d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
55e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
55f0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
5600: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
5610: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
5620: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
5630: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
5640: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
5650: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
5660: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
5670: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
5680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5690: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
56a0: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
56b0: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
56c0: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
56d0: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
56e0: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
56f0: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
5700: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
5710: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
5720: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
5730: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
5740: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
5750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5760: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
5770: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
5780: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
5790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
57a0: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
57b0: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
57c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
57d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
57e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
57f0: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
5800: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
5810: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
5820: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
5830: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
5840: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
5850: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
5860: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
5870: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
5880: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
5890: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
58a0: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
58b0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
58c0: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
58d0: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
58e0: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
58f0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
5900: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
5910: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
5920: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5930: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5940: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5950: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
5960: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
5970: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
5980: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
5990: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
59a0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
59b0: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
59c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
59d0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
59e0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
59f0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5a00: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
5a10: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
5a20: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5a30: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5a40: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5a50: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5a60: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
5a70: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5a80: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5a90: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
5aa0: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
5ab0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5ac0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5ad0: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5ae0: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5af0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5b00: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
5b10: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5b20: 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29  of tkt2213func()
5b30: 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  , a scalar funct
5b40: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65  ion that takes e
5b50: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72  xactly.** one ar
5b60: 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74  gument. It has t
5b70: 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  wo interesting f
5b80: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a  eatures:.**.** *
5b90: 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   It calls sqlite
5ba0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33  3_value_text() 3
5bb0: 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72   times on the ar
5bc0: 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  gument sqlite3_v
5bd0: 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74  alue*..**   If t
5be0: 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72  he three pointer
5bf0: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e  s returned are n
5c00: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53  ot the same an S
5c10: 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  QL error is rais
5c20: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65  ed..**.** * Othe
5c30: 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73  rwise it returns
5c40: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
5c50: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
5c60: 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20  on of its .**   
5c70: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
5c80: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
5c90: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
5ca0: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
5cb0: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
5cc0: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
5cd0: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5ce0: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5cf0: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5d00: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5d20: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5d30: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5d40: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5d50: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5d60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5d70: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
5d80: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5d90: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5da0: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
5db0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5dc0: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
5dd0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
5de0: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
5df0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
5e00: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
5e10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
5e20: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
5e30: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
5e40: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
5e50: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
5e60: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5e70: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
5e80: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
5e90: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
5ea0: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
5eb0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5ec0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
5ed0: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
5ee0: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
5ef0: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
5f00: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
5f10: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
5f20: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
5f30: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
5f40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
5f50: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5f60: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
5f70: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
5f80: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
5f90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
5fa0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
5fb0: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
5fc0: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
5fd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
5fe0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
5ff0: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
6000: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
6010: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
6020: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
6030: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
6040: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
6050: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
6060: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
6070: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
6080: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
6090: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
60a0: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
60b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
60c0: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
60d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
60e0: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
60f0: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
6100: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
6110: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
6120: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
6130: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
6140: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
6150: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6160: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
6170: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
6180: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
6190: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
61a0: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
61b0: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
61c0: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
61d0: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
61e0: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
61f0: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
6200: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
6210: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
6220: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
6230: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
6240: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
6250: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
6260: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
6270: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6280: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
6290: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
62a0: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
62b0: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
62c0: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
62d0: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
62e0: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
62f0: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
6300: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
6310: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
6320: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
6330: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
6340: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
6350: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
6360: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
6370: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
6380: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
6390: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
63a0: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
63b0: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
63c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
63d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
63e0: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
63f0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6400: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6410: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
6420: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
6430: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
6440: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
6450: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6460: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
6470: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6480: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
6490: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
64a0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
64b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
64c0: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
64d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
64e0: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
64f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
6500: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6510: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6520: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
6530: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
6540: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
6550: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6560: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6570: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
6580: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6590: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
65a0: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
65b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
65c0: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
65d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
65e0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
65f0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6600: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
6610: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6620: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6630: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
6640: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6650: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
6660: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
6670: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
6680: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6690: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
66a0: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
66b0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
66c0: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
66d0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
66e0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
66f0: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6700: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6710: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6720: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6730: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
6740: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6750: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6760: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
6770: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
6780: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6790: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
67a0: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
67b0: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
67c0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
67d0: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
67e0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
67f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6800: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6810: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6820: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6830: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6840: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
6850: 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66  /*.** This SQL f
6860: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6870: 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77  a different answ
6880: 65 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  er each time it 
6890: 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65 6e 20  is called, even 
68a0: 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  if.** the argume
68b0: 6e 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  nts are the same
68c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
68d0: 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69   nondeterministi
68e0: 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  cFunction(.  sql
68f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6900: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
6910: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
6920: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6930: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
6940: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6950: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6960: 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f  xt, cnt++);.}../
6970: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
6980: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6990: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
69a0: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
69b0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
69c0: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
69d0: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
69e0: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
69f0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
6a00: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
6a10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6a20: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6a30: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6a40: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6a50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6a60: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6a70: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6a80: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6a90: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6aa0: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
6ab0: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
6ac0: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
6ad0: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
6ae0: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
6af0: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
6b00: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6b10: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6b20: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6b30: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6b40: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6b50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6b60: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6b70: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6b80: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6b90: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6ba0: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
6bb0: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
6bc0: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
6bd0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
6be0: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
6bf0: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
6c00: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6c10: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6c20: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6c30: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6c40: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6c50: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6c60: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6c70: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6c80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6c90: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6ca0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6cb0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6cc0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6cd0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6ce0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6cf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6d00: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6d10: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6d20: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6d30: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6d40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6d50: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6d60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6d70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6d80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
6d90: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
6da0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
6db0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
6dc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
6dd0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
6de0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
6df0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
6e00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
6e20: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
6e30: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
6e40: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
6e50: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
6e60: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
6e70: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
6e80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
6e90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
6ea0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
6eb0: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
6ec0: 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
6ed0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
6ee0: 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78 38           0, hex8
6ef0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
6f00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6f10: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
6f20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6f30: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
6f40: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6f50: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
6f60: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  1, SQLITE_UTF16 
6f70: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
6f80: 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20 20  NISTIC,.        
6f90: 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c 20    0, hex16Func, 
6fa0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
6fb0: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
6fc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
6fd0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6fe0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
6ff0: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
7000: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
7010: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
7020: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
7030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
7040: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7050: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7060: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7070: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
7080: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
7090: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
70a0: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
70b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
70c0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f 75  /* Functions cou
70d0: 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75 6e  nter1() and coun
70e0: 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65 20  ter2() have the 
70f0: 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  same implementat
7100: 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a 20  ion - they.  ** 
7110: 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20 61  both return an a
7120: 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65 72  scending integer
7130: 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 2e   with each call.
7140: 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28 29    But counter1()
7150: 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a 20   is marked.  ** 
7160: 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  as non-determini
7170: 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65 72  stic and counter
7180: 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61 73  2() is marked as
7190: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a   deterministic..
71a0: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
71b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
71c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
71d0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
71e0: 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31 2c   "counter1", -1,
71f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7200: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7210: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7220: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7230: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7240: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7250: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7260: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
7270: 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c 49  nter2", -1, SQLI
7280: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
7290: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20  ETERMINISTIC,.  
72a0: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
72b0: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
72c0: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
72d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72e0: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
72f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7300: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
7310: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
7320: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
7330: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
7340: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
7350: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
7360: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
7370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7380: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7390: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
73a0: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
73b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
73c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
73d0: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
73e0: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
73f0: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7400: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
7410: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
7420: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
7430: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
7440: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
7450: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
7460: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
7470: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
7480: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7490: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
74a0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
74b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
74c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
74d0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
74e0: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
74f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
7500: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
7510: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
7520: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
7530: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
7540: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
7550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7560: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7570: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
7580: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7590: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
75a0: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
75b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
75c0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
75d0: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
75e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
75f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7600: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7610: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
7620: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
7630: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
7640: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
7650: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
7660: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
7670: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
7680: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7690: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
76a0: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
76b0: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
76c0: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
76d0: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
76e0: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
76f0: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
7700: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
7710: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
7720: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
7730: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
7740: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
7750: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
7760: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
7770: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
7780: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7790: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
77a0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
77b0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
77c0: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
77d0: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
77e0: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
77f0: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
7800: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
7810: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7820: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7830: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7840: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7850: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7860: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7870: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7880: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7890: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
78a0: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
78b0: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
78c0: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
78d0: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
78e0: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
78f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
7900: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
7910: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
7920: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7930: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7940: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7950: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7960: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
7970: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
7980: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
7990: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
79a0: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
79b0: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
79c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
79d0: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
79e0: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
79f0: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
7a00: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
7a10: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
7a20: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
7a30: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
7a40: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
7a50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7a60: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
7a70: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
7a80: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7a90: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7aa0: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7ab0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7ac0: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7ad0: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7ae0: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7af0: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
7b00: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
7b10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7b20: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
7b30: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
7b40: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
7b50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7b60: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7b70: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7b90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7ba0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
7bb0: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7bc0: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
7bd0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7be0: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7bf0: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7c00: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7c10: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
7c20: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7c30: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
7c40: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7c50: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
7c60: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
7c70: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
7c80: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
7c90: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
7ca0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
7cb0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
7cc0: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
7cd0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7ce0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7cf0: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7d00: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7d10: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7d20: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7d30: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7d40: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7d50: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7d60: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
7d70: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
7d80: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
7d90: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
7da0: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
7db0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7dc0: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
7dd0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
7de0: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
7df0: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
7e00: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
7e10: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
7e20: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
7e30: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
7e40: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
7e50: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
7e60: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
7e70: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
7e80: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
7e90: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
7ea0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7eb0: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
7ec0: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
7ed0: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
7ee0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
7ef0: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
7f00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
7f10: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
7f20: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
7f30: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
7f40: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
7f50: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
7f60: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
7f70: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
7f80: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
7f90: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
7fa0: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
7fb0: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
7fc0: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
7fd0: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
7fe0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
7ff0: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8000: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8020: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
8030: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
8040: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
8050: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
8060: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
8070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
8080: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8090: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
80a0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
80b0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
80c0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
80d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
80e0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
80f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8100: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8110: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8120: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8130: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
8140: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
8150: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8160: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
8170: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
8180: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8190: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
81a0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
81b0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
81c0: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
81d0: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
81e0: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
81f0: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8200: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
8210: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8230: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
8240: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
8250: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
8260: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
8270: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
8280: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8290: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
82a0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
82b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
82c0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
82d0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
82e0: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
82f0: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8300: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
8310: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
8320: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
8330: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
8340: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
8350: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
8360: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
8370: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
8380: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8390: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
83a0: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
83b0: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
83c0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
83d0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
83e0: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
83f0: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8400: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8410: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8420: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
8430: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
8440: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
8450: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
8460: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
8470: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
8480: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8490: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
84a0: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
84b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
84c0: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
84d0: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
84e0: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
84f0: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
8500: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8510: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8520: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8530: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8540: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8550: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8560: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8570: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8580: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8590: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
85a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
85b0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
85c0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
85d0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
85e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
85f0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8600: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8610: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8620: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
8630: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8640: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8650: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
8660: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
8670: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
8680: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8690: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
86a0: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
86b0: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
86c0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
86d0: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
86e0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
86f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8700: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8710: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8720: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8730: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
8740: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8750: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8760: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8770: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8790: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
87a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
87b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
87c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
87d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
87e0: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
87f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8800: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8810: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8820: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8830: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8840: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8850: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8860: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8870: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8880: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8890: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
88a0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
88b0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
88c0: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
88d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
88e0: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
88f0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8900: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8910: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8920: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8930: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8940: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8950: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8960: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8970: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8980: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
8990: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
89a0: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
89b0: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
89c0: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
89d0: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
89e0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
89f0: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
8a00: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8a10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8a20: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8a30: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8a40: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8a50: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8a60: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8a70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8a80: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8a90: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8aa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8ab0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8ac0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
8ad0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
8ae0: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
8af0: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8b00: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8b10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8b20: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8b30: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8b40: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8b50: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
8b60: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8b70: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8b80: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
8b90: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
8ba0: 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ( sqlite3Atoi64(
8bb0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8bc0: 2c 20 31 30 30 30 30 30 30 2c 20 53 51 4c 49 54  , 1000000, SQLIT
8bd0: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20  E_UTF8) ){.     
8be0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8bf0: 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d  t(interp, "argum
8c00: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  ent is not a val
8c10: 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  id 64-bit intege
8c20: 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  r", 0);.      re
8c30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8c40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20      }.  }.  z = 
8c50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8c60: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
8c70: 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63  [1], a[2]);.  Tc
8c80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8c90: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
8ca0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
8cb0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
8cd0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
8ce0: 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49  tf_long FORMAT I
8cf0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
8d00: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
8d10: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
8d20: 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65  hree long intege
8d30: 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54  r arguments.   T
8d40: 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 68 65  his might be the
8d50: 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69  .** same as sqli
8d60: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
8d70: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  or sqlite3_mprin
8d80: 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64  tf_int64, depend
8d90: 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f  ing on.** platfo
8da0: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
8db0: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8dc0: 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20 2a  f_long(.  void *
8dd0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
8de0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
8df0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
8e00: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
8e10: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
8e20: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
8e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8e40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
8e50: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
8e60: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8e70: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8e80: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8e90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67  .  int i;.  long
8ea0: 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e 74   int a[3];.  int
8eb0: 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   b[3];.  char *z
8ec0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
8ed0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
8ee0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8ef0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8f00: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8f10: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8f20: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8f30: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8f40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8f50: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8f60: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8f70: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8f80: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8f90: 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  b[i-2]) ) return
8fa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8fb0: 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20 69  a[i-2] = (long i
8fc0: 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20 61  nt)b[i-2];.    a
8fd0: 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34 29  [i-2] &= (((u64)
8fe0: 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74 29  1)<<(sizeof(int)
8ff0: 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20  *8))-1;.  }.  z 
9000: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
9010: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
9020: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
9030: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9040: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9050: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9060: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
9070: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
9080: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9090: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
90a0: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
90b0: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
90c0: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
90d0: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
90e0: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
90f0: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
9100: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9110: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a  e3_mprintf_str(.
9120: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9130: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9140: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9150: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9160: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9170: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9180: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9190: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
91a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
91b0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
91c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
91d0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
91e0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
91f0: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
9200: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20  z;.  if( argc<4 
9210: 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20  || argc>5 ){.   
9220: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9230: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
9240: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
9250: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
9260: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
9270: 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47   INT INT ?STRING
9280: 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ?\"", 0);.    re
9290: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
92a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
92b0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
92c0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
92d0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
92e0: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
92f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9300: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
9310: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
9320: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
9330: 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c   ? argv[4] : NUL
9340: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
9350: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
9360: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
9370: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
9380: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
9390: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
93a0: 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
93b0: 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49  INTEGER FORMAT I
93c0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53  NTEGER INTEGER S
93d0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
93e0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
93f0: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
9400: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69  nts and one stri
9410: 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  ng argument.*/.s
9420: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9430: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a  3_snprintf_str(.
9440: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9450: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9460: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9470: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9480: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9490: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
94a0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
94b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
94c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
94d0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
94e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
94f0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9500: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9510: 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b  [3], i;.  int n;
9520: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9530: 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63  ( argc<5 || argc
9540: 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >6 ){.    Tcl_Ap
9550: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9560: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9570: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9580: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9590: 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e   " INT FORMAT IN
95a0: 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22  T INT ?STRING?\"
95b0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
95c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
95d0: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
95e0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
95f0: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
9600: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9610: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f   n<0 ){.    Tcl_
9620: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9630: 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20  erp, "N must be 
9640: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30  non-negative", 0
9650: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9660: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9670: 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=3; i<5; i++
9680: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9690: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
96a0: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20  gv[i], &a[i-3]) 
96b0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
96c0: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
96d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b  lite3_malloc( n+
96e0: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  1 );.  sqlite3_s
96f0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72  nprintf(n, z, ar
9700: 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[2], a[0], a[1
9710: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
9720: 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [5] : NULL);.  T
9730: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9740: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9750: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9760: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9770: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9780: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9790: 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41  ntf_double FORMA
97a0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
97b0: 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  R DOUBLE.**.** C
97c0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
97d0: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
97e0: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64  uments and one d
97f0: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a  ouble argument.*
9800: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9810: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
9820: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ble(.  void *Not
9830: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
9840: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9850: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9860: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9870: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9880: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
9890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
98a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
98b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
98c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
98d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
98e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
98f0: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64  int a[3], i;.  d
9900: 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20  ouble r;.  char 
9910: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
9920: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9930: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9940: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9950: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9960: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9970: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
9980: 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a   DOUBLE\"", 0);.
9990: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
99a0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
99b0: 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=2; i<4; i++){.
99c0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
99d0: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
99e0: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
99f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a00: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
9a10: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
9a20: 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20   argv[4], &r) ) 
9a30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9a40: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
9a50: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
9a60: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b   a[0], a[1], r);
9a70: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
9a80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
9a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9aa0: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
9ab0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9ac0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
9ad0: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46  mprintf_scaled F
9ae0: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
9af0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9b00: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
9b10: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
9b20: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
9b30: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
9b40: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
9b50: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
9b60: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
9b70: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
9b80: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
9b90: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
9ba0: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
9bb0: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
9bc0: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
9bd0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
9be0: 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69  tf_scaled(.  voi
9bf0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c10: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9c20: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9c30: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9c40: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9c50: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9c60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9c70: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9c80: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9c90: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9ca0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9cb0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64  .){.  int i;.  d
9cc0: 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68  ouble r[2];.  ch
9cd0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9ce0: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
9cf0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9d00: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9d10: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9d20: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9d30: 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42     " FORMAT DOUB
9d40: 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29  LE DOUBLE\"", 0)
9d50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9d60: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9d70: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
9d80: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
9d90: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20  tDouble(interp, 
9da0: 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d  argv[i], &r[i-2]
9db0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9dc0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9dd0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
9de0: 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b  argv[1], r[0]*r[
9df0: 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
9e00: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9e10: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9e20: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9e30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9e40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9e50: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
9e60: 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e  nly FORMAT STRIN
9e70: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9e80: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
9e90: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
9ea0: 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
9eb0: 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a  product of the.*
9ec0: 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  * two arguments 
9ed0: 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68  given above.  Th
9ee0: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  is is used to ge
9ef0: 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20  nerate overflow 
9f00: 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a  and underflow.**
9f10: 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74   doubles to test
9f20: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
9f30: 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c  onverted properl
9f40: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
9f50: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9f60: 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  _stronly(.  void
9f70: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9f80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9f90: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9fa0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9fb0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9fc0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9fd0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9fe0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9ff0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a000: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a010: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a020: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a030: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
a040: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
a050: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
a070: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
a080: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
a090: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
a0a0: 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  AT STRING\"", 0)
a0b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a0c0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
a0d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a0e0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b  f(argv[1], argv[
a0f0: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
a100: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a110: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a120: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a130: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a140: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a150: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
a160: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58  ouble FORMAT HEX
a170: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
a180: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
a190: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
a1a0: 74 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76  t which is deriv
a1b0: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68  ed from the.** h
a1c0: 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64  exadecimal encod
a1d0: 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64  ing of an IEEE d
a1e0: 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
a1f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
a200: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a210: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a220: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a230: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a240: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a250: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a260: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a270: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a280: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a290: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a2a0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a2c0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a2d0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a2e0: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a2f0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a300: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a310: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a320: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a330: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a340: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a350: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a360: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a370: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a380: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a390: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a3a0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a3b0: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a3c0: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a3d0: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a3e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a3f0: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a400: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a410: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a420: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a430: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a440: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a450: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a460: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a470: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a480: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a490: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a4a0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a4b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a4c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a4d0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a4e0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a4f0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a500: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a510: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a520: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a530: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a540: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a550: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
a560: 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65  e_shared(.  Clie
a570: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a580: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a590: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a5a0: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a660: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a670: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e  int enable;.  in
a680: 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  t ret = 0;..  if
a690: 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
a6a0: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
a6b0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a6c0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
a6d0: 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20  BOOLEAN?");.    
a6e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a6f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71  ;.  }.  ret = sq
a700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a710: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
a720: 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  bled;..  if( obj
a730: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
a740: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
a750: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a760: 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20  jv[1], &enable) 
a770: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a780: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a790: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a7a0: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
a7b0: 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20  cache(enable);. 
a7c0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a7d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
a7e0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
a7f0: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
a800: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54  te3ErrStr(rc), T
a810: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
a820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a830: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
a840: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
a850: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
a860: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29  BooleanObj(ret))
a870: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a880: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  K;.}.#endif..../
a890: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
a8a0: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
a8b0: 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20  ult_codes   DB  
a8c0: 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a    BOOLEAN.**.*/.
a8d0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
a8e0: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
a8f0: 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  codes(.  ClientD
a900: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
a910: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
a920: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
a930: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
a940: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a950: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a960: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a970: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a980: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a990: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
a9a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a9b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
a9c0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
a9d0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
a9e0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
a9f0: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
aa00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
aa10: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
aa20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
aa30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
aa40: 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
aa50: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
aa60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
aa70: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
aa80: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
aa90: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
aaa0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
aab0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
aac0: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
aad0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
aae0: 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[2], &enable)
aaf0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ab00: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ROR;.  sqlite3_e
ab10: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
ab20: 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29  odes(db, enable)
ab30: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
ab40: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
ab50: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  e: sqlite3_libve
ab60: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a  rsion_number.**.
ab70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ab80: 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
ab90: 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  mber(.  ClientDa
aba0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
abb0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
abc0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
abd0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
abe0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
abf0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
ac00: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
ac10: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
ac20: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
ac30: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
ac40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
ac50: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
ac60: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
ac70: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
ac80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
ac90: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
aca0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
acb0: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
acc0: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
acd0: 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  er()));.  return
ace0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
acf0: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
ad00: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
ad10: 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65  tadata DB dbname
ad20: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
ad30: 0a 2a 2a 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  .**.*/.#ifdef SQ
ad40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
ad50: 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 73 74 61 74  MN_METADATA.stat
ad60: 69 63 20 69 6e 74 20 74 65 73 74 5f 74 61 62 6c  ic int test_tabl
ad70: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ad80: 61 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  a(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
ae80: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
ae90: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
aea0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62   const char *zTb
aeb0: 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
aec0: 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zCol;.  int rc;
aed0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
aee0: 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
aef0: 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20 20 63 6f  *zDatatype;.  co
af00: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73  nst char *zColls
af10: 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c  eq;.  int notnul
af20: 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  l;.  int primary
af30: 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  key;.  int autoi
af40: 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28  ncrement;..  if(
af50: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
af60: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
af70: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
af80: 2c 20 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c  , "DB dbname tbl
af90: 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a  name colname");.
afa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
afb0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
afc0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
afd0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
afe0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
aff0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b000: 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63  RROR;.  zDb = Tc
b010: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b020: 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54  [2]);.  zTbl = T
b030: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
b040: 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  v[3]);.  zCol = 
b050: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b060: 6a 76 5b 34 5d 29 3b 0a 0a 20 20 69 66 28 20 73  jv[4]);..  if( s
b070: 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29 20  trlen(zDb)==0 ) 
b080: 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  zDb = 0;..  rc =
b090: 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
b0a0: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 64  olumn_metadata(d
b0b0: 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a 43  b, zDb, zTbl, zC
b0c0: 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61 74  ol, .      &zDat
b0d0: 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65 71  atype, &zCollseq
b0e0: 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72 69  , &notnull, &pri
b0f0: 6d 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69 6e  marykey, &autoin
b100: 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66 28  crement);..  if(
b110: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
b120: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
b130: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
b140: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
b150: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
b160: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
b170: 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e  ..  pRet = Tcl_N
b180: 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c  ewObj();.  Tcl_L
b190: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
b1a0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
b1b0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 44  _NewStringObj(zD
b1c0: 61 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20  atatype, -1));. 
b1d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b1e0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b1f0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b200: 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31  Obj(zCollseq, -1
b210: 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
b220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b230: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
b240: 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b  ntObj(notnull));
b250: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
b260: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
b270: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
b280: 62 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29 3b  bj(primarykey));
b290: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
b2a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
b2b0: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
b2c0: 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  bj(autoincrement
b2d0: 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
b2e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
b2f0: 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
b300: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
b310: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b320: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a  _OMIT_INCRBLOB..
b330: 73 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48  static int blobH
b340: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20  andleFromObj(.  
b350: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b360: 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  rp, .  Tcl_Obj *
b370: 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f  pObj,.  sqlite3_
b380: 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b  blob **ppBlob.){
b390: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
b3a0: 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f  t n;..  z = Tcl_
b3b0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
b3c0: 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66  (pObj, &n);.  if
b3d0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  ( n==0 ){.    *p
b3e0: 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c  pBlob = 0;.  }el
b3f0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  se{.    int notU
b400: 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  sed;.    Tcl_Cha
b410: 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20  nnel channel;.  
b420: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73    ClientData ins
b430: 74 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a  tanceData;.    .
b440: 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63      channel = Tc
b450: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
b460: 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64  erp, z, &notUsed
b470: 29 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e  );.    if( !chan
b480: 6e 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c  nel ) return TCL
b490: 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c  _ERROR;..    Tcl
b4a0: 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b  _Flush(channel);
b4b0: 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68  .    Tcl_Seek(ch
b4c0: 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53  annel, 0, SEEK_S
b4d0: 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e  ET);..    instan
b4e0: 63 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74  ceData = Tcl_Get
b4f0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
b500: 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20  ata(channel);.  
b510: 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73    *ppBlob = *((s
b520: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69  qlite3_blob **)i
b530: 6e 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20  nstanceData);.  
b540: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
b550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  OK;.}../*.** sql
b560: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 20  ite3_blob_bytes 
b570: 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74   CHANNEL.*/.stat
b580: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
b590: 5f 62 79 74 65 73 28 0a 20 20 43 6c 69 65 6e 74  _bytes(.  Client
b5a0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
b5b0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
b5c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
b5d0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
b5e0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
b5f0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
b600: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
b610: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
b620: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
b630: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
b640: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
b650: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
b660: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
b670: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  .){.  sqlite3_bl
b680: 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ob *pBlob;.  int
b690: 20 6e 42 79 74 65 3b 0a 20 20 0a 20 20 69 66 28   nByte;.  .  if(
b6a0: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
b6b0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
b6c0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
b6d0: 2c 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20  , "CHANNEL");.  
b6e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b6f0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
b700: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
b710: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
b720: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
b730: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b740: 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  nByte = sqlite3_
b750: 62 6c 6f 62 5f 62 79 74 65 73 28 70 42 6c 6f 62  blob_bytes(pBlob
b760: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
b770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
b780: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 42 79 74  l_NewIntObj(nByt
b790: 65 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  e));..  return T
b7a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b7b0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f  sqlite3_blob_clo
b7c0: 73 65 20 20 43 48 41 4e 4e 45 4c 0a 2a 2f 0a 73  se  CHANNEL.*/.s
b7d0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
b7e0: 6c 6f 62 5f 63 6c 6f 73 65 28 0a 20 20 43 6c 69  lob_close(.  Cli
b7f0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b800: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
b810: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
b820: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
b830: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
b840: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
b850: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
b860: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
b870: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b880: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b890: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b8a0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b8b0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b8c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
b8d0: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
b8e0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
b8f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
b900: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b910: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
b920: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
b930: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
b940: 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46   if( blobHandleF
b950: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
b960: 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20  bjv[1], &pBlob) 
b970: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b980: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c  OR;.  sqlite3_bl
b990: 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
b9a0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b9b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69  K;.}../*.** sqli
b9c0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 20 20 43  te3_blob_read  C
b9d0: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 4e 0a  HANNEL OFFSET N.
b9e0: 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d  **.**   This com
b9f0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
ba00: 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  test the sqlite3
ba10: 5f 62 6c 6f 62 5f 72 65 61 64 28 29 20 69 6e 20  _blob_read() in 
ba20: 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74  ways that.**   t
ba30: 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69  he Tcl channel i
ba40: 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f  nterface does no
ba50: 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
ba60: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  ument should.** 
ba70: 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66    be the name of
ba80: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c   a valid channel
ba90: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
baa0: 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f  [incrblob] metho
bab0: 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61  d.**   of a data
bac0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
bad0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
bae0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
baf0: 61 64 28 29 0a 2a 2a 20 20 20 74 6f 20 72 65 61  ad().**   to rea
bb00: 64 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  d N bytes from o
bb10: 66 66 73 65 74 20 4f 46 46 53 45 54 20 66 72 6f  ffset OFFSET fro
bb20: 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  m the underlying
bb30: 20 53 51 4c 69 74 65 0a 2a 2a 20 20 20 62 6c 6f   SQLite.**   blo
bb40: 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20  b handle..**.** 
bb50: 20 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 20    On success, a 
bb60: 62 79 74 65 2d 61 72 72 61 79 20 6f 62 6a 65 63  byte-array objec
bb70: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
bb80: 20 72 65 61 64 20 64 61 74 61 20 69 73 20 0a 2a   read data is .*
bb90: 2a 20 20 20 72 65 74 75 72 6e 65 64 2e 20 4f 6e  *   returned. On
bba0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69 6e   failure, the in
bbb0: 74 65 72 70 72 65 74 65 72 20 72 65 73 75 6c 74  terpreter result
bbc0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a   is set to the.*
bbd0: 2a 20 20 20 74 65 78 74 20 72 65 70 72 65 73 65  *   text represe
bbe0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ntation of the r
bbf0: 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63 6f  eturned error co
bc00: 64 65 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45  de (i.e. "SQLITE
bc10: 5f 4e 4f 4d 45 4d 22 29 0a 2a 2a 20 20 20 61 6e  _NOMEM").**   an
bc20: 64 20 61 20 54 63 6c 20 65 78 63 65 70 74 69 6f  d a Tcl exceptio
bc30: 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a  n is thrown..*/.
bc40: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
bc50: 62 6c 6f 62 5f 72 65 61 64 28 0a 20 20 43 6c 69  blob_read(.  Cli
bc60: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
bc70: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
bc80: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
bc90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
bca0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
bcb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
bcc0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
bcd0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
bce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bcf0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bd00: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
bd10: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
bd20: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
bd30: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
bd40: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bd50: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  int nByte;.  int
bd60: 20 69 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73 69   iOffset;.  unsi
bd70: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 20  gned char *zBuf 
bd80: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
bd90: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
bda0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
bdb0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
bdc0: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
bdd0: 4c 20 4f 46 46 53 45 54 20 4e 22 29 3b 0a 20 20  L OFFSET N");.  
bde0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
bdf0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
be00: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
be10: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
be20: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
be30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
be40: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
be50: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
be60: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
be70: 69 4f 66 66 73 65 74 29 0a 20 20 20 7c 7c 20 54  iOffset).   || T
be80: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
be90: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bea0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 79 74 65   objv[3], &nByte
beb0: 29 0a 20 20 29 7b 20 0a 20 20 20 20 72 65 74 75  ).  ){ .    retu
bec0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bed0: 7d 0a 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 30  }..  if( nByte>0
bee0: 20 29 7b 0a 20 20 20 20 7a 42 75 66 20 3d 20 28   ){.    zBuf = (
bef0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
bf00: 54 63 6c 5f 41 6c 6c 6f 63 28 6e 42 79 74 65 29  Tcl_Alloc(nByte)
bf10: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bf20: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
bf30: 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42 79 74  Blob, zBuf, nByt
bf40: 65 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 69  e, iOffset);.  i
bf50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
bf60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
bf70: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
bf80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
bf90: 79 4f 62 6a 28 7a 42 75 66 2c 20 6e 42 79 74 65  yObj(zBuf, nByte
bfa0: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
bfb0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
bfc0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
bfd0: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
bfe0: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
bff0: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
c000: 28 28 63 68 61 72 20 2a 29 7a 42 75 66 29 3b 0a  ((char *)zBuf);.
c010: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
c020: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f  QLITE_OK ? TCL_O
c030: 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  K : TCL_ERROR);.
c040: 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  }../*.** sqlite3
c050: 5f 62 6c 6f 62 5f 77 72 69 74 65 20 43 48 41 4e  _blob_write CHAN
c060: 4e 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20  NEL OFFSET DATA 
c070: 3f 4e 44 41 54 41 3f 0a 2a 2a 0a 2a 2a 20 20 20  ?NDATA?.**.**   
c080: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
c090: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
c0a0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
c0b0: 69 74 65 28 29 20 69 6e 20 77 61 79 73 20 74 68  ite() in ways th
c0c0: 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20  at.**   the Tcl 
c0d0: 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63  channel interfac
c0e0: 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20  e does not. The 
c0f0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73  first argument s
c100: 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68  hould.**   be th
c110: 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69  e name of a vali
c120: 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65  d channel create
c130: 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c  d by the [incrbl
c140: 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20  ob] method.**   
c150: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 68 61  of a database ha
c160: 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  ndle. This funct
c170: 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
c180: 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29 0a 2a  3_blob_write().*
c190: 2a 20 20 20 74 6f 20 77 72 69 74 65 20 74 68 65  *   to write the
c1a0: 20 44 41 54 41 20 62 79 74 65 2d 61 72 72 61 79   DATA byte-array
c1b0: 20 74 6f 20 74 68 65 20 75 6e 64 65 72 6c 79 69   to the underlyi
c1c0: 6e 67 20 53 51 4c 69 74 65 20 62 6c 6f 62 20 68  ng SQLite blob h
c1d0: 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 61 74 20 6f  andle..**   at o
c1e0: 66 66 73 65 74 20 4f 46 46 53 45 54 2e 0a 2a 2a  ffset OFFSET..**
c1f0: 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63 65 73 73  .**   On success
c200: 2c 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  , an empty strin
c210: 67 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  g is returned. O
c220: 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 69  n failure, the i
c230: 6e 74 65 72 70 72 65 74 65 72 0a 2a 2a 20 20 20  nterpreter.**   
c240: 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74 6f  result is set to
c250: 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65 73   the text repres
c260: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c270: 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 63  returned error c
c280: 6f 64 65 20 0a 2a 2a 20 20 20 28 69 2e 65 2e 20  ode .**   (i.e. 
c290: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 20  "SQLITE_NOMEM") 
c2a0: 61 6e 64 20 61 20 54 63 6c 20 65 78 63 65 70 74  and a Tcl except
c2b0: 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e 2e 0a 2a  ion is thrown..*
c2c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
c2d0: 74 5f 62 6c 6f 62 5f 77 72 69 74 65 28 0a 20 20  t_blob_write(.  
c2e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c2f0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
c300: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
c310: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
c320: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
c330: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
c340: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
c350: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
c360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c370: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c380: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c390: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
c3a0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c3b0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
c3c0: 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b  te3_blob *pBlob;
c3d0: 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b 0a  .  int iOffset;.
c3e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 75 6e 73    int rc;..  uns
c3f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
c400: 3b 0a 20 20 69 6e 74 20 6e 42 75 66 3b 0a 20 20  ;.  int nBuf;.  
c410: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26  .  if( objc!=4 &
c420: 26 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  & objc!=5 ){.   
c430: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
c440: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
c450: 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53  v, "CHANNEL OFFS
c460: 45 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 22  ET DATA ?NDATA?"
c470: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c480: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
c490: 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72  if( blobHandleFr
c4a0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
c4b0: 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29  jv[1], &pBlob) )
c4c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c4d0: 52 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  R;.  if( TCL_OK!
c4e0: 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  =Tcl_GetIntFromO
c4f0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c500: 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 20 29 7b  2], &iOffset) ){
c510: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
c520: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
c530: 42 75 66 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Buf = Tcl_GetByt
c540: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
c550: 6a 76 5b 33 5d 2c 20 26 6e 42 75 66 29 3b 0a 20  jv[3], &nBuf);. 
c560: 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20   if( objc==5 && 
c570: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
c580: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
c590: 5d 2c 20 26 6e 42 75 66 29 20 29 7b 0a 20 20 20  ], &nBuf) ){.   
c5a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c5b0: 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
c5c0: 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
c5d0: 28 70 42 6c 6f 62 2c 20 7a 42 75 66 2c 20 6e 42  (pBlob, zBuf, nB
c5e0: 75 66 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20  uf, iOffset);.  
c5f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c600: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
c610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
c620: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
c630: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56  rName(rc), TCL_V
c640: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20  OLATILE);.  }.. 
c650: 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
c660: 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20  ITE_OK ? TCL_OK 
c670: 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a  : TCL_ERROR);.}.
c680: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c690: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20  _blob_reopen(.  
c6a0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
c6b0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
c6c0: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
c6d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
c6e0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
c6f0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
c700: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
c710: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c730: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c740: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
c750: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
c760: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c770: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
c780: 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a  WideInt iRowid;.
c790: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
c7a0: 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b  pBlob;.  int rc;
c7b0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
c7c0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
c7d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c7e0: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
c7f0: 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72  L ROWID");.    r
c800: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c810: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
c820: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
c830: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
c840: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
c850: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
c860: 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
c870: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
c880: 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29  bjv[2], &iRowid)
c890: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
c8a0: 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
c8b0: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
c8c0: 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b  (pBlob, iRowid);
c8d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c8e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
c8f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c900: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c910: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
c920: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
c930: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
c940: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f  SQLITE_OK ? TCL_
c950: 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b  OK : TCL_ERROR);
c960: 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
c970: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
c980: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c990: 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e  n_v2 DB-HANDLE N
c9a0: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c9b0: 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68  -PROC.**.**   Th
c9c0: 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75  is Tcl proc is u
c9d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
c9e0: 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  the experimental
c9f0: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72  .**   sqlite3_cr
ca00: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76  eate_collation_v
ca10: 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  2() interface..*
ca20: 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c  /.struct TestCol
ca30: 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f  lationX {.  Tcl_
ca40: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
ca50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b    Tcl_Obj *pCmp;
ca60: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c  .  Tcl_Obj *pDel
ca70: 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ;.};.typedef str
ca80: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
ca90: 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  nX TestCollation
caa0: 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  X;.static void t
cab0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
cac0: 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78  onDel(void *pCtx
cad0: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
cae0: 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f  onX *p = (TestCo
caf0: 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b  llationX *)pCtx;
cb00: 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c  ..  int rc = Tcl
cb10: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
cb20: 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54  terp, p->pDel, T
cb30: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54  CL_EVAL_DIRECT|T
cb40: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
cb50: 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
cb60: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63  K ){.    Tcl_Bac
cb70: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
cb80: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
cb90: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cba0: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c  (p->pCmp);.  Tcl
cbb0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
cbc0: 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >pDel);.  sqlite
cbd0: 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70  3_free((void *)p
cbe0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
cbf0: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
cc00: 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a  ionCmp(.  void *
cc10: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66  pCtx,.  int nLef
cc20: 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t,.  const void 
cc30: 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52  *zLeft,.  int nR
cc40: 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  ight,.  const vo
cc50: 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20  id *zRight.){.  
cc60: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cc70: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
cc80: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63  onX *)pCtx;.  Tc
cc90: 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d  l_Obj *pScript =
cca0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
ccb0: 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e  j(p->pCmp);.  in
ccc0: 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54  t iRes = 0;..  T
ccd0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
cce0: 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f  pScript);.  Tcl_
ccf0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
cd00: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
cd10: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
cd20: 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c  j((char *)zLeft,
cd30: 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f   nLeft));.  Tcl_
cd40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
cd50: 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c  ment(0, pScript,
cd60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
cd70: 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74  j((char *)zRight
cd80: 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66  ,nRight));..  if
cd90: 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76  ( TCL_OK!=Tcl_Ev
cda0: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
cdb0: 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f  p, pScript, TCL_
cdc0: 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f  EVAL_DIRECT|TCL_
cdd0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20  EVAL_GLOBAL).   
cde0: 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  || TCL_OK!=Tcl_G
cdf0: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e  etIntFromObj(p->
ce00: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f  interp, Tcl_GetO
ce10: 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  bjResult(p->inte
ce20: 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b  rp), &iRes).  ){
ce30: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
ce40: 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65  undError(p->inte
ce50: 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44  rp);.  }.  Tcl_D
ce60: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ecrRefCount(pScr
ce70: 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ipt);..  return 
ce80: 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69  iRes;.}.static i
ce90: 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63  nt test_create_c
cea0: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43  ollation_v2(.  C
ceb0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
cec0: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
ced0: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
cee0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
cef0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
cf00: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
cf10: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
cf20: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
cf30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cf40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
cf50: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
cf60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
cf70: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
cf80: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43  ts */.){.  TestC
cf90: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20  ollationX *p;.  
cfa0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
cfb0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
cfc0: 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
cfd0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
cfe0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
cff0: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
d000: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
d010: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
d020: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d030: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
d040: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d050: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
d060: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d070: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d  CL_ERROR;..  p =
d080: 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58   (TestCollationX
d090: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
d0a0: 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c  c(sizeof(TestCol
d0b0: 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e  lationX));.  p->
d0c0: 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a  pCmp = objv[3];.
d0d0: 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76    p->pDel = objv
d0e0: 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70  [4];.  p->interp
d0f0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c   = interp;.  Tcl
d100: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
d110: 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e  >pCmp);.  Tcl_In
d120: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
d130: 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  el);..  rc = sql
d140: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d150: 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c  ation_v2(db, Tcl
d160: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d170: 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20 20  2]), 16, .      
d180: 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43  (void *)p, testC
d190: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
d1a0: 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  p, testCreateCol
d1b0: 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20  lationDel.  );. 
d1c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d1d0: 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54 63  MISUSE ){.    Tc
d1e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d1f0: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
d200: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f 76  create_collate_v
d210: 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64 65  2() failed to de
d220: 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61 6e  tect ".      "an
d230: 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69 6e   invalid encodin
d240: 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g", (char*)0);. 
d250: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d260: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
d270: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
d280: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20  ollation_v2(db, 
d290: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d2a0: 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55  jv[2]), SQLITE_U
d2b0: 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f 69  TF8, .      (voi
d2c0: 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74  d *)p, testCreat
d2d0: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74  eCollationCmp, t
d2e0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
d2f0: 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74  onDel.  );.  ret
d300: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d310: 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c 69  *.** USAGE: sqli
d320: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
d330: 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20 4e  ion_v2 DB NAME N
d340: 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48 45  ARG ENC ?SWITCHE
d350: 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61 62  S?.**.** Availab
d360: 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65 3a  le switches are:
d370: 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20 20  .**.**   -func  
d380: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 73    SCRIPT.**   -s
d390: 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  tep    SCRIPT.**
d3a0: 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52 49     -final   SCRI
d3b0: 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f 79  PT.**   -destroy
d3c0: 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65 64   SCRIPT.*/.typed
d3d0: 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74 65  ef struct Create
d3e0: 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61 74  FunctionV2 Creat
d3f0: 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74 72  eFunctionV2;.str
d400: 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74 69  uct CreateFuncti
d410: 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e 74  onV2 {.  Tcl_Int
d420: 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
d430: 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20 20  cl_Obj *pFunc;  
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d450: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75 6e  * Script for fun
d460: 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e  ction invocation
d470: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70   */.  Tcl_Obj *p
d480: 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20 20  Step;           
d490: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
d4a0: 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69 6e  for agg. step in
d4b0: 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  vocation */.  Tc
d4c0: 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20 20  l_Obj *pFinal;  
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d4e0: 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e   Script for agg.
d4f0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69 6e   finalization in
d500: 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  vocation */.  Tc
d510: 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79 3b  l_Obj *pDestroy;
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d530: 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72 69   Destructor scri
d540: 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  pt */.};.static 
d550: 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71 6c  void cf2Func(sql
d560: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
d570: 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
d580: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72  ite3_value **aAr
d590: 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  g){.}.static voi
d5a0: 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74 65  d cf2Step(sqlite
d5b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
d5c0: 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
d5d0: 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b  3_value **aArg){
d5e0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
d5f0: 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f  f2Final(sqlite3_
d600: 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a 7d  context *ctx){.}
d610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
d620: 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70 55  Destroy(void *pU
d630: 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46 75  ser){.  CreateFu
d640: 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28 43  nctionV2 *p = (C
d650: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d660: 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28 20  *)pUser;..  if( 
d670: 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d 3e  p->interp && p->
d680: 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  pDestroy ){.    
d690: 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  int rc = Tcl_Eva
d6a0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
d6b0: 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20 30  , p->pDestroy, 0
d6c0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54  );.    if( rc!=T
d6d0: 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63 6b  CL_OK ) Tcl_Back
d6e0: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
d6f0: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 69  nterp);.  }..  i
d700: 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63  f( p->pFunc ) Tc
d710: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
d720: 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28  ->pFunc); .  if(
d730: 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f   p->pStep ) Tcl_
d740: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
d750: 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70  pStep); .  if( p
d760: 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 44  ->pFinal ) Tcl_D
d770: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
d780: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
d790: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c  ->pDestroy ) Tcl
d7a0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
d7b0: 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20 73  >pDestroy); .  s
d7c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d7d0: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
d7e0: 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
d7f0: 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  n_v2(.  ClientDa
d800: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20  ta clientData,  
d810: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
d820: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
d830: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
d840: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d850: 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e 74  invoking TCL int
d860: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69 6e  erpreter */.  in
d870: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d890: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d8a0: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d8b0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
d8d0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
d8e0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d8f0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
d900: 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20 6e   *zFunc;.  int n
d910: 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b 0a  Arg;.  int enc;.
d920: 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e    CreateFunction
d930: 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  V2 *p;.  int i;.
d940: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74 72    int rc;..  str
d950: 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a 20  uct EncTable {. 
d960: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
d970: 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e 63  Enc;.    int enc
d980: 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20 7b  ;.  } aEnc[] = {
d990: 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20 20  .    {"utf8",   
d9a0: 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c 0a   SQLITE_UTF8 },.
d9b0: 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20 20      {"utf16",   
d9c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c 0a  SQLITE_UTF16 },.
d9d0: 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c 20      {"utf16le", 
d9e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7d  SQLITE_UTF16LE }
d9f0: 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65 22  ,.    {"utf16be"
da00: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
da10: 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c 20   },.    {"any", 
da20: 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20 7d      SQLITE_ANY }
da30: 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d 0a  ,.    {"0", 0 }.
da40: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
da50: 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d 3d  <5 || (objc%2)==
da60: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  0 ){.    Tcl_Wro
da70: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
da80: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e  , 1, objv, "DB N
da90: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57 49  AME NARG ENC SWI
daa0: 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20 20  TCHES...");.    
dab0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dac0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
dad0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
dae0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
daf0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
db00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
db10: 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63 6c  R;.  zFunc = Tcl
db20: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
db30: 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
db40: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
db50: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
db60: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  Arg) ) return TC
db70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
db80: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
db90: 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c  bjStruct(interp,
dba0: 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c 20   objv[4], aEnc, 
dbb0: 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29 2c  sizeof(aEnc[0]),
dbc0: 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e 63   .          "enc
dbd0: 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63 29  oding", 0, &enc)
dbe0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
dbf0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dc00: 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e 63    enc = aEnc[enc
dc10: 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73 71  ].enc;..  p = sq
dc20: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
dc30: 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69  eof(CreateFuncti
dc40: 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72 74  onV2));.  assert
dc50: 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ( p );.  memset(
dc60: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72 65  p, 0, sizeof(Cre
dc70: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b  ateFunctionV2));
dc80: 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69  .  p->interp = i
dc90: 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69 3d  nterp;..  for(i=
dca0: 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32 29  5; i<objc; i+=2)
dcb0: 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74 63  {.    int iSwitc
dcc0: 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  h;.    const cha
dcd0: 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d 20  r *azSwitch[] = 
dce0: 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65 70  {"-func", "-step
dcf0: 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d 64  ", "-final", "-d
dd00: 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20 20  estroy", 0};.   
dd10: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65   if( Tcl_GetInde
dd20: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
dd30: 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69 74   objv[i], azSwit
dd40: 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30 2c  ch, "switch", 0,
dd50: 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20 20   &iSwitch) ){.  
dd60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
dd70: 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  (p);.      retur
dd80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
dd90: 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20   }..    switch( 
dda0: 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 20  iSwitch ){.     
ddb0: 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75 6e   case 0: p->pFun
ddc0: 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  c = objv[i+1];  
ddd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
dde0: 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74 65   case 1: p->pSte
ddf0: 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20  p = objv[i+1];  
de00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
de10: 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69 6e   case 2: p->pFin
de20: 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  al = objv[i+1]; 
de30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
de40: 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65 73   case 3: p->pDes
de50: 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  troy = objv[i+1]
de60: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ;   break;.    }
de70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 46  .  }.  if( p->pF
de80: 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20 3d  unc ) p->pFunc =
de90: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
dea0: 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20  j(p->pFunc); .  
deb0: 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20 70  if( p->pStep ) p
dec0: 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44 75  ->pStep = Tcl_Du
ded0: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 53  plicateObj(p->pS
dee0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
def0: 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69 6e  pFinal ) p->pFin
df00: 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  al = Tcl_Duplica
df10: 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c 29  teObj(p->pFinal)
df20: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
df30: 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74 72  troy ) p->pDestr
df40: 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  oy = Tcl_Duplica
df50: 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72 6f  teObj(p->pDestro
df60: 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e 70  y); ..  if( p->p
df70: 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72 52  Func ) Tcl_IncrR
df80: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63  efCount(p->pFunc
df90: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74  ); .  if( p->pSt
dfa0: 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  ep ) Tcl_IncrRef
dfb0: 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b  Count(p->pStep);
dfc0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
dfd0: 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  l ) Tcl_IncrRefC
dfe0: 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b  ount(p->pFinal);
dff0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74   .  if( p->pDest
e000: 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  roy ) Tcl_IncrRe
e010: 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72  fCount(p->pDestr
e020: 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73 71  oy); ..  rc = sq
e030: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e040: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75  ction_v2(db, zFu
e050: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 28  nc, nArg, enc, (
e060: 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20 20  void *)p, .     
e070: 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66 32   (p->pFunc ? cf2
e080: 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20 20  Func : 0),.     
e090: 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66 32   (p->pStep ? cf2
e0a0: 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20 20  Step : 0),.     
e0b0: 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63 66   (p->pFinal ? cf
e0c0: 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20 20  2Final : 0),.   
e0d0: 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20 20     cf2Destroy.  
e0e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e0f0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
e100: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
e110: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41  terp);.    Tcl_A
e120: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e130: 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
e140: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
e150: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e160: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
e170: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e180: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
e190: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  oad_extension DB
e1a0: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
e1b0: 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OC?.*/.static in
e1c0: 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65  t test_load_exte
e1d0: 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44  nsion(.  ClientD
e1e0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
e1f0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
e200: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e210: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e220: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e230: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e240: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e250: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
e260: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e270: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e280: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
e290: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
e2a0: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
e2b0: 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
e2c0: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69   cmdInfo;.  sqli
e2d0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
e2e0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a  c;.  char *zDb;.
e2f0: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
e300: 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20 30   char *zProc = 0
e310: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
e320: 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
e330: 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =4 && objc!=3 ){
e340: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
e350: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
e360: 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c   objv, "DB-HANDL
e370: 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b  E FILE ?PROC?");
e380: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e390: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
e3a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
e3b0: 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46 69  (objv[1]);.  zFi
e3c0: 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
e3d0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
e3e0: 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
e3f0: 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47 65    zProc = Tcl_Ge
e400: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
e410: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74 72  ;.  }..  /* Extr
e420: 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61  act the C databa
e430: 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  se handle from t
e440: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  he Tcl command n
e450: 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63  ame */.  if( !Tc
e460: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
e470: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
e480: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
e490: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e4a0: 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
e4b0: 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a   not found: ", z
e4c0: 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Db, (char*)0);. 
e4d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e4e0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
e4f0: 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
e500: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
e510: 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
e520: 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20   assert(db);..  
e530: 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64 65  /* Call the unde
e540: 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69 6f  rlying C functio
e550: 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  n. If an error o
e560: 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f  ccurs, set rc to
e570: 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f 52   .  ** TCL_ERROR
e580: 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65 72   and load any er
e590: 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f 20  ror string into 
e5a0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
e5b0: 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72 72   If no .  ** err
e5c0: 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72  or occurs, set r
e5d0: 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20 2a  c to TCL_OK..  *
e5e0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
e5f0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
e600: 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  ION.  rc = SQLIT
e610: 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72 20  E_ERROR;.  zErr 
e620: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
e630: 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  f("this build om
e640: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
e650: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
e660: 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c  #else.  rc = sql
e670: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
e680: 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  ion(db, zFile, z
e690: 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65  Proc, &zErr);.#e
e6a0: 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
e6b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e6c0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
e6d0: 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72  terp, zErr ? zEr
e6e0: 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41  r : "", TCL_VOLA
e6f0: 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20  TILE);.    rc = 
e700: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
e710: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c  se{.    rc = TCL
e720: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
e730: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a  e3_free(zErr);..
e740: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e750: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
e760: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  ite3_enable_load
e770: 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41  _extension DB-HA
e780: 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74  NDLE ONOFF.*/.st
e790: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e  atic int test_en
e7a0: 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69  able_load(.  Cli
e7b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
e7c0: 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20  ta, /* Not used 
e7d0: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
e7e0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e7f0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e800: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e810: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e820: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
e830: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e840: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e850: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
e860: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
e870: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
e880: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64   */.){.  Tcl_Cmd
e890: 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
e8a0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
e8b0: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20  har *zDb;.  int 
e8c0: 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62  onoff;..  if( ob
e8d0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
e8e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
e8f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
e900: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22  DB-HANDLE ONOFF"
e910: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
e920: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
e930: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
e940: 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  ng(objv[1]);..  
e950: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
e960: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
e970: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
e980: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
e990: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
e9a0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
e9b0: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
e9c0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
e9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e9e0: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
e9f0: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
ea00: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
ea10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ea20: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
ea30: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
ea40: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
ea50: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
ea60: 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68  b);..  /* Get th
ea70: 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74 65  e onoff paramete
ea80: 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47  r */.  if( Tcl_G
ea90: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
eaa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
eab0: 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20  , &onoff) ){.   
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ead0: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  R;.  }..#ifdef S
eae0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
eaf0: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f  EXTENSION.  Tcl_
eb00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
eb10: 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c 64  erp, "this build
eb20: 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c   omits sqlite3_l
eb30: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22  oad_extension()"
eb40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
eb50: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
eb60: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
eb70: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c  ad_extension(db,
eb80: 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75 72   onoff);.  retur
eb90: 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66  n TCL_OK;.#endif
eba0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
ebb0: 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a    sqlite_abort.*
ebc0: 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
ebd0: 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64 69  e process immedi
ebe0: 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73 20  ately.  This is 
ebf0: 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75 74  not a clean shut
ec00: 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  down..** This co
ec10: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
ec20: 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76 65   test the recove
ec30: 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64 61  rability of a da
ec40: 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65  tabase in.** the
ec50: 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f 67   event of a prog
ec60: 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74  ram crash..*/.st
ec70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
ec80: 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e  abort(.  void *N
ec90: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
eca0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
ecb0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
ecc0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
ecd0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
ece0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed00: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
ed10: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
ed20: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
ed30: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
ed40: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
ed50: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
ed60: 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64 6f  _VER).  /* We do
ed70: 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73 65   this, otherwise
ed80: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 68   the test will h
ed90: 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75 70  alt with a popup
eda0: 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74 68   message.   * th
edb0: 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 6c  at we have to cl
edc0: 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65 20  ick away before 
edd0: 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63 6f  the test will co
ede0: 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20 20  ntinue..   */.  
edf0: 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61 76  _set_abort_behav
ee00: 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52 45  ior( 0, _CALL_RE
ee10: 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65 6e  PORTFAULT );.#en
ee20: 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29 3b  dif.  exit(255);
ee30: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72  .  assert( inter
ee40: 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  p==0 );   /* Thi
ee50: 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  s will always fa
ee60: 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  il */.  return T
ee70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
ee80: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
ee90: 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d  utine is a user-
eea0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
eeb0: 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f  tion whose purpo
eec0: 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74  se.** is to test
eed0: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f   the sqlite_set_
eee0: 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f  result() API..*/
eef0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
ef00: 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  tFunc(sqlite3_co
ef10: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
ef20: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
ef30: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
ef40: 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d  .  while( argc>=
ef50: 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
ef60: 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68  har *zArg0 = (ch
ef70: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
ef80: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
ef90: 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20 29  .    if( zArg0 )
efa0: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
efb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
efc0: 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20  rg0, "int") ){. 
efd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
efe0: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
eff0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
f000: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a  _int(argv[1]));.
f010: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f020: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
f030: 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30  Arg0,"int64")==0
f040: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f050: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
f060: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
f070: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
f080: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
f090: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
f0a0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73  StrICmp(zArg0,"s
f0b0: 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20  tring")==0 ){.  
f0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f0d0: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
f0e0: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
f0f0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
f100: 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20  v[1]), -1,.     
f110: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
f120: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
f130: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f140: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f150: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
f160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f170: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
f180: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
f190: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
f1a0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
f1b0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
f1c0: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
f1d0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f1e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1f0: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
f200: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
f210: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
f220: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
f230: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f240: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
f250: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
f260: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
f270: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
f280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f290: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
f2a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
f2b0: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
f2c0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
f2d0: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
f2e0: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
f2f0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
f300: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
f310: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
f320: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
f330: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
f340: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
f350: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
f360: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
f370: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
f380: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
f390: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
f3a0: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
f3b0: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
f3c0: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
f3d0: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
f3e0: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
f3f0: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
f400: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
f410: 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66   test_register_f
f420: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
f430: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
f440: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
f450: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
f460: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
f470: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
f480: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
f490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f4a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
f4b0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
f4c0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
f4d0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
f4e0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
f4f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
f500: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67  nt rc;.  if( arg
f510: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f520: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f530: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f540: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f550: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
f560: 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f      " DB FUNCTIO
f570: 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20  N-NAME", 0);.   
f580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f590: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f5a0: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
f5b0: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
f5c0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f5d0: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
f5e0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
f5f0: 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
f600: 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
f610: 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46   0, .      testF
f620: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  unc, 0, 0);.  if
f630: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54  ( rc!=0 ){.    T
f640: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f650: 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
f660: 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
f670: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
f680: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ROR;.  }.  if( s
f690: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
f6a0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
f6b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f6c0: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
f6d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
f6e0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f6f0: 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a  finalize  STMT .
f700: 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61  **.** Finalize a
f710: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
f720: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
f730: 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a   test_finalize(.
f740: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f750: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f760: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f770: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f780: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f790: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f7a0: 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
f7b0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
f7c0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
f7d0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
f7e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f7f0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
f800: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
f810: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
f820: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
f830: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
f840: 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
f850: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
f870: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f880: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f890: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f8a0: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f8b0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70  _ERROR;..  if( p
f8c0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d  Stmt ){.    db =
f8d0: 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
f8e0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f8f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
f900: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  tmt);.  Tcl_SetR
f910: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
f920: 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
f930: 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
f940: 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20  C);.  if( db && 
f950: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
f960: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
f970: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
f980: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
f990: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
f9a0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f9b0: 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53 54  _stmt_status  ST
f9c0: 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54 46  MT  CODE  RESETF
f9d0: 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74 68  LAG.**.** Get th
f9e0: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61  e value of a sta
f9f0: 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d  tus counter from
fa00: 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
fa10: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
fa20: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20 20  _stmt_status(.  
fa30: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fa40: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fa50: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fa60: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fa70: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fa80: 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20 20    int iValue;.  
fa90: 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65 74  int i, op, reset
faa0: 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Flag;.  const ch
fab0: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73  ar *zOpName;.  s
fac0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fad0: 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f  mt;..  static co
fae0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
faf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
fb00: 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a  me;.    int op;.
fb10: 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20    } aOp[] = {.  
fb20: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fb30: 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
fb40: 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45 5f  STEP",   SQLITE_
fb50: 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
fb60: 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20  CAN_STEP   },.  
fb70: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fb80: 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20 20  STATUS_SORT",   
fb90: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fba0: 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20  STMTSTATUS_SORT 
fbb0: 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
fbc0: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fbd0: 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58  STATUS_AUTOINDEX
fbe0: 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
fbf0: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
fc00: 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20 20  NDEX       },.  
fc10: 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54    { "SQLITE_STMT
fc20: 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 22 2c  STATUS_VM_STEP",
fc30: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
fc40: 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54  STMTSTATUS_VM_ST
fc50: 45 50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  EP         },.  
fc60: 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  };.  if( objc!=4
fc70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fc80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fc90: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
fca0: 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54 46  PARAMETER RESETF
fcb0: 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72  LAG");.    retur
fcc0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
fcd0: 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
fce0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
fcf0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fd00: 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
fd10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fd20: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63  ;.  zOpName = Tc
fd30: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fd40: 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
fd50: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f 70   i<ArraySize(aOp
fd60: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
fd70: 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a   strcmp(aOp[i].z
fd80: 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d  Name, zOpName)==
fd90: 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20  0 ){.      op = 
fda0: 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20  aOp[i].op;.     
fdb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fdc0: 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79  }.  if( i>=Array
fdd0: 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20 20  Size(aOp) ){.   
fde0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
fdf0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
fe00: 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72  bjv[2], &op) ) r
fe10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fe20: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
fe30: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
fe40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
fe50: 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29 20  , &resetFlag) ) 
fe60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fe70: 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71 6c  ;.  iValue = sql
fe80: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
fe90: 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65  (pStmt, op, rese
fea0: 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65  tFlag);.  Tcl_Se
feb0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
fec0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
fed0: 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65 74  (iValue));.  ret
fee0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
fef0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
ff00: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20  ite3_next_stmt  
ff10: 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  DB  STMT.**.** R
ff20: 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73  eturn the next s
ff30: 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65  tatment in seque
ff40: 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a  nce after STMT..
ff50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
ff60: 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20  st_next_stmt(.  
ff70: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
ff80: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
ff90: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
ffa0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
ffb0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
ffc0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
ffd0: 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33  pStmt;.  sqlite3
ffe0: 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72   *db = 0;.  char
fff0: 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66   zBuf[50];..  if
10000 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
10010 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10020 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10030 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10040 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10050 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10060 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10070 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29  , " DB STMT", 0)
10080 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10090 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
100a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
100b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
100c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
100d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
100e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
100f0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
10100 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10110 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
10120 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10130 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d  CL_ERROR;.  pStm
10140 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
10150 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29  _stmt(db, pStmt)
10160 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ;.  if( pStmt ){
10170 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10180 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
10190 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
101a0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
101b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
101c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
101d0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
101e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
101f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10200 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10210 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20  _stmt_readonly  
10220 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10230 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69  n true if STMT i
10240 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
10250 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
10260 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
10270 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
10280 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  ed to leave the 
10290 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66  database unmodif
102a0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
102b0 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61  nt test_stmt_rea
102c0 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
102d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
102e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
102f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10300 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10310 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10320 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10330 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
10340 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10350 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10360 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10370 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10380 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10390 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
103a0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
103b0 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
103c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
103d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
103e0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
103f0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10400 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
10410 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10420 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
10430 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
10440 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
10450 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10460 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10470 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29  wBooleanObj(rc))
10480 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10490 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
104a0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
104b0 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  _busy  STMT.**.*
104c0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
104d0 20 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e   STMT is a non-N
104e0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  ULL pointer to a
104f0 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68   statement.** th
10500 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 65 70  at has been step
10510 70 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63  ped but not to c
10520 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ompletion..*/.st
10530 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
10540 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20  mt_busy(.  void 
10550 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10560 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10570 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10580 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10590 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
105a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
105b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
105c0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
105d0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
105e0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
105f0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10600 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10610 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10620 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10630 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
10640 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10650 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10660 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10670 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10680 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10690 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
106a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
106b0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
106c0 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54  busy(pStmt);.  T
106d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
106e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
106f0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a  ooleanObj(rc));.
10700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10720 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72    uses_stmt_jour
10730 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  nal  STMT.**.** 
10740 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
10750 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74 65  TMT uses a state
10760 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
10770 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 73  .static int uses
10780 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20  _stmt_journal(. 
10790 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
107a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
107b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
107c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
107d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
107e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
107f0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
10800 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
10810 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10820 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10830 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10840 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10850 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10860 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10870 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
10880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10890 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
108a0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
108b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
108c0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
108d0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
108e0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
108f0 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28  3_stmt_readonly(
10900 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
10910 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10920 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
10930 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53  nObj(((Vdbe *)pS
10940 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  tmt)->usesStmtJo
10950 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  urnal));.  retur
10960 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
10970 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10980 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20  te3_reset  STMT 
10990 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  .**.** Reset a s
109a0 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
109b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
109c0 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
109d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
109e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
109f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10a00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10a10 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10a20 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10a30 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
10a40 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10a50 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10a60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10a70 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10a80 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10a90 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10aa0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10ab0 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
10ac0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10ae0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10af0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10b00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10b10 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
10b20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b30 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10b40 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
10b50 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
10b60 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
10b70 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
10b80 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
10b90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10ba0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
10bb0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
10bc0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
10bd0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
10be0 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
10bf0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
10c00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10c10 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
10c20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10c30 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
10c40 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
10c50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10c60 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
10c70 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10c80 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
10c90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10ca0 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
10cb0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10cc0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10cd0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10ce0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10cf0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10d00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10d10 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
10d20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10d30 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Stmt;.  if( objc
10d40 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10d50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10d60 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10d70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10d80 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10d90 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10da0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
10db0 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
10dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10dd0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
10de0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10df0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10e00 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10e10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10e20 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10e30 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10e40 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10e50 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72  bj(sqlite3_expir
10e60 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e  ed(pStmt)));.#en
10e70 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
10e80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10e90 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72  age:  sqlite3_tr
10ea0 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20  ansfer_bindings 
10eb0 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a  FROMSTMT TOSTMT.
10ec0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61  **.** Transfer a
10ed0 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d  ll bindings from
10ee0 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74   FROMSTMT over t
10ef0 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74  o TOSTMT.*/.stat
10f00 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e  ic int test_tran
10f10 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69  sfer_bind(.  voi
10f20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10f30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10f40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10f50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10f60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
10f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10f80 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
10f90 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
10fa0 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69  t1, *pStmt2;.  i
10fb0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10fc0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10fd0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10fe0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10ff0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
11000 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
11010 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
11020 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54  ), " FROM-STMT T
11030 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  O-STMT", 0);.   
11040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11050 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
11060 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
11070 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
11080 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
11090 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt1)) return TCL
110a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
110b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
110c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
110d0 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
110e0 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43  tmt2)) return TC
110f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
11100 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11110 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
11120 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11130 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
11140 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29  s(pStmt1,pStmt2)
11150 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
11160 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11170 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11180 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a  ite3_changes DB.
11190 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
111a0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
111b0 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
111c0 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c  atabase by the l
111d0 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75  ast SQL.** execu
111e0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
111f0 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73  int test_changes
11200 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11210 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11220 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11230 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11240 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11250 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
11260 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
11270 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11280 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11290 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
112a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
112b0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
112c0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
112d0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
112e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
112f0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
11300 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
11310 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11320 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
11330 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11340 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11350 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11360 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
11370 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
11380 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11390 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
113a0 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
113b0 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
113c0 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
113d0 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
113e0 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
113f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
11400 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
11410 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
11420 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11430 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
11440 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
11450 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
11460 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
11470 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
11480 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
11490 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
114a0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
114b0 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65  DX-th occurrence
114c0 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
114d0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
114e0 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
114f0 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
11500 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
11510 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
11520 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
11530 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11540 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
11550 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
11560 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
11570 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
11580 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
11590 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
115a0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
115b0 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
115c0 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
115d0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
115e0 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
115f0 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
11600 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
11610 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
11620 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
11630 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
11640 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
11650 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
11660 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
11670 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11680 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11690 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
116a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
116b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
116c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
116d0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
116e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
116f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
11700 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
11710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
11720 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
11730 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
11740 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11750 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11760 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
11770 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
11780 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11790 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
117a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
117b0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
117c0 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
117d0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
117e0 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
117f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11800 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11810 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11820 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
11830 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11840 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11850 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
11860 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
11870 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11880 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
11890 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
118a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
118b0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
118c0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
118d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
118e0 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
118f0 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
11900 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
11910 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
11920 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
11930 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
11940 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
11950 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
11960 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
11970 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11980 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
11990 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
119a0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
119b0 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
119e0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
119f0 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
11a00 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11a10 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
11a20 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
11a30 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11a40 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
11a50 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
11a60 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11a70 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11a80 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
11a90 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
11aa0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
11ab0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
11ac0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
11ad0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
11ae0 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
11af0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11b00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11b10 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
11b20 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
11b30 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
11b40 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
11b50 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
11b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11b70 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
11b80 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
11b90 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
11ba0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
11bb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11bc0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11bd0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
11be0 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
11bf0 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
11c00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
11c10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
11c20 66 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  f, sqlite3ErrStr
11c30 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
11c40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11c50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
11c60 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
11c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
11c80 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  6./*.** Usage: a
11c90 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  dd_test_collate 
11ca0 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
11cb0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
11cc0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
11cd0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
11ce0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
11cf0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
11d00 63 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f  correct collatio
11d10 6e 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61  n.** sequence ca
11d20 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74  llback when mult
11d30 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66  iple versions (f
11d40 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78  or different tex
11d50 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20  t encodings).** 
11d60 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a  are available..*
11d70 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
11d80 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74  s routine regist
11d90 65 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ers the collatio
11da0 6e 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74  n sequence "test
11db0 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74  _collate".** wit
11dc0 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  h database handl
11dd0 65 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f  e <db>. The seco
11de0 6e 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  nd argument must
11df0 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68   be a list of th
11e00 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76  ree.** boolean v
11e10 61 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69  alues. If the fi
11e20 72 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  rst is true, the
11e30 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
11e40 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a  est_collate is.*
11e50 2a 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  * registered for
11e60 20 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73   UTF-8, if the s
11e70 65 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61  econd is true, a
11e80 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
11e90 73 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54  stered for.** UT
11ea0 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74  F-16le, if the t
11eb0 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20  hird is true, a 
11ec0 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e  UTF-16be version
11ed0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
11ee0 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69  * Previous versi
11ef0 6f 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c  ons of test_coll
11f00 61 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e  ate are deleted.
11f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61  .**.** The colla
11f20 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65  tion sequence te
11f30 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d  st_collate is im
11f40 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c  plemented by cal
11f50 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c  ling the.** foll
11f60 6f 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  owing TCL script
11f70 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f  :.**.**   "test_
11f80 63 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c  collate <enc> <l
11f90 68 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a  hs> <rhs>".**.**
11fa0 20 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c   The <lhs> and <
11fb0 72 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f  rhs> are the two
11fc0 20 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f   values being co
11fd0 6d 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20  mpared, encoded 
11fe0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65  in UTF-8..** The
11ff0 20 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72   <enc> parameter
12000 20 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   is the encoding
12010 20 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   of the collatio
12020 6e 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  n function that.
12030 2a 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74  ** SQLite select
12040 65 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20  ed to call. The 
12050 54 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20  TCL test script 
12060 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a  implements the.*
12070 2a 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  * "test_collate"
12080 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   proc..**.** Not
12090 65 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c  e that this will
120a0 20 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20   only work with 
120b0 6f 6e 65 20 69 6e 74 65 70 72 65 74 65 72 20 61  one intepreter a
120c0 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
120d0 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
120e0 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
120f0 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
12100 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
12110 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
12120 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
12130 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
12140 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
12150 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
12160 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
12170 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
12180 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
12190 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
121a0 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
121b0 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
121c0 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
121d0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
121e0 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51    int encin = SQ
121f0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
12200 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73  pCtx);.  int res
12210 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
12220 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
12230 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
12240 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
12250 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
12260 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
12270 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
12280 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
12290 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
122a0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
122b0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
122c0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
122d0 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
122e0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
122f0 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
12300 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
12310 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
12320 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12330 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
12340 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12350 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
12360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12370 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
12380 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
12390 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
123a0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
123b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
123c0 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
123d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
123e0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
123f0 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ert(0);.  }..  s
12400 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
12410 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61  nMalloc();.  pVa
12420 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12430 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56  New(0);.  if( pV
12440 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
12450 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12460 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
12470 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12480 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12490 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
124a0 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
124b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
124c0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
124d0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
124e0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
124f0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
12500 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
12510 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
12520 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e  l, nB, zB, encin
12530 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
12540 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
12550 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
12560 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
12570 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12580 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
12590 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
125a0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
125b0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
125c0 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
125d0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
125e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
125f0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12600 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ;..  Tcl_EvalObj
12610 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20  Ex(i, pX, 0);.  
12620 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
12630 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49  (pX);.  Tcl_GetI
12640 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c  ntFromObj(i, Tcl
12650 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29  _GetObjResult(i)
12660 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72  , &res);.  retur
12670 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
12680 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
12690 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
126a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
126b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
126c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
126d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
126e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
126f0 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  b;.  int val;.  
12700 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
12710 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
12720 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
12730 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12740 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12750 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
12760 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
12770 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12780 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12790 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
127a0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28  CL_ERROR;..  if(
127b0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
127c0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
127d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
127e0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
127f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
12800 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12810 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74  collation(db, "t
12820 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12830 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
12840 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
12850 4c 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74  LITE_UTF8, val?t
12860 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12870 3a 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  :0);.  if( rc==S
12880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12890 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
128a0 31 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f  16;.    if( TCL_
128b0 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
128c0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
128d0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
128e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
128f0 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ROR;.    rc = sq
12900 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12910 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
12920 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
12930 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
12940 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29          (void *)
12950 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
12960 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
12970 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66  _func:0);.    if
12980 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
12990 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
129a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
129b0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
129c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20  TCL_ERROR;..#if 
129d0 30 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  0.    if( sqlite
129e0 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20  3_iMallocFail>0 
129f0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12a00 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a  _iMallocFail++;.
12a10 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12a20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12a30 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
12a40 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
12a50 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
12a60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
12a70 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
12a80 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
12a90 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
12aa0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12ab0 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69     zUtf16 = sqli
12ac0 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61  te3ValueText(pVa
12ad0 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  l, SQLITE_UTF16N
12ae0 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20  ATIVE);.    if( 
12af0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12b00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12b10 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
12b20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
12b30 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12b40 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62  e_collation16(db
12b50 2c 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45  , zUtf16, SQLITE
12b60 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20  _UTF16BE, .     
12b70 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12b80 49 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c  ITE_UTF16BE, val
12b90 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
12ba0 6e 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nc:0);.    }.   
12bb0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12bc0 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  e(pVal);.    sql
12bd0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
12be0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
12bf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
12c00 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
12c10 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
12c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12c30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
12c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
12c50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12c60 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
12c70 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
12c80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12c90 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12ca0 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
12cb0 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  s:.  Tcl_AppendR
12cc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
12cd0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
12ce0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
12cf0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12d00 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12d10 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38  0), " <DB> <utf8
12d20 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
12d30 31 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65  16be>", 0);.  re
12d40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12d50 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  }../*.** When th
12d60 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64  e collation need
12d70 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69  ed callback is i
12d80 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74  nvoked, record t
12d90 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74  he name of .** t
12da0 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
12db0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
12dc0 68 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72  here.  The recor
12dd0 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b  ded name is link
12de0 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76  ed.** to a TCL v
12df0 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64  ariable and used
12e00 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
12e10 61 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64  at the requested
12e20 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61   collation.** na
12e30 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  me is correct..*
12e40 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e  /.static char zN
12e50 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32  eededCollation[2
12e60 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72  00];.static char
12e70 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   *pzNeededCollat
12e80 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c  ion = zNeededCol
12e90 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  lation;.../*.** 
12ea0 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f  Called when a co
12eb0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12ec0 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67   is needed.  Reg
12ed0 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a  istered using.**
12ee0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
12ef0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a  on_needed16()..*
12f00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
12f10 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
12f20 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43  d_cb(.  void *pC
12f30 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  tx, .  sqlite3 *
12f40 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52  db,.  int eTextR
12f50 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ep,.  const void
12f60 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74   *pName.){.  int
12f70 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a   enc = ENC(db);.
12f80 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
12f90 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63  *z;.  for(z = (c
12fa0 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b  har*)pName, i=0;
12fb0 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b   *z || z[1]; z++
12fc0 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20  ){.    if( *z ) 
12fd0 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12fe0 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a  [i++] = *z;.  }.
12ff0 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69    zNeededCollati
13000 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  on[i] = 0;.  sql
13010 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13020 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c  ation(.      db,
13030 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
13040 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45   ENC(db), SQLITE
13050 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29  _INT_TO_PTR(enc)
13060 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  , test_collate_f
13070 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  unc);.}../*.** U
13080 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
13090 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42  ollate_needed DB
130a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
130b0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
130c0 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
130d0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
130e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
130f0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13100 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13110 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
13120 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
13130 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
13140 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
13150 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
13160 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
13170 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
13180 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
13190 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
131a0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
131b0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
131c0 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
131d0 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
131e0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
131f0 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
13200 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
13210 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
13220 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13230 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
13240 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
13250 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
13260 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
13270 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
13280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13290 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
132a0 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
132b0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
132c0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
132d0 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
132e0 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
132f0 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
13300 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
13310 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
13320 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
13330 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
13340 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
13350 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
13360 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
13370 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
13380 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
13390 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
133a0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
133b0 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
133c0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
133d0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
133e0 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
133f0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
13400 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
13410 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
13420 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
13430 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
13440 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
13450 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
13460 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
13470 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
13480 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
13490 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
134a0 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
134b0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
134c0 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
134d0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
134e0 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
134f0 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
13500 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
13510 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
13520 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
13530 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
13540 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
13550 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
13560 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
13570 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
13580 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
13590 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
135a0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
135b0 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
135c0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
135d0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
135e0 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
135f0 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
13600 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
13610 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
13620 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13630 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
13640 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
13650 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
13660 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13670 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
13680 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
13690 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
136a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
136b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
136c0 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
136d0 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
136e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
136f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13700 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13710 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
13720 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13730 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13740 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
13750 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
13760 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
13770 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
13780 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
13790 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
137a0 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
137b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
137c0 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
137d0 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
137e0 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
137f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13800 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
13810 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13820 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
13830 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
13840 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
13850 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
13860 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
13870 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
13880 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
13890 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
138a0 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
138b0 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
138c0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
138d0 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
138e0 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
138f0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
13900 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
13910 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
13920 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
13930 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
13940 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
13950 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
13960 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
13970 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
13980 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
13990 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
139a0 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
139b0 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
139c0 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
139d0 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
139e0 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
139f0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
13a00 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
13a10 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
13a20 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
13a30 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
13a40 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
13a50 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
13a60 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
13a70 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
13a80 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
13a90 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
13aa0 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
13ab0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
13ac0 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
13ad0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
13ae0 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
13af0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
13b00 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
13b10 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
13b20 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
13b30 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
13b40 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
13b50 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
13b60 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
13b70 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
13b80 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
13b90 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
13ba0 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
13bb0 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
13bc0 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
13bd0 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
13be0 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
13bf0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
13c00 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
13c10 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
13c20 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
13c30 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
13c40 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
13c50 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
13c60 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13c70 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
13c80 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
13c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ca0 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
13cb0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
13cc0 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
13cd0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
13ce0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
13cf0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13d00 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
13d10 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
13d20 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
13d30 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
13d40 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
13d50 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
13d60 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13d70 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
13d80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
13d90 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
13da0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
13db0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
13dc0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13dd0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13de0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13df0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
13e00 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
13e10 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13e20 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
13e30 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13e40 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
13e50 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
13e60 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
13e70 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
13e80 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
13e90 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
13ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
13eb0 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
13ec0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13ed0 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
13ee0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
13ef0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
13f00 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
13f10 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
13f20 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
13f30 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
13f40 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
13f50 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
13f60 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
13f70 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13f80 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
13f90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13fa0 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
13fb0 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
13fc0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
13fd0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
13fe0 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
13ff0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
14000 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
14010 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
14020 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
14030 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14040 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
14050 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
14060 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
14070 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14080 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
14090 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
140a0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
140b0 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
140c0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
140d0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
140e0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
140f0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14100 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
14110 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
14120 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
14130 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
14140 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
14150 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14160 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
14170 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14180 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14190 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
141a0 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
141b0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
141c0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
141d0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
141e0 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
141f0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
14200 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
14210 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
14220 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
14230 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
14240 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
14250 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
14260 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
14270 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
14280 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
14290 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
142a0 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
142b0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
142c0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
142d0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
142e0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
142f0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
14300 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
14310 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
14320 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14330 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14340 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14350 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14360 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14370 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14380 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14390 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
143a0 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
143b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
143c0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
143d0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
143e0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
143f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14400 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14410 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14420 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
14430 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
14440 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14450 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
14460 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14470 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
14480 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
14490 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
144a0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
144b0 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
144c0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
144d0 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
144e0 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
144f0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14500 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
14510 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
14520 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14530 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14540 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14550 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14560 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
14570 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14580 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
14590 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
145a0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
145b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
145c0 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
145d0 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
145e0 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
145f0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
14600 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
14610 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
14620 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
14630 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
14640 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
14650 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14660 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
14670 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
14680 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14690 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
146a0 69 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63  ic int test_func
146b0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
146c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
146d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
146e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
146f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14700 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
14710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
14720 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
14730 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69  .  int val;..  i
14740 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
14750 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
14760 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14770 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14780 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14790 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
147a0 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
147b0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
147c0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
147d0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
147e0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
147f0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
14800 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
14810 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
14820 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
14830 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
14840 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69  UTF8, .        i
14850 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14860 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29  tion_utf8, 0, 0)
14870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14880 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14890 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
148a0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
148b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
148c0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
148d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
148e0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
148f0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
14900 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
14910 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16LE, .        i
14920 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
14930 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c  tion_utf16le, 0,
14940 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
14950 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
14960 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
14970 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
14980 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
14990 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
149a0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
149b0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
149c0 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
149d0 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
149e0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
149f0 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
14a00 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c  unction_utf16be,
14a10 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72   0, 0);.  }..  r
14a20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61  eturn TCL_OK;.ba
14a30 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
14a40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
14a50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
14a60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
14a70 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
14a80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
14a90 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
14aa0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
14ab0 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
14ac0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
14ad0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
14ae0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14af0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
14b00 67 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ge:         sqli
14b10 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20  te3_test_errstr 
14b20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a  <err code>.**.**
14b30 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65   Test that the e
14b40 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
14b50 73 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e  string equivalen
14b60 74 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72  ts for sqlite er
14b70 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65  ror codes.** are
14b80 20 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d   sane. The param
14b90 65 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67  eter is an integ
14ba0 65 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  er representing 
14bb0 61 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  an sqlite error 
14bc0 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73  code..** The res
14bd0 75 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ult is a list of
14be0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74   two elements, t
14bf0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
14c00 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  entation of the.
14c10 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  ** error code an
14c20 64 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  d the english la
14c30 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
14c40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
14c50 74 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20  t test_errstr(. 
14c60 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
14c70 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
14c80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
14c90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
14ca0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
14cb0 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a  .  char *zCode;.
14cc0 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f    int i;.  if( o
14cd0 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
14ce0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
14cf0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
14d00 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b  "<error code>");
14d10 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20  .  }..  zCode = 
14d20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14d30 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[1]);.  for(i=
14d40 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a  0; i<200; i++){.
14d50 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
14d60 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29  p(t1ErrorName(i)
14d70 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b  , zCode) ) break
14d80 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
14d90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
14da0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
14db0 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65  Str(i), 0);.  re
14dc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
14dd0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20  /*.** Usage:    
14de0 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
14df0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78   This routine ex
14e00 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72  ists for one pur
14e10 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64  pose - to provid
14e20 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74  e a place to put
14e30 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74   a.** breakpoint
14e40 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63   with GDB that c
14e50 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20  an be triggered 
14e60 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20  using TCL code. 
14e70 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20   The use.** for 
14e80 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70  this is when a p
14e90 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66  articular test f
14ea0 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68  ails on (say) th
14eb0 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69  e 1485th iterati
14ec0 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43  on..** In the TC
14ed0 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77  L test script, w
14ee0 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c  e can add code l
14ef0 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
14f00 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35      if {$i==1485
14f10 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a  } breakpoint.**.
14f20 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74  ** Then run test
14f30 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64  fixture in the d
14f40 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74  ebugger and wait
14f50 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f   for the breakpo
14f60 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20  int to.** fire. 
14f70 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c   Then additional
14f80 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e   breakpoints can
14f90 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65   be set to trace
14fa0 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a   down the bug..*
14fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
14fc0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20  t_breakpoint(.  
14fd0 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
14fe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14ff0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
15000 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
15010 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
15020 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
15030 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
15040 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
15050 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
15060 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
15070 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
15080 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
15090 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
150a0 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  TCL_OK;         
150b0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
150c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
150d0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
150e0 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49  zeroblob  STMT I
150f0 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  DX N.**.** Test 
15100 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15110 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66  _zeroblob interf
15120 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
15130 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15140 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
15150 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15160 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15170 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15180 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15190 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
151a0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
151b0 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
151c0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
151d0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
151e0 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
151f0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
15200 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15210 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15220 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15230 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
15240 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
15250 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
15260 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15270 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
15280 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
15290 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
152a0 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
152b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
152c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
152d0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
152e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
152f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15300 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
15310 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15320 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15330 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15340 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
15350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15360 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15370 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15380 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
15390 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
153a0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
153b0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
153c0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
153d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
153e0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
153f0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
15400 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
15410 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15430 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
15440 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
15450 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
15460 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15470 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15480 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
15490 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
154a0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69  lite3_bind_int i
154b0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
154c0 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
154d0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
154e0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
154f0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
15500 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15510 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
15520 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d  d.** binds a 32-
15530 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55  bit integer VALU
15540 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61  E to that wildca
15550 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
15560 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28  t test_bind_int(
15570 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15580 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15590 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
155a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
155b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
155c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
155d0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
155e0 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65  idx;.  int value
155f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15600 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
15610 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
15620 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
15630 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
15640 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
15650 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
15660 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
15670 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55  ), " STMT N VALU
15680 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
15690 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
156a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
156b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
156c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
156d0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
156e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
156f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15700 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15710 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
15720 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15730 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15740 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15750 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
15760 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
15770 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
15780 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
15790 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  _int(pStmt, idx,
157a0 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
157b0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
157c0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
157d0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
157e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
157f0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
15800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15810 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15820 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15830 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
15840 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
15850 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
15860 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
15870 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15880 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
15890 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
158a0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
158b0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
158c0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
158d0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
158e0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
158f0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15900 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
15910 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
15920 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
15930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15940 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
15950 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15960 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15970 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15980 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15990 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
159a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
159b0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
159c0 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  dx;.  Tcl_WideIn
159d0 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
159e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
159f0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
15a00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15a10 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15a20 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15a30 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
15a40 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
15a50 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
15a60 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
15a70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
15a80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15a90 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15aa0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15ab0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15ac0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15ad0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15ae0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15af0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15b00 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15b20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
15b30 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15b40 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
15b50 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
15b60 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
15b70 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15b80 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
15b90 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
15ba0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15bb0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15bc0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15bd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15c00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15c10 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
15c20 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
15c30 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15c40 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
15c50 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
15c60 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
15c70 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
15c80 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
15c90 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15ca0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
15cb0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15cc0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15cd0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15ce0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15cf0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
15d00 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
15d10 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
15d20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15d30 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a  st_bind_double(.
15d40 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15d50 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15d60 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
15d70 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
15d80 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
15d90 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
15da0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
15db0 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c  dx;.  double val
15dc0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
15dd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
15de0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
15df0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
15e00 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
15e10 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
15e20 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
15e30 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
15e40 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
15e50 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
15e60 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
15e70 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
15e80 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
15e90 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
15ea0 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
15eb0 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
15ec0 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
15ed0 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
15ee0 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
15ef0 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
15f00 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
15f10 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
15f20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
15f30 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
15f40 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
15f50 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
15f60 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15f70 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
15f80 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
15f90 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
15fa0 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
15fb0 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
15fc0 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
15fd0 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
15fe0 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
15ff0 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
16000 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
16010 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
16020 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
16030 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
16040 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
16050 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
16060 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
16070 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
16080 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
16090 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
160a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
160b0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
160c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
160d0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
160e0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
160f0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16100 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
16110 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16120 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16130 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
16140 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16150 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16160 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16180 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16190 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
161a0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
161b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
161c0 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
161d0 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
161e0 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
161f0 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
16200 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
16210 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
16220 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
16230 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
16240 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
16250 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
16260 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
16270 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
16280 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
16290 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
162a0 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
162b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
162c0 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
162d0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
162e0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
162f0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
16300 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
16310 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
16320 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
16330 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
16340 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
16350 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
16360 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
16370 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
16380 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
16390 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
163a0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
163b0 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
163c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
163d0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
163e0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
163f0 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
16400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16410 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
16420 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
16430 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
16440 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
16450 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
16460 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16470 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
16480 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16490 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
164a0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
164b0 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
164c0 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
164d0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
164e0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
164f0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16500 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16510 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
16520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16540 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16550 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16560 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16570 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
16580 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
16590 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
165a0 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
165b0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
165c0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
165d0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
165e0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
165f0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16600 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16610 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16620 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
16630 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
16640 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16650 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
16660 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16670 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16680 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16690 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
166a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
166b0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
166c0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
166d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
166e0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
166f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16700 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16710 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16720 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16730 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16740 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16750 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
16760 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16770 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16780 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16790 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
167a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
167b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
167c0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
167d0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
167e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
167f0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16800 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
16810 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
16820 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
16830 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16840 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16850 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16860 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16870 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16880 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16890 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
168a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
168b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
168c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
168d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
168e0 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
168f0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
16900 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
16910 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
16920 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16930 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16940 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16950 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16960 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16970 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16980 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16990 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
169a0 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
169b0 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
169c0 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
169d0 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
169e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
169f0 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76  t_bind_text(.  v
16a00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16a10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16a20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16a30 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16a40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16a50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16a60 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16a70 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
16a80 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
16a90 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
16aa0 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
16ab0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16ac0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16ad0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16ae0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16af0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16b00 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16b10 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
16b20 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
16b30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16b40 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16b50 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
16b60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16b70 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
16b80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16b90 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
16ba0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
16bb0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16bc0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16bd0 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
16be0 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
16bf0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
16c00 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73  (objv[3], &bytes
16c10 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
16c20 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16c30 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
16c40 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
16c50 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16c60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16c70 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
16c80 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
16c90 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16ca0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16cb0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16cc0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
16cd0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16ce0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16cf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16d00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16d10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
16d20 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
16d30 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16d40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16d50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
16d70 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
16d80 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f  text16 ?-static?
16d90 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
16da0 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
16db0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
16dc0 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63  _text16 interfac
16dd0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16de0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16df0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16e00 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16e10 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16e20 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16e30 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16e40 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72  nds a UTF-16 str
16e50 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
16e60 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
16e70 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
16e80 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
16e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
16ea0 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a  st_bind_text16(.
16eb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16ec0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16ed0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16ee0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16ef0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
16f00 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
16f10 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
16f20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16f30 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16f40 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
16f50 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
16f60 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44  rc;..  void (*xD
16f70 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62  el)(void*) = (ob
16f80 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41  jc==6?SQLITE_STA
16f90 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53  TIC:SQLITE_TRANS
16fa0 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  IENT);.  Tcl_Obj
16fb0 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a   *oStmt    = obj
16fc0 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c  v[objc-4];.  Tcl
16fd0 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d  _Obj *oN       =
16fe0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20   objv[objc-3];. 
16ff0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e   Tcl_Obj *oStrin
17000 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  g  = objv[objc-2
17010 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42  ];.  Tcl_Obj *oB
17020 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  ytes   = objv[ob
17030 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  jc-1];..  if( ob
17040 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
17050 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
17060 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17070 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
17080 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17090 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
170a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
170b0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
170c0 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
170d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
170e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
170f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17100 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17110 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c  etString(oStmt),
17120 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
17130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
17140 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
17150 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c  mObj(interp, oN,
17160 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
17170 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
17180 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
17190 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
171a0 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b  Obj(oString, 0);
171b0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
171c0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
171d0 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29   oBytes, &bytes)
171e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
171f0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
17200 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
17210 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
17220 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
17230 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20  s, xDel);.  if( 
17240 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17250 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17260 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17270 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17280 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
172a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
172b0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
172c0 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
172d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
172e0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
172f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
17300 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
17310 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17320 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17330 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f  ite3_bind_blob ?
17340 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20  -static? STMT N 
17350 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  DATA BYTES.**.**
17360 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
17370 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65  3_bind_blob inte
17380 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17390 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
173a0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
173b0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
173c0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
173d0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
173e0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
173f0 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74  * binds a BLOB t
17400 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
17410 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54   The BLOB is BYT
17420 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ES bytes in size
17430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17440 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a  test_bind_blob(.
17450 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17460 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17470 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17480 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17490 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
174a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
174b0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
174c0 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
174d0 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
174e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
174f0 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74  te3_destructor_t
17500 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20  ype xDestructor 
17510 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  = SQLITE_TRANSIE
17520 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  NT;..  if( objc!
17530 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b  =5 && objc!=6 ){
17540 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17550 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17560 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17570 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17580 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17590 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
175a0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
175b0 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
175c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
175d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
175e0 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
175f0 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
17600 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20  LITE_STATIC;.   
17610 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   objv++;.  }..  
17620 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17630 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17640 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17650 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17660 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17670 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17680 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17690 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
176a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
176b0 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
176c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
176d0 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
176e0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
176f0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
17700 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17710 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17720 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17730 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
17740 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17750 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
17760 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17770 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17780 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17790 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
177a0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
177b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
177c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
177d0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
177e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
177f0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
17800 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17810 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
17820 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17830 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
17840 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
17850 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
17860 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17870 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17880 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
17890 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
178a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
178b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
178c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
178d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
178e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
178f0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
17900 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17910 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17920 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17930 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17940 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17950 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17960 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17970 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17980 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17990 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
179a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
179b0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
179c0 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
179d0 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
179e0 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
179f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17a00 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17a10 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17a20 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
17a30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17a40 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
17a50 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17a60 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
17a70 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
17a80 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
17a90 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
17aa0 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
17ab0 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
17ac0 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
17ad0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17ae0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
17af0 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
17b00 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17b10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17b20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17b30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17b40 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
17b50 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17b60 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
17b70 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
17b80 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17b90 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17ba0 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
17bb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17bc0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
17bd0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17be0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17bf0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
17c00 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17c10 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
17c20 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17c30 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
17c40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17c50 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17c60 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17c70 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
17c80 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
17c90 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
17ca0 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
17cb0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
17cc0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17cd0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
17ce0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
17cf0 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
17d00 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
17d10 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
17d20 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
17d30 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
17d40 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
17d50 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
17d60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17d70 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
17d80 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
17d90 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17da0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17db0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17dc0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17dd0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17de0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17df0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
17e00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
17e10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17e20 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
17e30 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
17e40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17e50 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
17e60 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
17e70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
17e80 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
17e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17ea0 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
17eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
17ec0 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
17ed0 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
17ee0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17ef0 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
17f00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
17f10 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
17f20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17f30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17f40 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
17f50 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
17f60 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
17f70 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
17f80 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ings(.  void * c
17f90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17fa0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17fb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17fc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17fd0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17fe0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
17ff0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18000 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18010 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
18020 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
18030 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18040 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18050 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
18060 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18070 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18080 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
180a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
180b0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
180c0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
180d0 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
180e0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
180f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18100 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18110 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e  sleep MILLISECON
18120 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DS.*/.static int
18130 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
18140 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18150 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18160 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18170 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18180 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18190 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
181a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
181b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
181c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
181d0 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
181e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
181f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18200 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18210 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18220 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
18230 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18240 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
18250 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18260 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18270 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
18280 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18290 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
182a0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
182b0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
182c0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
182d0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
182e0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
182f0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18300 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18310 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18320 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18330 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18340 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  _ex_errcode(.  v
18350 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18360 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18370 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18380 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18390 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
183a0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
183b0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
183c0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
183d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
183e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
183f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18400 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18410 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18420 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18430 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18440 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18450 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18460 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18470 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18480 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18490 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
184a0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
184b0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
184c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
184d0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
184e0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
184f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18500 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
18510 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
18520 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
18530 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
18540 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
18550 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
18560 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
18570 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
18580 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
18590 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
185a0 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
185b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
185c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
185d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
185e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
185f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18600 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18610 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18620 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18630 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18640 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18650 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18660 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18670 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18680 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18690 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
186a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
186b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
186c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
186d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
186e0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
186f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
18700 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18710 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18720 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18730 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18740 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18750 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18760 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18770 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
18780 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18790 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
187a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
187b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
187c0 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
187d0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
187e0 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
187f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18800 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
18810 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18820 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18830 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18840 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18850 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18860 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18870 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
18880 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18890 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
188a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
188b0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
188c0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
188d0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
188e0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
188f0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
18900 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18910 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
18920 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18930 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18940 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18960 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
18970 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
18980 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18990 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
189a0 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
189b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
189c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
189d0 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
189e0 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
189f0 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
18a00 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18a10 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
18a20 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
18a30 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
18a40 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18a50 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
18a60 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
18a70 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
18a80 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
18a90 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
18aa0 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
18ab0 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
18ac0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
18ad0 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
18ae0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
18af0 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
18b00 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18b10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18b20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18b30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18b40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
18b50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
18b60 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
18b70 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
18b80 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20   *zErr;.  const 
18b90 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62  char *z;.  int b
18ba0 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
18bb0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18bc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18bd0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18be0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18bf0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18c00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18c10 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18c20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18c30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18c40 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18c50 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18c60 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18c70 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
18c80 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
18c90 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
18ca0 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
18cb0 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45  rr ){.    z = zE
18cc0 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65  rr;.    for(byte
18cd0 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c  s=0; z[bytes] ||
18ce0 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74   z[bytes+1]; byt
18cf0 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54  es+=2){}.  }.  T
18d00 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18d10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
18d20 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
18d30 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
18d40 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18d50 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
18d60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18d70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
18d80 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
18d90 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
18da0 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
18db0 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
18dc0 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
18dd0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
18de0 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
18df0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
18e00 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
18e10 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
18e20 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
18e30 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
18e40 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
18e50 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
18e60 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
18e70 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
18e80 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
18e90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
18ea0 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
18eb0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18ec0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18ed0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18ee0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18ef0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18f00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18f10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
18f20 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
18f30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18f40 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
18f50 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
18f60 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
18f70 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
18f80 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
18f90 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
18fa0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18fb0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18fc0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18fd0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18fe0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18ff0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19000 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
19010 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19030 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19040 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19050 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19060 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19070 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
19080 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
19090 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
190a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
190b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
190c0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
190d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
190e0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
190f0 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
19100 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
19110 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
19120 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
19130 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
19140 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
19150 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19160 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19180 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
19190 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
191a0 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
191b0 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
191c0 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61  ytes - (int)(zTa
191d0 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
191e0 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72      if( (int)str
191f0 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
19200 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
19210 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
19220 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
19230 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
19240 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
19250 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
19260 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
19270 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
19280 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19290 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
192a0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70  tmt==0 );.    sp
192b0 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64  rintf(zBuf, "(%d
192c0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
192d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
192e0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
192f0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
19300 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19310 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
19320 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
19330 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
19340 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
19350 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
19360 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
19370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
19380 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19390 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
193a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
193b0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
193c0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
193d0 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
193e0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
193f0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
19400 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
19410 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
19420 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
19430 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
19440 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
19450 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
19460 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19470 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19480 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19490 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
194a0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
194b0 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
194c0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
194d0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
194e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
194f0 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
19500 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
19510 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
19520 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19530 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19540 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19550 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
19560 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19570 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  Sql;.  int bytes
19580 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19590 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
195a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
195b0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
195c0 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
195d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
195e0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
195f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
19600 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
19610 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
19620 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
19630 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19640 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
19650 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
19660 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19670 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19680 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19690 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
196a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
196b0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
196c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
196d0 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
196e0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
196f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19700 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
19710 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
19720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19730 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19740 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
19750 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
19760 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
19770 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61  &zTail : 0);.  a
19780 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45  ssert(rc==SQLITE
19790 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29  _OK || pStmt==0)
197a0 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
197b0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
197c0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
197d0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
197e0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
197f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
19800 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
19810 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
19820 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
19830 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
19840 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
19850 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
19860 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
19870 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
19880 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
19890 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
198a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
198b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
198c0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
198d0 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  0 );.    sprintf
198e0 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20  (zBuf, "(%d) ", 
198f0 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
19900 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19910 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f  , zBuf, sqlite3_
19920 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
19930 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19940 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
19950 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
19960 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
19970 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
19980 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
19990 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
199a0 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ROR;.    Tcl_App
199b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
199c0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  , zBuf, 0);.  }.
199d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
199e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
199f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19a00 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a  _tkt3134 DB.**.*
19a10 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72 65  * Generate a pre
19a20 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
19a30 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20  for a zero-byte 
19a40 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73 74  string as a test
19a50 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23  .** for ticket #
19a60 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e  3134.  The strin
19a70 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63  g should be prec
19a80 65 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  eeded by a zero 
19a90 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
19aa0 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19ab0 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
19ac0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19ad0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19ae0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19af0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19b00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19b10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
19b20 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
19b30 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
19b40 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
19b50 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19b60 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19b70 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19b80 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19b90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19ba0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19bb0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19bc0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19bd0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19be0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
19bf0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
19c00 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
19c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19c20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
19c30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19c40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19c50 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
19c60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19c70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
19c80 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
19c90 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
19ca0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
19cb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
19cc0 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
19cd0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
19ce0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
19cf0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
19d00 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
19d10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19d20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
19d30 3d 30 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74  =0 );.    sprint
19d40 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  f(zBuf, "(%d) ",
19d50 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
19d60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19d70 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
19d80 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
19d90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19da0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19db0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
19dc0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
19dd0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
19de0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
19df0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19e00 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
19e10 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19e20 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
19e30 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19e50 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
19e60 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73  e16 DB sql bytes
19e70 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
19e80 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
19e90 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
19ea0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
19eb0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
19ec0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
19ed0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
19ee0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
19ef0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
19f00 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
19f10 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
19f20 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
19f30 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
19f40 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
19f50 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
19f60 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
19f70 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
19f80 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
19f90 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19fa0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19fb0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19fc0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19fd0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19fe0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
19ff0 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1a000 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1a010 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1a020 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1a030 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1a040 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1a050 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1a060 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a070 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1a080 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1a090 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a0a0 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1a0b0 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1a0c0 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1a0d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a0e0 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1a0f0 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1a100 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a110 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a120 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a130 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a140 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a150 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a160 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a170 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a180 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1a190 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a1a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a1b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1a1c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1a1d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1a1e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1a1f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1a200 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1a210 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1a220 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1a230 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1a240 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1a250 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1a260 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a270 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1a280 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
1a290 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1a2a0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a2b0 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a2c0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a2d0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a2e0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1a2f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a300 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1a310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a320 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1a330 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1a340 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1a350 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1a360 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1a370 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1a380 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1a390 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1a3a0 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1a3b0 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1a3c0 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1a3d0 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1a3e0 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1a3f0 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1a400 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1a410 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1a420 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1a430 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1a440 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1a450 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1a460 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1a470 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1a480 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1a490 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a4a0 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1a4b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a4c0 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1a4d0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1a4e0 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1a4f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a500 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a510 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42  _prepare16_v2 DB
1a520 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1a530 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
1a540 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1a550 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1a560 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1a570 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1a580 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1a590 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1a5a0 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1a5b0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1a5c0 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1a5d0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1a5e0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1a5f0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1a600 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1a610 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1a620 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1a630 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
1a640 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  16_v2(.  void * 
1a650 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1a660 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1a670 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1a680 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1a690 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1a6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1a6b0 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1a6c0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1a6d0 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  zSql;.  const vo
1a6e0 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  id *zTail = 0;. 
1a6f0 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20   Tcl_Obj *pTail 
1a700 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1a710 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1a720 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1a730 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
1a740 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20  t bytes;        
1a750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1a760 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64  nteger specified
1a770 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69   as arg 3 */.  i
1a780 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20  nt objlen;      
1a790 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1a7a0 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74  byte-array lengt
1a7b0 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20  h of arg 2 */.. 
1a7c0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
1a7d0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
1a7e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a7f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1a800 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1a810 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1a820 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a830 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1a840 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c  ytes ?tailvar?",
1a850 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a860 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a870 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a880 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a890 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a8a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a8b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1a8c0 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  l = Tcl_GetByteA
1a8d0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1a8e0 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20  [2], &objlen);. 
1a8f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1a900 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1a910 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20  bjv[3], &bytes) 
1a920 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a930 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1a940 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1a950 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1a960 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1a970 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1a980 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a990 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a9a0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1a9b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a9c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1a9d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a9e0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
1a9f0 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
1aa00 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
1aa10 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
1aa20 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c  int)((u8 *)zTail
1aa30 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20  -(u8 *)zSql);.  
1aa40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
1aa50 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  bjlen = 0;.    }
1aa60 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c  .    pTail = Tcl
1aa70 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1aa80 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
1aa90 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49  jlen);.    Tcl_I
1aaa0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
1aab0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53  l);.    Tcl_ObjS
1aac0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1aad0 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
1aae0 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
1aaf0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1ab00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  );.  }..  if( pS
1ab10 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1ab20 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1ab30 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1ab40 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1ab50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ab60 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
1ab70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ab80 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1ab90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1aba0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1abb0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1abc0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1abd0 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65  e3_open filename
1abe0 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a   ?options-list?.
1abf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ac00 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20  st_open(.  void 
1ac10 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ac20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ac30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ac40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ac50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1ac60 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1ac70 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1ac80 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1ac90 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1aca0 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26  !=3 && objc!=2 &
1acb0 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  & objc!=1 ){.   
1acc0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1acd0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ace0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1acf0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ad00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ad10 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
1ad20 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
1ad30 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ad40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ad50 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f  .  zFilename = o
1ad60 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53  bjc>1 ? Tcl_GetS
1ad70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a  tring(objv[1]) :
1ad80 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70   0;.  sqlite3_op
1ad90 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  en(zFilename, &d
1ada0 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1adb0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1adc0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1add0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1ade0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1adf0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ae00 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1ae10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ae20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ae30 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  e: sqlite3_open_
1ae40 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  v2 FILENAME FLAG
1ae50 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20  S VFS.*/.static 
1ae60 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32  int test_open_v2
1ae70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ae80 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ae90 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1aea0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1aeb0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1aec0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1aed0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63   *zFilename;.  c
1aee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
1aef0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30  .  int flags = 0
1af00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1af10 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1af20 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1af30 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c  int nFlag;.  Tcl
1af40 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20  _Obj **apFlag;. 
1af50 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1af60 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1af70 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1af80 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1af90 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20  "FILENAME FLAGS 
1afa0 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  VFS");.    retur
1afb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1afc0 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
1afd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1afe0 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20  v[1]);.  zVfs = 
1aff0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b000 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56  jv[3]);.  if( zV
1b010 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56  fs[0]==0x00 ) zV
1b020 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  fs = 0;..  rc = 
1b030 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
1b040 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
1b050 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20  bjv[2], &nFlag, 
1b060 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20  &apFlag);.  if( 
1b070 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
1b080 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  urn rc;.  for(i=
1b090 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29  0; i<nFlag; i++)
1b0a0 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b  {.    int iFlag;
1b0b0 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e  .    struct Open
1b0c0 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e  Flag {.      con
1b0d0 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a  st char *zFlag;.
1b0e0 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a        int flag;.
1b0f0 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20      } aFlag[] = 
1b100 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  {.      { "SQLIT
1b110 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22  E_OPEN_READONLY"
1b120 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1b130 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
1b140 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1b150 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54  EADWRITE", SQLIT
1b160 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1b170 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b180 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22  ITE_OPEN_CREATE"
1b190 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  , SQLITE_OPEN_CR
1b1a0 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  EATE },.      { 
1b1b0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c  "SQLITE_OPEN_DEL
1b1c0 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c  ETEONCLOSE", SQL
1b1d0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1b1e0 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20  NCLOSE },.      
1b1f0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  { "SQLITE_OPEN_E
1b200 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54  XCLUSIVE", SQLIT
1b210 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1b220 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b230 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1b240 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  XY", SQLITE_OPEN
1b250 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20  _AUTOPROXY },.  
1b260 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b270 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c  EN_MAIN_DB", SQL
1b280 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1b290 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b2a0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1b2b0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1b2c0 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  EMP_DB },.      
1b2d0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b2e0 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51  RANSIENT_DB", SQ
1b2f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
1b300 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  ENT_DB },.      
1b310 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  { "SQLITE_OPEN_M
1b320 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  AIN_JOURNAL", SQ
1b330 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1b340 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b350 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b360 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  EMP_JOURNAL", SQ
1b370 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1b380 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b390 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b3a0 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  UBJOURNAL", SQLI
1b3b0 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1b3c0 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b3d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1b3e0 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  R_JOURNAL", SQLI
1b3f0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1b400 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20  OURNAL },.      
1b410 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  { "SQLITE_OPEN_N
1b420 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  OMUTEX", SQLITE_
1b430 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a  OPEN_NOMUTEX },.
1b440 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b450 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c  OPEN_FULLMUTEX",
1b460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
1b470 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  LMUTEX },.      
1b480 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  { "SQLITE_OPEN_S
1b490 48 41 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c  HAREDCACHE", SQL
1b4a0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1b4b0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b4c0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49  "SQLITE_OPEN_PRI
1b4d0 56 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49  VATECACHE", SQLI
1b4e0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
1b4f0 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ACHE },.      { 
1b500 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  "SQLITE_OPEN_WAL
1b510 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  ", SQLITE_OPEN_W
1b520 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  AL },.      { "S
1b530 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c  QLITE_OPEN_URI",
1b540 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
1b550 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30   },.      { 0, 0
1b560 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63   }.    };.    rc
1b570 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46   = Tcl_GetIndexF
1b580 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74  romObjStruct(int
1b590 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20  erp, apFlag[i], 
1b5a0 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46  aFlag, sizeof(aF
1b5b0 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  lag[0]), .      
1b5c0 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46    "flag", 0, &iF
1b5d0 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  lag.    );.    i
1b5e0 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1b5f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66  return rc;.    f
1b600 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46  lags |= aFlag[iF
1b610 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a  lag].flag;.  }..
1b620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1b630 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65  pen_v2(zFilename
1b640 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56  , &db, flags, zV
1b650 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  fs);.  if( sqlit
1b660 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1b670 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1b680 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
1b690 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1b6a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b6b0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1b6c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b6e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20   sqlite3_open16 
1b6f0 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1b700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b710 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f  est_open16(.  vo
1b720 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b730 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b740 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b750 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b760 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1b770 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1b780 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20  T_UTF16.  const 
1b790 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  void *zFilename;
1b7a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1b7b0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1b7c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1b7d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b7e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b7f0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b800 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b810 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b820 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b830 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1b840 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1b850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b860 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1b870 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  ame = Tcl_GetByt
1b880 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1b890 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c  jv[1], 0);.  sql
1b8a0 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c  ite3_open16(zFil
1b8b0 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
1b8c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1b8d0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1b8e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1b8f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b900 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1b910 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b920 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1b930 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b940 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1b950 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b960 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b970 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55  e3_complete16 <U
1b980 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a  TF-16 string>.**
1b990 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20  .** Return 1 if 
1b9a0 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72 67  the supplied arg
1b9b0 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c  ument is a compl
1b9c0 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
1b9d0 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74  t, or zero.** ot
1b9e0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1b9f0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70  ic int test_comp
1ba00 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  lete16(.  void *
1ba10 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ba20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ba30 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ba40 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ba50 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64  objv[].){.#if !d
1ba60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1ba70 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20  IT_COMPLETE) && 
1ba80 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1ba90 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68  OMIT_UTF16).  ch
1baa0 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28  ar *zBuf;..  if(
1bab0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1bac0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1bad0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1bae0 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22  , "<utf-16 sql>"
1baf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bb00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1bb10 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63  zBuf = (char*)Tc
1bb20 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1bb30 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1bb40 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1bb50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1bb60 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1bb70 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a  te3_complete16(z
1bb80 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f  Buf)));.#endif /
1bb90 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  * SQLITE_OMIT_CO
1bba0 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45  MPLETE && SQLITE
1bbb0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1bbc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1bbd0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1bbe0 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d  sqlite3_step STM
1bbf0 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  T.**.** Advance 
1bc00 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  the statement to
1bc10 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a   the next row..*
1bc20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1bc30 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a  t_step(.  void *
1bc40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1bc50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1bc60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1bc70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1bc80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1bc90 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1bca0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1bcb0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bcc0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bcd0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bce0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bcf0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bd00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bd10 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c  jv[0]), " STMT",
1bd20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1bd30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1bd40 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1bd50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1bd60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bd70 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) 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 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bda0 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20  step(pStmt);..  
1bdb0 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  /* if( rc!=SQLIT
1bdc0 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51  E_DONE && rc!=SQ
1bdd0 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72  LITE_ROW ) retur
1bde0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a  n TCL_ERROR; */.
1bdf0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1be00 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1be10 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1be20 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1be30 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  L_OK;.}..static 
1be40 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20 20  int test_sql(.  
1be50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1be60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1be70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1be80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1be90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1bea0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1beb0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1bec0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1bed0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1bee0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1bef0 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
1bf00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bf10 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1bf20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1bf30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bf40 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1bf50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bf60 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
1bf70 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1bf80 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c 28  r *)sqlite3_sql(
1bf90 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41  pStmt), TCL_VOLA
1bfa0 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TILE);.  return 
1bfb0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1bfc0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1bfd0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
1bfe0 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
1bff0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1c000 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
1c010 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
1c020 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
1c030 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c040 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  umn_count(.  voi
1c050 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c060 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c070 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c080 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c090 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c0a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c0b0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1c0c0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c0d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c0e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c0f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c100 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c110 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c120 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c130 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c150 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c160 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c170 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c180 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c190 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c1a0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1c1b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c1c0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1c1d0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
1c1e0 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75  pStmt)));.  retu
1c1f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c200 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c210 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53  e3_column_type S
1c220 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1c230 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65   Return the type
1c240 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20   of the data in 
1c250 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1c260 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1c270 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
1c280 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79  t test_column_ty
1c290 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1c2a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c2b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c2c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c2d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c2e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c2f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1c300 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70  nt col;.  int tp
1c310 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c320 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c330 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c340 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c350 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c360 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c370 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c380 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1c390 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c3a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c3b0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c3c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c3d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c3e0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c3f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c400 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1c410 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1c420 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1c430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c440 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65  ;..  tp = sqlite
1c450 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53  3_column_type(pS
1c460 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69  tmt, col);.  swi
1c470 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63  tch( tp ){.    c
1c480 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47  ase SQLITE_INTEG
1c490 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53  ER: .      Tcl_S
1c4a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c4b0 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f   "INTEGER", TCL_
1c4c0 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20  STATIC); .      
1c4d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c4e0 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20  SQLITE_NULL:.   
1c4f0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1c500 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c  (interp, "NULL",
1c510 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1c520 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c530 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41  case SQLITE_FLOA
1c540 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  T:.      Tcl_Set
1c550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c560 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54  FLOAT", TCL_STAT
1c570 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c580 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c590 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54  TE_TEXT:.      T
1c5a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c5b0 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c  erp, "TEXT", TCL
1c5c0 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1c5d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c5e0 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20   SQLITE_BLOB:.  
1c5f0 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1c600 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22  t(interp, "BLOB"
1c610 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1c620 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c630 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1c640 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a  assert(0);.  }..
1c650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c670 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c680 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d  int64 STMT colum
1c690 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1c6a0 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1c6b0 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1c6c0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1c6d0 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65  st as an.** wide
1c6e0 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65   (64-bit) intege
1c6f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1c700 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
1c710 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
1c720 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c730 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c740 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c750 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c760 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c770 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1c780 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56  nt col;.  i64 iV
1c790 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1c7a0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1c7b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c7c0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c7d0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c7e0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c7f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c800 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1c810 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c820 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1c830 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1c840 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1c850 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c860 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1c870 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c880 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1c890 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1c8a0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1c8b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c8c0 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71  OR;..  iVal = sq
1c8d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
1c8e0 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  64(pStmt, col);.
1c8f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1c900 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1c910 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61  ewWideIntObj(iVa
1c920 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1c930 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c940 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c950 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63  lumn_blob STMT c
1c960 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
1c970 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1c980 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  blob(.  void * c
1c990 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c9a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c9b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c9c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c9d0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1c9e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1c9f0 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74   int col;..  int
1ca00 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   len;.  const vo
1ca10 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66  id *pBlob;..  if
1ca20 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1ca30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1ca40 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1ca50 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1ca60 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1ca70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ca80 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1ca90 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1caa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cab0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1cac0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1cad0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cae0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1caf0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1cb00 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1cb10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1cb20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cb30 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1cb40 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65  TCL_ERROR;..  le
1cb50 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
1cb60 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
1cb70 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  col);.  pBlob = 
1cb80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1cb90 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  lob(pStmt, col);
1cba0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1cbb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1cbc0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1cbd0 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20  pBlob, len));.  
1cbe0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1cbf0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1cc00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1cc10 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  uble STMT column
1cc20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cc30 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1cc40 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1cc50 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73   current row cas
1cc60 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a  t as a double..*
1cc70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1cc80 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
1cc90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1cca0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ccb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ccc0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ccd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1cce0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1ccf0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1cd00 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
1cd10 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
1cd20 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1cd30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cd40 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1cd50 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1cd60 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1cd70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1cd80 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1cd90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1cda0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cdb0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1cdc0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1cdd0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cde0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1cdf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ce00 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1ce10 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1ce20 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1ce30 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ce40 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
1ce50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
1ce60 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
1ce70 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1ce80 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ce90 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
1cea0 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
1ceb0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1cec0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
1ced0 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
1cee0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cef0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1cf00 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
1cf10 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
1cf20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
1cf30 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  int test_data_co
1cf40 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1cf50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1cf60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cf70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1cf80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cf90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1cfa0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1cfb0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1cfc0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cfd0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cfe0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cff0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d000 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d010 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d020 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d030 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d040 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d050 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d060 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d070 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d080 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d090 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1d0a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d0b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1d0c0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
1d0d0 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
1d0e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1d0f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d100 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d110 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1d120 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1d130 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d140 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1d150 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d160 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d170 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1d180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d190 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20  est_stmt_utf8(. 
1d1a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d1b0 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ta,        /* Po
1d1c0 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1d1d0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1d1e0 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54  be invoke */.  T
1d1f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d200 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d210 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d220 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d230 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d240 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f  .  int col;.  co
1d250 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e  nst char *(*xFun
1d260 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  c)(sqlite3_stmt*
1d270 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20  , int);.  const 
1d280 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78  char *zRet;..  x
1d290 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68  Func = (const ch
1d2a0 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f  ar *(*)(sqlite3_
1d2b0 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1d2c0 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1d2d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d2e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d2f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d300 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d310 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d320 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d330 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d340 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d350 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d360 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d370 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d380 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d390 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d3a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d3b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1d3c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d3d0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1d3e0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1d3f0 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20  ERROR;.  zRet = 
1d400 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c  xFunc(pStmt, col
1d410 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b  );.  if( zRet ){
1d420 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
1d430 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1d440 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d   *)zRet, 0);.  }
1d450 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d460 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1d470 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
1d480 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
1d490 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d4a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d4b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d4c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d4d0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1d4e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
1d4f0 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a  CATED.  int rc;.
1d500 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
1d510 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1d520 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1d530 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
1d540 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d550 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1d560 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
1d570 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
1d580 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1d590 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1d5a0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1d5b0 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
1d5c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d5d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d5e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1d5f0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d600 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d610 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
1d620 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1d630 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1d640 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
1d650 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
1d660 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1d670 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64  mt_utf16(.  void
1d680 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20   * clientData,  
1d690 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1d6a0 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63   SQLite API func
1d6b0 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
1d6c0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
1d6d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d6e0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d6f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d700 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1d710 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1d720 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1d730 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1d740 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
1d750 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e    const void *zN
1d760 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76  ame16;.  const v
1d770 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71  oid *(*xFunc)(sq
1d780 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1d790 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  );..  xFunc = (c
1d7a0 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73  onst void *(*)(s
1d7b0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1d7c0 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1d7d0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1d7e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d7f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d800 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d810 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d820 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d830 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d840 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d850 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d860 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d870 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d880 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d890 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d8a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d8b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d8c0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d8d0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d8e0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1d8f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d900 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63   zName16 = xFunc
1d910 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1d920 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20  if( zName16 ){. 
1d930 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f     int n;.    co
1d940 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e  nst char *z = zN
1d950 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e  ame16;.    for(n
1d960 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b  =0; z[n] || z[n+
1d970 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20  1]; n+=2){}.    
1d980 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79  pRet = Tcl_NewBy
1d990 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65  teArrayObj(zName
1d9a0 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63  16, n+2);.    Tc
1d9b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1d9c0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
1d9d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1d9e0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1d9f0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1da00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1da10 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1da20 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d  n_int STMT colum
1da30 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1da40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1da50 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  tes STMT column.
1da60 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1da70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1da80 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  s16 STMT column.
1da90 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1daa0 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a   test_stmt_int(.
1dab0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1dac0 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ata,    /* Point
1dad0 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49  er to SQLite API
1dae0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20   function to be 
1daf0 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c  invoked */.  Tcl
1db00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1db10 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1db20 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1db30 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1db40 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1db50 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1db60 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1db70 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20  _stmt*, int);.. 
1db80 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a   xFunc = (int (*
1db90 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1dba0 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1dbb0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1dbc0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1dbd0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1dbe0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1dbf0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1dc00 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1dc10 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1dc20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1dc30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1dc40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1dc50 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1dc60 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1dc70 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1dc80 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1dc90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dca0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1dcb0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1dcc0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1dcd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1dce0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1dcf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1dd00 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63  _NewIntObj(xFunc
1dd10 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a  (pStmt, col)));.
1dd20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1dd30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1dd40 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67    sqlite_set_mag
1dd50 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55  ic  DB  MAGIC-NU
1dd60 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74  MBER.**.** Set t
1dd70 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c  he db->magic val
1dd80 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ue.  This is use
1dd90 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20  d to test error 
1dda0 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a  recovery logic..
1ddb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
1ddc0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a  lite_set_magic(.
1ddd0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1dde0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ddf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1de00 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1de10 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1de20 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1de30 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1de40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1de50 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1de60 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1de70 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
1de80 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43 22       " DB MAGIC"
1de90 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1dea0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1deb0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1dec0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1ded0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1dee0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1def0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1df00 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1df10 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20  _OPEN")==0 ){.  
1df20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
1df30 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b  LITE_MAGIC_OPEN;
1df40 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1df50 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1df60 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
1df70 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  D")==0 ){.    db
1df80 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1df90 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
1dfa0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1dfb0 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1dfc0 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d  TE_MAGIC_BUSY")=
1dfd0 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
1dfe0 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
1dff0 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  IC_BUSY;.  }else
1e000 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1e010 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1e020 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b  IC_ERROR")==0 ){
1e030 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e040 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52   SQLITE_MAGIC_ER
1e050 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
1e060 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
1e070 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e  rp, argv[2], (in
1e080 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29  t*)&db->magic) )
1e090 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1e0a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
1e0b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e0c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1e0d0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20  lite3_interrupt 
1e0e0 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67   DB .**.** Trigg
1e0f0 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20  er an interrupt 
1e100 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  on DB.*/.static 
1e110 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75  int test_interru
1e120 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pt(.  void * cli
1e130 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1e140 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e150 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1e160 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
1e170 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1e180 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
1e190 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e1a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e1b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e1c0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1e1d0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1e1e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e1f0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1e200 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e210 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1e220 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e230 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  ;.  sqlite3_inte
1e240 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74  rrupt(db);.  ret
1e250 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1e260 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65  tatic u8 *sqlite
1e270 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1e280 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c   = 0;../*.** Fil
1e290 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68  l the stack with
1e2a0 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74   a known bitpatt
1e2b0 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ern..*/.static v
1e2c0 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f  oid prepStack(vo
1e2d0 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  id){.  int i;.  
1e2e0 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33 36  u32 bigBuf[65536
1e2f0 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
1e300 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f 73  sizeof(bigBuf)/s
1e310 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d 29  izeof(bigBuf[0])
1e320 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d  ; i++) bigBuf[i]
1e330 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20   = 0xdeadbeef;. 
1e340 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62   sqlite3_stack_b
1e350 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26  aseline = (u8*)&
1e360 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d  bigBuf[65536];.}
1e370 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20  ../*.** Get the 
1e380 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65  current stack de
1e390 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64  pth.  Used for d
1e3a0 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
1e3b0 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74 61  /.u64 sqlite3Sta
1e3c0 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20  ckDepth(void){. 
1e3d0 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20   u8 x;.  return 
1e3e0 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74  (u64)(sqlite3_st
1e3f0 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26  ack_baseline - &
1e400 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  x);.}../*.** Usa
1e410 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  ge:  sqlite3_sta
1e420 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a  ck_used DB SQL.*
1e430 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73  *.** Try to meas
1e440 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ure the amount o
1e450 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75 73  f stack space us
1e460 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  ed by a call to 
1e470 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a  sqlite3_exec.*/.
1e480 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e490 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f  stack_used(.  vo
1e4a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e4b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e4c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1e4d0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1e4e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1e4f0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  b;.  int i;.  if
1e500 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
1e510 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e520 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e530 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e540 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e550 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 53   .        " DB S
1e560 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
1e570 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e580 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1e590 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1e5a0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1e5b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e5c0 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20    prepStack();. 
1e5d0 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65   (void)sqlite3_e
1e5e0 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
1e5f0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72   0, 0, 0);.  for
1e600 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26  (i=65535; i>=0 &
1e610 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33  & ((u32*)sqlite3
1e620 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29  _stack_baseline)
1e630 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66  [-i]==0xdeadbeef
1e640 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53  ; i--){}.  Tcl_S
1e650 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e660 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e670 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72  j(i*4));.  retur
1e680 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e690 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1e6a0 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
1e6b0 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d   DB function-nam
1e6c0 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  e.**.** Delete t
1e6d0 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
1e6e0 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27   'function-name'
1e6f0 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68   from database h
1e700 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20  andle DB. It.** 
1e710 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1e720 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1e730 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  n was created as
1e740 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65   UTF8, any numbe
1e750 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  r of.** argument
1e760 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20 54  s (the way the T
1e770 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1e780 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1e790 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63   int delete_func
1e7a0 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
1e7b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1e7c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e7d0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1e7e0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1e7f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1e800 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
1e810 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1e820 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e830 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1e840 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1e850 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
1e860 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
1e870 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
1e880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e890 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e8a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e8b0 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1e8c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e8d0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1e8e0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
1e8f0 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
1e900 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
1e910 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1e920 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1e930 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1e940 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1e950 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1e960 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e970 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1e980 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
1e990 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
1e9a0 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1e9b0 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
1e9c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
1e9d0 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
1e9e0 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
1e9f0 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
1ea00 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1ea10 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1ea20 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
1ea30 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
1ea40 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
1ea50 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
1ea60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1ea70 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
1ea80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ea90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1eaa0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1eab0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1eac0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1ead0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
1eae0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1eaf0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1eb00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1eb10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1eb20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1eb30 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1eb40 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
1eb50 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
1eb60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1eb70 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1eb80 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1eb90 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1eba0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ebb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1ebc0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
1ebd0 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
1ebe0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
1ebf0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1ec00 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1ec10 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1ec20 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1ec30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ec40 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ec50 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
1ec60 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
1ec70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
1ec80 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
1ec90 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
1eca0 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
1ecb0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1ecc0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
1ecd0 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63  ic int get_autoc
1ece0 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  ommit(.  void * 
1ecf0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ed00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ed10 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1ed20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1ed30 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1ed40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ed50 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
1ed60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ed70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ed80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ed90 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1eda0 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1edb0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1edc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1edd0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ede0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1edf0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ee00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ee10 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
1ee20 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1ee30 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1ee40 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1ee50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1ee60 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1ee70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ee80 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1ee90 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1eea0 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1eeb0 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1eec0 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1eed0 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1eee0 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1eef0 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1ef00 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1ef10 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1ef20 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1ef30 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1ef40 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1ef50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ef60 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1ef70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1ef80 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ef90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1efa0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1efb0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1efc0 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1efd0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1efe0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1eff0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f000 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1f010 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1f020 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1f030 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1f040 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f050 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f060 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f070 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f080 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f090 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1f0a0 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1f0b0 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1f0c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f0d0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f0e0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1f0f0 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1f100 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f110 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1f120 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1f130 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f140 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c  *.** Usage:  tcl
1f150 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56  _variable_type V
1f160 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ARIABLENAME.**.*
1f170 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1f180 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  e of the interna
1f190 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
1f1a0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75   for the.** valu
1f1b0 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76  e of the given v
1f1c0 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1f1d0 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61  ic int tcl_varia
1f1e0 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  ble_type(.  void
1f1f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f200 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f210 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f220 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f230 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1f240 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69  l_Obj *pVar;.  i
1f250 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f260 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f270 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f280 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b  jv, "VARIABLE");
1f290 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f2a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61  ERROR;.  }.  pVa
1f2b0 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
1f2c0 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  x(interp, Tcl_Ge
1f2d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1f2e0 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45  , 0, TCL_LEAVE_E
1f2f0 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70  RR_MSG);.  if( p
1f300 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Var==0 ) return 
1f310 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1f320 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29   pVar->typePtr )
1f330 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1f340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1f350 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1f360 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
1f370 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
1f380 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f390 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f3a0 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1f3b0 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a  _memory ?N?.**.*
1f3c0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * Attempt to rel
1f3d0 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
1f3e0 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e  ently held but n
1f3f0 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  ot actually requ
1f400 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74  ired..** The int
1f410 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75  eger N is the nu
1f420 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65  mber of bytes we
1f430 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1f440 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a  elease.  The .**
1f450 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1f460 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
1f470 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72  emory actually r
1f480 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  eleased..*/.stat
1f490 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65  ic int test_rele
1f4a0 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1f4b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f4c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f4d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f4e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f4f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1f500 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1f510 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1f520 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
1f530 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1f540 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
1f550 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
1f560 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1f570 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1f580 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1f590 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1f5a0 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1f5b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f5c0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1f5d0 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1f5e0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1f5f0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1f600 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1f610 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
1f620 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
1f630 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
1f640 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
1f650 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1f660 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1f670 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
1f680 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1f690 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1f6a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f6b0 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1f6c0 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
1f6d0 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1f6e0 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1f6f0 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
1f700 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
1f710 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1f720 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
1f730 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
1f740 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
1f750 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
1f760 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
1f770 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1f780 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f790 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f7a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f7b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f7c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f7d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f7e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1f7f0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1f800 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1f810 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1f820 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1f830 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f840 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f850 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1f860 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1f870 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1f880 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f890 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62   rc = sqlite3_db
1f8a0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
1f8b0 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
1f8c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1f8d0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
1f8e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1f8f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f900 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
1f910 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e  _filename DB DBN
1f920 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1f930 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
1f940 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
1f950 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a  ith a database..
1f960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f970 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a  st_db_filename(.
1f980 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f990 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f9a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f9b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f9c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f9d0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f9e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f9f0 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
1fa00 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1fa10 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1fa20 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1fa30 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
1fa40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa50 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1fa60 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1fa70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1fa80 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1fa90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1faa0 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
1fab0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1fac0 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
1fad0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fae0 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c  , sqlite3_db_fil
1faf0 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d  ename(db, zDbNam
1fb00 65 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  e), (void*)0);. 
1fb10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fb20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fb30 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64   sqlite3_db_read
1fb40 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a  only DB DBNAME.*
1fb50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72  *.** Return 1 or
1fb60 20 30 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20   0 if DBNAME is 
1fb70 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e  readonly or not.
1fb80 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44    Return -1 if D
1fb90 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f  BNAME does.** no
1fba0 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  t exist..*/.stat
1fbb0 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72  ic int test_db_r
1fbc0 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20  eadonly(.  void 
1fbd0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1fbe0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fbf0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1fc00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1fc10 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1fc20 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1fc30 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b  t char *zDbName;
1fc40 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1fc50 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1fc60 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1fc70 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
1fc80 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
1fc90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fca0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1fcb0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1fcc0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1fcd0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1fce0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
1fcf0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
1fd00 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1fd10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1fd20 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1fd30 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1fd40 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c  _db_readonly(db,
1fd50 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72   zDbName)));.  r
1fd60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fd70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1fd80 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
1fd90 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a  _limit ?N?.**.**
1fda0 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74 68   Query or set th
1fdb0 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69  e soft heap limi
1fdc0 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  t for the curren
1fdd0 74 20 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a  t thread.  The.*
1fde0 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20  * limit is only 
1fdf0 63 68 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e  changed if the N
1fe00 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68   is present.  Th
1fe10 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74  e previous limit
1fe20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e  .** is returned.
1fe30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1fe40 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
1fe50 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
1fe60 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1fe70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1fe80 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1fe90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1fea0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1feb0 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63  _int64 amt;.  Tc
1fec0 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31  l_WideInt N = -1
1fed0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1fee0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
1fef0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1ff00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1ff10 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20  jv, "?N?");.    
1ff20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ff30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
1ff40 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
1ff50 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
1ff60 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1ff70 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1ff80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ff90 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
1ffa0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
1ffb0 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  t64(N);.  Tcl_Se
1ffc0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1ffd0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
1ffe0 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
1fff0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20000 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
20010 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
20020 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
20030 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
20040 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
20050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
20060 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
20070 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  up(.  void * cli
20080 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20090 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
200a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
200b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
200c0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
200d0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
200e0 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74  ATED.  sqlite3_t
200f0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b  hread_cleanup();
20100 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
20110 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20120 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
20130 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
20140 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ts  DB.**.** Ret
20150 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75  urn a list of nu
20160 6d 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20  mbers which are 
20170 74 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e  the PagerRefcoun
20180 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67  t for all.** pag
20190 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61  ers on each data
201a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
201b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
201c0 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
201d0 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nts(.  void * cl
201e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
201f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20200 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20210 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20220 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20230 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
20240 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63   int v, *a;.  Tc
20250 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a  l_Obj *pResult;.
20260 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
20270 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20290 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
202a0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
202b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
202c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
202d0 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29  ], 0), " DB", 0)
202e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
202f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20300 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20310 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20320 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20330 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20340 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c  _ERROR;.  pResul
20350 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
20360 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
20370 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20380 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d    if( db->aDb[i]
20390 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .pBt==0 ){.     
203a0 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c   v = -1;.    }el
203b0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
203c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
203d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
203e0 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
203f0 53 74 61 74 73 28 73 71 6c 69 74 65 33 42 74 72  Stats(sqlite3Btr
20400 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
20410 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20  i].pBt));.      
20420 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  v = a[0];.      
20430 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
20440 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
20450 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69      }.    Tcl_Li
20460 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20470 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54  nt(0, pResult, T
20480 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
20490 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
204a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
204b0 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74   pResult);.  ret
204c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
204d0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
204e0 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
204f0 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c  t.**.** Some TCL
20500 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67   builds (ex: cyg
20510 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70  win) do not supp
20520 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67  ort 64-bit integ
20530 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65  ers.  This.** le
20540 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20  ads to a number 
20550 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72 65 73  of test failures
20560 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74 20 63  .  The present c
20570 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68  ommand checks th
20580 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74  e.** TCL build t
20590 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
205a0 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73   not it supports
205b0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
205c0 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  .  It.** returns
205d0 20 54 52 55 45 20 69 66 20 69 74 20 64 6f 65 73   TRUE if it does
205e0 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f   and FALSE if no
205f0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  t..**.** This co
20600 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
20610 20 77 61 72 6e 20 75 73 65 72 73 20 74 68 61 74   warn users that
20620 20 74 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64   their TCL build
20630 20 69 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a   is defective.**
20640 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 65 72   and that the er
20650 72 6f 72 73 20 74 68 65 79 20 61 72 65 20 73 65  rors they are se
20660 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74  eing in the test
20670 20 73 63 72 69 70 74 73 20 6d 69 67 68 74 20 62   scripts might b
20680 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66  e.** a result of
20690 20 74 68 65 69 72 20 64 65 66 65 63 74 69 76 65   their defective
206a0 20 54 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e   TCL rather than
206b0 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c   problems in SQL
206c0 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ite..*/.static i
206d0 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  nt working_64bit
206e0 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  _int(.  ClientDa
206f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
20700 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
20710 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
20720 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
20730 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20740 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
20750 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
20760 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
20770 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
20780 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
20790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
207a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
207b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
207c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
207d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
207e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74    Tcl_Obj *pTest
207f0 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69  Obj;.  int worki
20800 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74  ng = 0;..  pTest
20810 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64  Obj = Tcl_NewWid
20820 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a  eIntObj(1000000*
20830 28 69 36 34 29 31 32 33 34 35 36 37 38 39 30 29  (i64)1234567890)
20840 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74  ;.  working = st
20850 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
20860 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31  ng(pTestObj), "1
20870 32 33 34 35 36 37 38 39 30 30 30 30 30 30 30 22  234567890000000"
20880 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72  )==0;.  Tcl_Decr
20890 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62  RefCount(pTestOb
208a0 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  j);.  Tcl_SetObj
208b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
208c0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
208d0 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65  (working));.  re
208e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
208f0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
20900 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
20910 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
20920 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74  command unregist
20930 65 72 73 20 74 68 65 20 70 72 69 6d 61 72 79 20  ers the primary 
20940 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67  VFS and then reg
20950 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63  isters.** it bac
20960 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69  k again.  This i
20970 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
20980 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65  he ability to re
20990 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20  gister a.** VFS 
209a0 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72  when none are pr
209b0 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
209c0 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69  red, and the abi
209d0 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65  lity to .** unre
209e0 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20  gister the only 
209f0 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20  available VFS.  
20a00 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a  Ticket #2738.*/.
20a10 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75  static int vfs_u
20a20 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c  nlink_test(.  Cl
20a30 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
20a40 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
20a50 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
20a60 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
20a70 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
20a80 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
20a90 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
20aa0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20ab0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20ac0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
20ad0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20ae0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
20af0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
20b00 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
20b10 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
20b20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
20b30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d   sqlite3_vfs *pM
20b40 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ain;.  sqlite3_v
20b50 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20  fs *apVfs[20];. 
20b60 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
20b70 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  , two;..  sqlite
20b80 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
20b90 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69  (0);   /* Unregi
20ba0 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20  ster of NULL is 
20bb0 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e  harmless */.  on
20bc0 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
20bd0 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d  ";.  two.zName =
20be0 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20   "__two";..  /* 
20bf0 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
20c00 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
20c10 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f  h 2nd argument o
20c20 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  f 0 does not.  *
20c30 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 66  * change the def
20c40 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20  ault VFS.  */.  
20c50 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pMain = sqlite3_
20c60 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73  vfs_find(0);.  s
20c70 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20c80 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20  ter(&one, 0);.  
20c90 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
20ca0 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
20cb0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
20cc0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
20cd0 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30  register(&two, 0
20ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
20cf0 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
20d00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20d10 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  (0) );..  /* We 
20d20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62  can find a VFS b
20d30 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  y its name */.  
20d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20d50 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
20d60 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
20d70 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
20d80 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
20d90 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  &two );..  /* Ca
20da0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73  lling sqlite_vfs
20db0 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 6e  _register with n
20dc0 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70  on-zero second p
20dd0 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73  arameter changes
20de0 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
20df0 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74  t VFS, even if t
20e00 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65 72  he 1st parameter
20e10 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20 56   is an existig V
20e20 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  FS that is.  ** 
20e30 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
20e40 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e  tered as the non
20e50 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20  -default..  */. 
20e60 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
20e70 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
20e80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e90 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
20ea0 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
20eb0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20ec0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
20ed0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
20ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
20ef0 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b  find(0)==&one );
20f00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
20f10 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29  egister(&two, 1)
20f20 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20f30 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
20f40 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
20f50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20f60 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
20f70 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
20f80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
20f90 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20  s_find(0)==&two 
20fa0 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29  );.  if( pMain )
20fb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
20fc0 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
20fd0 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
20fe0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20ff0 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
21000 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
21010 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21020 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
21030 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21040 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21050 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
21060 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  }.  .  /* Unlink
21070 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
21080 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
21090 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
210a0 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67  e VFSes.  ** reg
210b0 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  istered..  */.  
210c0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
210d0 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
210e0 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  apVfs[0]); i++){
210f0 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
21100 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21110 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
21120 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61  fs[i] ){.      a
21130 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
21140 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
21150 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
21160 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
21170 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21180 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
21190 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
211a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
211b0 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
211c0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
211d0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
211e0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
211f0 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74  ;.  .  /* Regist
21200 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
21210 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28  as non-default (
21220 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66  will be made def
21230 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a  ault, since.  **
21240 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e   it'll be the on
21250 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65  ly one in existe
21260 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  nce)..  */.  sql
21270 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21280 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61  r(pMain, 0);.  a
21290 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
212a0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
212b0 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d  n );.  .  /* Un-
212c0 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  register the mai
212d0 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72  n VFS again to r
212e0 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20  estore an empty 
212f0 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  VFS list */.  sq
21300 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21310 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61  ster(pMain);.  a
21320 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
21330 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
21340 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c  ..  /* Relink al
21350 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65 72  l VFSes in rever
21360 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20  se order. */  . 
21370 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70   for(i=sizeof(ap
21380 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
21390 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  s[0])-1; i>=0; i
213a0 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56  --){.    if( apV
213b0 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  fs[i] ){.      s
213c0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
213d0 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29  ter(apVfs[i], 1)
213e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
213f0 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
21400 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
21410 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
21420 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
21430 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
21440 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
21450 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
21460 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d  register out sam
21470 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20  ple VFSes. */.  
21480 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21490 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
214a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
214b0 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20  gister(&two);.. 
214c0 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e   /* Unregisterin
214d0 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73 20  g a VFS that is 
214e0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
214f0 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72 6d  gistered is harm
21500 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  less */.  sqlite
21510 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21520 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
21530 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21540 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74  (&two);.  assert
21550 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21560 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29  nd("__one")==0 )
21570 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21580 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21590 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  two")==0 );..  /
215a0 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c  * We should be l
215b0 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  eft with the ori
215c0 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46  ginal default VF
215d0 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20  S back as the.  
215e0 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20  ** original */. 
215f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21600 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
21610 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ain );..  return
21620 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21630 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
21640 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a  initfail_test.**
21650 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
21660 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f  mand attempts to
21670 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66   vfs_find and vf
21680 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s_register when 
21690 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  the.** sqlite3_i
216a0 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65  nitialize() inte
216b0 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67  rface is failing
216c0 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f  .  All calls sho
216d0 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61  uld fail..*/.sta
216e0 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74  tic int vfs_init
216f0 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  fail_test(.  Cli
21700 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21710 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
21720 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
21730 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
21740 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21750 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21760 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21770 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21780 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21790 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
217a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
217b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
217c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
217d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
217e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
217f0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
21800 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e  fs one;.  one.zN
21810 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a  ame = "__one";..
21820 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
21830 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
21840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21850 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21860 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
21870 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
21880 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
21890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
218a0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
218b0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
218c0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
218d0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
218e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
218f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21900 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65  /*.** Saved VFSe
21910 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  s.*/.static sqli
21920 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
21930 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  0];.static int n
21940 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Vfs = 0;../*.** 
21950 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
21960 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
21970 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c  ** Unregister al
21980 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  l VFSes..*/.stat
21990 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67  ic int vfs_unreg
219a0 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
219b0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
219c0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
219d0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
219e0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
219f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21a00 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21a10 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21a20 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21a30 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21a40 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21a50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21a60 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21a70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21a80 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21a90 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21aa0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
21ab0 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
21ac0 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b  Size(apVfs); i++
21ad0 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
21ae0 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21af0 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
21b00 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65  pVfs[i]==0 ) bre
21b10 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ak;.    sqlite3_
21b20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
21b30 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pVfs[i]);.  }.  
21b40 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75  nVfs = i;.  retu
21b50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
21b60 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
21b70 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a  _reregister_all.
21b80 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c  **.** Restore al
21b90 6c 20 56 46 53 65 73 20 74 68 61 74 20 77 65 72  l VFSes that wer
21ba0 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20  e removed using 
21bb0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21bc0 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ll.*/.static int
21bd0 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
21be0 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
21bf0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21c00 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21c10 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21c20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21c30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21c40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21c50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21c60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21c70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21c80 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21c90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21ca0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21cb0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21cc0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21cd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21ce0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
21cf0 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b  0; i<nVfs; i++){
21d00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
21d10 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  _register(apVfs[
21d20 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20  i], i==0);.  }. 
21d30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
21d40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
21d50 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
21d60 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
21d70 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
21d80 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
21d90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
21da0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
21db0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
21dc0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
21dd0 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
21de0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
21df0 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  l_test(.  Client
21e00 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
21e10 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
21e20 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
21e30 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
21e40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21e50 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
21e60 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
21e70 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
21e80 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21e90 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21ea0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21eb0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
21ec0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21ed0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
21ee0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
21ef0 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30  {.  int iArg = 0
21f00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
21f10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
21f20 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21f30 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21f40 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
21f50 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
21f60 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
21f70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
21f80 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
21f90 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
21fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21fb0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
21fc0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
21fd0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
21fe0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
21ff0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22000 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
22010 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22020 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b  b, 0, 0, &iArg);
22030 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
22040 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29  QLITE_NOTFOUND )
22050 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22060 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22070 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22  , "notadatabase"
22080 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  , SQLITE_FCNTL_L
22090 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29  OCKSTATE, &iArg)
220a0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
220b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
220c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
220d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
220e0 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72  "main", -1, &iAr
220f0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
22100 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
22110 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  D );.  rc = sqli
22120 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22130 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c  (db, "temp", -1,
22140 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
22150 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
22160 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51  TFOUND || rc==SQ
22170 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
22180 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22190 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
221a0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
221b0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20  _lasterrno_test 
221c0 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
221d0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
221e0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
221f0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
22200 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
22210 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
22220 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
22230 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72  E_LAST_ERRNO ver
22240 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  b..*/.static int
22250 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
22260 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20  sterrno_test(.  
22270 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
22280 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
22290 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
222a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
222b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
222c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
222d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
222e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
222f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
22300 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
22310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
22320 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
22330 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
22340 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
22350 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
22360 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
22370 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
22380 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
22390 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
223a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
223b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
223c0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
223d0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
223e0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
223f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
22400 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
22410 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22420 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22430 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
22440 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
22450 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
22460 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
22470 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22480 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
22490 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
224a0 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c  , NULL, SQLITE_L
224b0 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67  AST_ERRNO, &iArg
224c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
224d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
224e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
224f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
22500 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
22510 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69  _ERROR; .  }.  i
22520 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20  f( iArg!=0 ) {. 
22530 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22540 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65  ult(interp, "Une
22550 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f  xpected non-zero
22560 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20   errno: ",.     
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
22590 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f  mObj(Tcl_NewIntO
225a0 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20  bj(iArg), 0), " 
225b0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
225c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
225d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
225e0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
225f0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
22600 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
22610 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  st DB DBNAME SIZ
22620 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
22630 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
22640 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
22650 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
22660 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
22670 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
22680 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
22690 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
226a0 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  LE and.** SQLITE
226b0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
226c0 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61  LE verbs..*/.sta
226d0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
226e0 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
226f0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22700 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22710 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22720 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22730 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22740 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22750 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22760 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22770 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22780 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22790 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
227a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
227b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
227c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
227d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
227e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
227f0 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69   /* New chunk si
22820 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
22830 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22840 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
22850 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
22860 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
22870 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22890 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
228a0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
228d0 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
228e0 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
228f0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
22900 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
22910 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
22920 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
22930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
22950 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
22960 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
22970 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
22980 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
22990 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
229a0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
229b0 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
229c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
229d0 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
229e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
229f0 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
22a00 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
22a10 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
22a20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22a30 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
22a40 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
22a50 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  ZE, (void *)&nSi
22a60 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
22a70 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
22a80 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
22a90 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
22aa0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22ab0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
22ac0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22ad0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22ae0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22af0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
22b00 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20  izehint_test DB 
22b10 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a  DBNAME SIZE.**.*
22b20 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
22b30 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
22b40 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22b50 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77   interface .** w
22b60 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ith SQLITE_FCNTL
22b70 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74  _SIZE_HINT.*/.st
22b80 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
22b90 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
22ba0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22bb0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22bc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22bd0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22be0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22bf0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22c00 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22c10 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22c20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22c30 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22c40 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22c50 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22c60 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22c70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22c80 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22c90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22ca0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
22cb0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
22cc0 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
22cd0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cf0 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
22d00 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
22d10 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
22d20 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
22d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
22d40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
22d50 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
22d80 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
22d90 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
22da0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
22db0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
22dc0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
22dd0 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
22de0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22df0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22e00 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22e10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22e20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22e30 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
22e40 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
22e50 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
22e60 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
22e70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e80 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
22e90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22ea0 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
22eb0 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
22ec0 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
22ed0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22ee0 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
22ef0 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
22f00 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
22f10 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
22f20 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
22f30 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
22f40 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
22f50 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
22f60 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
22f70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22f80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22f90 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22fa0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
22fb0 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
22fc0 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
22fd0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22fe0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22ff0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
23000 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
23010 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
23020 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
23030 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
23040 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
23050 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23060 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
23070 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23080 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
23090 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  y_test(.  Client
230a0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
230b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
230c0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
230d0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
230e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
230f0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23100 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23110 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23120 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23130 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23140 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23150 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23160 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23170 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23180 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23190 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
231a0 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
231b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
231c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
231d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
231e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
23210 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
23220 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57 44 22  ], 0), " DB PWD"
23230 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23250 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23260 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
23270 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23280 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65  ), &db) ){.   re
23290 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
232a0 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69    }.  .#if !defi
232b0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
232c0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29  E_LOCKING_STYLE)
232d0 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f  .#  if defined(_
232e0 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64  _APPLE__).#    d
232f0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
23300 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23310 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  E 1.#  else.#   
23320 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
23330 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23340 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23  YLE 0.#  endif.#
23350 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
23360 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23370 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
23380 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a  (__APPLE__).  {.
23390 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50 61      char *testPa
233a0 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  th;.    int rc;.
233b0 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20      int nPwd;.  
233c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
233d0 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f  wd;.    char pro
233e0 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20  xyPath[400];.   
233f0 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c   .    zPwd = Tcl
23400 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
23410 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64  j(objv[2], &nPwd
23420 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f  );.    if( sizeo
23430 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77  f(proxyPath)<nPw
23440 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63  d+20 ){.      Tc
23450 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23460 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20  nterp, "PWD too 
23470 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  big", (void*)0);
23480 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23490 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
234a0 20 20 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79     sprintf(proxy
234b0 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70  Path, "%s/test.p
234c0 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20  roxy", zPwd);.  
234d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
234e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
234f0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54  NULL, SQLITE_SET
23500 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
23510 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
23520 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
23530 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
23540 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
23550 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
23560 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23570 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23580 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23590 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
235a0 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  LL, SQLITE_GET_L
235b0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74  OCKPROXYFILE, &t
235c0 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66  estPath);.    if
235d0 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50  ( strncmp(proxyP
235e0 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29  ath,testPath,11)
235f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
23600 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23610 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66  p, "Lock proxy f
23620 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63  ile did not matc
23630 68 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20  h the ".        
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73         "previous
23660 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75  ly assigned valu
23670 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  e", 0);.      re
23680 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23690 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
236a0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
236b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
236c0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
236d0 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
236e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
236f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
23700 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23710 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
23720 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23730 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
23740 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
23750 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
23760 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23770 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
23780 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
23790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
237a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
237b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
237c0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
237d0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
237e0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
237f0 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
23800 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
23810 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
23820 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23830 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23840 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
23850 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
23860 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
23870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23880 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
23890 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
238a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
238b0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
238c0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
238d0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
238e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
238f0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23900 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23910 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23920 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23930 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23940 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23950 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23960 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23970 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23980 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23990 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
239a0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
239b0 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
239c0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
239d0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
239e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
239f0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
23a00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
23a10 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
23a20 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23a30 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
23a40 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
23a50 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
23a60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23a70 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23a80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23a90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23aa0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
23ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23ac0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
23ad0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
23ae0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
23af0 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
23b00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
23b10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23b20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23b30 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
23b40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23b60 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23b70 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
23b80 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
23b90 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
23ba0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23bb0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
23bc0 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
23bd0 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
23be0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23bf0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
23c00 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23c10 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
23c20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23c30 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
23c40 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c  al DB PERSIST-FL
23c50 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
23c60 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23c70 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23c80 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23c90 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
23ca0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
23cb0 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a  ST_WAL opcode..*
23cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23cd0 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
23ce0 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44  t_wal(.  ClientD
23cf0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
23d00 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
23d10 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
23d20 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
23d30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23d40 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
23d50 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
23d60 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23d70 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23d80 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23d90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23da0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
23db0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23dc0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
23dd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
23de0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23df0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
23e00 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72  bPersist;.  char
23e10 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
23e20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
23e30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
23e40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
23e50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
23e60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
23e70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23e80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
23e90 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a  " DB FLAG", 0);.
23ea0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23eb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23ec0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23ed0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23ee0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23ef0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    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 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
23f20 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
23f30 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73  bjv[2], &bPersis
23f40 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
23f50 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
23f60 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23f70 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
23f80 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
23f90 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62  T_WAL, (void*)&b
23fa0 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69  Persist);.  sqli
23fb0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
23fc0 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
23fd0 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74  d", rc, bPersist
23fe0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
23ff0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
24000 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
24010 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
24020 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
24030 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
24040 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
24050 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a  te DB PSOW-FLAG.
24060 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
24070 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
24080 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24090 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
240a0 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
240b0 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
240c0 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f  E_OVERWRITE opco
240d0 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
240e0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
240f0 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
24100 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
24110 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24120 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24130 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24140 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24150 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24160 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24170 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24180 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24190 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
241a0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
241b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
241c0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
241d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
241e0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
241f0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24200 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24210 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a  nt rc;.  int b;.
24220 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a    char z[100];..
24230 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
24240 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
24250 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
24260 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
24270 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
24280 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
24290 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
242a0 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22  , 0), " DB FLAG"
242b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
242c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
242d0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
242e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
242f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24300 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
24310 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24320 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
24330 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
24340 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
24350 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
24360 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24370 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24380 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45  l(db,NULL,SQLITE
24390 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
243a0 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64  _OVERWRITE,(void
243b0 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  *)&b);.  sqlite3
243c0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
243d0 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c  (z), z, "%d %d",
243e0 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41   rc, b);.  Tcl_A
243f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24400 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
24410 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24420 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
24430 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24440 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42  ntrol_vfsname DB
24450 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52   ?AUXDB?.**.** R
24460 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
24470 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
24480 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73  e stack of VFSes
24490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
244a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
244b0 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
244c0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
244d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
244e0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
244f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24500 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24510 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24520 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24530 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24540 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24550 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24560 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24570 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24580 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24590 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
245a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
245b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
245c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
245d0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
245e0 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20   char *zVfsName 
245f0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
24600 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
24610 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
24620 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24630 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
24640 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
24650 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
24660 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24670 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24680 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
24690 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
246a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
246b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
246c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
246d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
246e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
246f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24700 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
24710 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
24720 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24730 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
24740 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24750 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
24760 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f  CNTL_VFSNAME,(vo
24770 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  id*)&zVfsName);.
24780 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24790 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e  lt(interp, zVfsN
247a0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
247b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
247c0 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  VfsName);.  retu
247d0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
247e0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
247f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
24800 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55  pfilename DB ?AU
24810 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  XDB?.**.** Retur
24820 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
24830 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
24840 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  ilename.*/.stati
24850 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
24860 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28  ol_tempfilename(
24870 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
24880 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
24890 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
248a0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
248b0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
248c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
248d0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
248e0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
248f0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
24900 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
24910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24920 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
24930 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
24940 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
24950 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
24960 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
24970 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
24980 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
24990 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72  = "main";.  char
249a0 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20   *zTName = 0;.. 
249b0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
249c0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
249d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
249e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
249f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24a00 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24a10 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24a20 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24a30 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30  " DB ?AUXDB?", 0
24a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24a50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24a60 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24a70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24a80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24a90 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
24aa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24ab0 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
24ac0 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d  ){.    zDbName =
24ad0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24ae0 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73  bjv[2]);.  }.  s
24af0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24b00 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c  rol(db, zDbName,
24b10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
24b20 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69  MPFILENAME, (voi
24b30 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54  d*)&zTName);.  T
24b40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24b50 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20  interp, zTName, 
24b60 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c  (char*)0);.  sql
24b70 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65  ite3_free(zTName
24b80 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24b90 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
24ba0 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
24bb0 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a  3_vfs_list.**.**
24bc0 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20     Return a tcl 
24bd0 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
24be0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
24bf0 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27   registered vfs'
24c00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24c10 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69   vfs_list(.  Cli
24c20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
24c30 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
24c40 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
24c50 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24c60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24c70 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24c80 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24c90 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24ca0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24cb0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24cc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24cd0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24ce0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24cf0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
24d00 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
24d10 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
24d20 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f  fs *pVfs;.  Tcl_
24d30 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
24d40 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20  NewObj();.  if( 
24d50 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
24d60 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
24d70 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
24d80 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
24d90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24da0 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74    for(pVfs=sqlit
24db0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20  e3_vfs_find(0); 
24dc0 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d  pVfs; pVfs=pVfs-
24dd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c  >pNext){.    Tcl
24de0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
24df0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
24e00 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
24e10 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  gObj(pVfs->zName
24e20 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63  , -1));.  }.  Tc
24e30 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24e40 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20  nterp, pRet);.  
24e50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
24e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
24e70 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  :   sqlite3_limi
24e80 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a  t DB ID VALUE.**
24e90 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
24ea0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
24eb0 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65  lite3_limit inte
24ec0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
24ed0 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
24ee0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
24ef0 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
24f00 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20  nt test_limit(. 
24f10 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
24f20 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
24f30 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
24f40 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
24f50 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24f60 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24f70 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24f80 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
24f90 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
24fa0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
24fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
24fc0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
24fd0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
24fe0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24ff0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25000 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
25010 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
25020 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
25030 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63   struct {.     c
25040 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
25050 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64   int id;.  } aId
25060 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
25070 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
25080 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  H",             
25090 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45   SQLITE_LIMIT_LE
250a0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
250b0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
250c0 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
250d0 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20  NGTH",          
250e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
250f0 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20  _LENGTH         
25100 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25110 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22  TE_LIMIT_COLUMN"
25120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
25130 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
25140 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
25150 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25160 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
25170 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
25180 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
25190 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
251a0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
251b0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
251c0 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c  SELECT",     SQL
251d0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55  ITE_LIMIT_COMPOU
251e0 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d  ND_SELECT      }
251f0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25200 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20  LIMIT_VDBE_OP", 
25210 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25220 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
25230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
25240 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25250 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
25260 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  G",        SQLIT
25270 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
25280 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a  _ARG         },.
25290 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
252a0 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20  MIT_ATTACHED",  
252b0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
252c0 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
252d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
252e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
252f0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
25300 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f  LENGTH", SQLITE_
25310 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45  LIMIT_LIKE_PATTE
25320 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20  RN_LENGTH  },.  
25330 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25340 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
25350 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  R",     SQLITE_L
25360 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
25370 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20  MBER      },.   
25380 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25390 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c  _TRIGGER_DEPTH",
253a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
253b0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
253c0 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  H        },.    
253d0 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72  .    /* Out of r
253e0 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20  ange test cases 
253f0 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  */.    { "SQLITE
25400 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22  _LIMIT_TOOSMALL"
25410 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
25440 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25450 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20  LIMIT_TOOBIG",  
25460 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25470 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
25480 5f 44 45 50 54 48 2b 31 20 20 20 20 20 20 7d 2c  _DEPTH+1      },
25490 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69  .  };.  int i, i
254a0 64 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  d;.  int val;.  
254b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
254c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
254d0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
254e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
254f0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
25500 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
25510 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
25520 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
25530 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20  0], 0), " DB ID 
25540 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
25550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25560 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
25570 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25580 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25590 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
255a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
255b0 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65  ;.  zId = Tcl_Ge
255c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
255d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
255e0 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
255f0 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  f(aId[0]); i++){
25600 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
25610 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d  zId, aId[i].zNam
25620 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
25630 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20  d = aId[i].id;. 
25640 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
25650 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
25660 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
25670 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20  f(aId[0]) ){.   
25680 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25690 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
256a0 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22  wn limit type: "
256b0 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29  , zId, (char*)0)
256c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
256d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
256e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
256f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
25700 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
25710 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69   rc = sqlite3_li
25730 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29  mit(db, id, val)
25740 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
25750 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
25760 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
25770 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25780 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
25790 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f  cmd:  save_prng_
257a0 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65  state.**.** Save
257b0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
257c0 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  e pseudo-random 
257d0 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
257e0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65  ..** At the same
257f0 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68   time, verify th
25800 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  at sqlite3_test_
25810 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76  control works ev
25820 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65  en when.** calle
25830 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  d with an out-of
25840 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a  -range opcode..*
25850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
25860 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
25870 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25880 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25890 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
258a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
258b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
258c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
258d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
258e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
258f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
25900 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
25910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25920 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25930 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25940 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25950 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25960 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
25970 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
25980 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20  control(9999);. 
25990 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
259a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
259b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31  _test_control(-1
259c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
259d0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
259e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
259f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
25a00 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72  G_SAVE);.  retur
25a10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
25a20 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f  * tclcmd:  resto
25a30 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f  re_prng_state.*/
25a40 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74  .static int rest
25a50 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ore_prng_state(.
25a60 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25a70 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25a80 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25a90 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25aa0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25ab0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25ac0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25ad0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25ae0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25af0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25b20 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25b30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25b40 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25b50 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25b60 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
25b70 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
25b80 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a  _PRNG_RESTORE);.
25b90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25ba0 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25bb0 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
25bc0 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
25bd0 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
25be0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25bf0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25c00 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25c10 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25c20 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25c30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25c40 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25c50 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25c60 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25c70 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25c80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25c90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25ca0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25cb0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25cc0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25cd0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
25ce0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
25cf0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
25d00 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b  TRL_PRNG_RESET);
25d10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
25d30 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79  d:  database_may
25d40 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  _be_corrupt.**.*
25d50 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
25d60 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
25d70 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e  ight be corrupt.
25d80 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
25d90 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c  , set the normal
25da0 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65  .** state of ope
25db0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
25dc0 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6d  c int database_m
25dd0 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a 20  ay_be_corrupt(. 
25de0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25df0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25e00 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25e10 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25e20 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25e30 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25e40 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25e50 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25e60 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25e70 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25e90 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25ea0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25eb0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25ec0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25ed0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
25ee0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
25ef0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
25f00 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 30  NEVER_CORRUPT, 0
25f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25f20 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
25f30 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e 65  md:  database_ne
25f40 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  ver_corrupt.**.*
25f50 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
25f60 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
25f70 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 66  re always well-f
25f80 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e 61  ormed.  This ena
25f90 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65 72  bles extra asser
25fa0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
25fb0 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e 64  s that test cond
25fc0 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
25fd0 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72 20  always true for 
25fe0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
25ff0 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bases..*/.static
26000 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e 65   int database_ne
26010 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20 43  ver_corrupt(.  C
26020 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26030 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26040 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26050 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26060 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26070 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26080 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26090 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
260a0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
260b0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
260c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
260d0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
260e0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
260f0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26100 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26110 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26120 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
26130 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
26140 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29 3b  VER_CORRUPT, 1);
26150 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
26170 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73  d:  pcache_stats
26180 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
26190 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
261a0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
261b0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
261c0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
261d0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
261e0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
261f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26200 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26210 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26220 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26230 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26250 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26260 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26270 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26280 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26290 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
262a0 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d  t nMin;.  int nM
262b0 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65  ax;.  int nCurre
262c0 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63  nt;.  int nRecyc
262d0 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a  lable;.  Tcl_Obj
262e0 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74   *pRet;..  sqlit
262f0 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e  e3PcacheStats(&n
26300 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20  Current, &nMax, 
26310 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61  &nMin, &nRecycla
26320 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20  ble);..  pRet = 
26330 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
26340 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
26350 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26360 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
26370 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74  ringObj("current
26380 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
26390 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
263a0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
263b0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
263c0 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63  nCurrent));.  Tc
263d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
263e0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
263f0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
26400 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29  ngObj("max", -1)
26410 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
26420 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
26430 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
26440 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29  NewIntObj(nMax))
26450 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
26460 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26470 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26480 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e  ewStringObj("min
26490 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
264a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
264b0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
264c0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
264d0 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMin));.  Tcl_Li
264e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
264f0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26500 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
26510 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20  j("recyclable", 
26520 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
26530 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26540 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
26550 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65  cl_NewIntObj(nRe
26560 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54  cyclable));..  T
26570 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
26580 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
26590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
265a0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
265b0 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
265c0 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
265d0 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  id test_unlock_n
265e0 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a  otify_cb(void **
265f0 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  aArg, int nArg){
26600 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
26610 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20  (ii=0; ii<nArg; 
26620 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45  ii++){.    Tcl_E
26630 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72  valEx((Tcl_Inter
26640 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75  p *)aArg[ii], "u
26650 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d  nlock_notify", -
26660 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
26670 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
26680 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
26690 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
266a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   */../*.** tclcm
266b0 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  d:  sqlite3_unlo
266c0 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a  ck_notify db.*/.
266d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
266e0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
266f0 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  FY.static int te
26700 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
26710 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26720 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
26730 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
26740 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26750 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26760 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26770 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26780 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
267a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
267b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
267c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
267d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
267e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
267f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
26800 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
26810 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
26820 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
26830 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
26840 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
26850 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
26860 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
26870 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
26880 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
26890 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
268a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
268b0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
268c0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
268d0 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  (db, test_unlock
268e0 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69  _notify_cb, (voi
268f0 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54  d *)interp);.  T
26900 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26910 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
26920 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26930 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26940 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
26950 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ndif../*.** tclc
26960 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
26970 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f  _checkpoint db ?
26980 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME?.*/.static 
26990 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
269a0 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
269b0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
269c0 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
269d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
269e0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
269f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26a00 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26a10 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26a20 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26a30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26a40 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26a50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26a60 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26a70 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26a80 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
26a90 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
26aa0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
26ab0 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
26ac0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
26ad0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
26ae0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
26af0 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  "DB ?NAME?");.  
26b00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26b10 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
26b20 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26b30 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26b40 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26b50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26b60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26b70 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
26b80 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
26b90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
26ba0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
26bb0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
26bc0 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54  nt(db, zDb);.  T
26bd0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26be0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
26bf0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
26c00 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
26c10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
26c20 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
26c30 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
26c40 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20  oint_v2 db MODE 
26c50 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  ?NAME?.**.** Thi
26c60 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20  s command calls 
26c70 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
26c80 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  nt_v2() function
26c90 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
26ca0 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75  ied.** mode argu
26cb0 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66  ment (passive, f
26cc0 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e  ull or restart).
26cd0 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65   If present, the
26ce0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
26cf0 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64  * NAME is passed
26d00 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
26d10 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63  rgument to wal_c
26d20 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20  heckpoint_v2(). 
26d30 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d  If it the.** NAM
26d40 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  E argument is no
26d50 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c  t present, a NUL
26d60 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73  L pointer is pas
26d70 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
26d80 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70  ** If wal_checkp
26d90 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e  oint_v2() return
26da0 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
26db0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
26dc0 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  SY or.** SQLITE_
26dd0 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  OK, then this co
26de0 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43  mmand returns TC
26df0 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c  L_ERROR. The Tcl
26e00 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a   result is set.*
26e10 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  * to the error m
26e20 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20  essage obtained 
26e30 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
26e40 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  msg()..**.** Oth
26e50 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d  erwise, this com
26e60 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c  mand returns a l
26e70 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74  ist of three int
26e80 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
26e90 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31   integer.** is 1
26ea0 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
26eb0 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72  was returned, or
26ec0 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68   0 otherwise. Th
26ed0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
26ee0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
26ef0 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
26f00 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70  ned via the outp
26f10 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62 79  ut parameters by
26f20 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
26f30 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75  v2() -.** the nu
26f40 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
26f50 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68  n the log and th
26f60 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
26f70 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a  es in the log.**
26f80 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
26f90 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
26fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
26fb0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
26fc0 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
26fd0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26fe0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
26ff0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27000 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27010 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27020 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27030 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27040 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27050 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27060 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27070 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27080 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27090 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
270a0 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
270b0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
270c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65  int rc;..  int e
270d0 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67  Mode;.  int nLog
270e0 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e   = -555;.  int n
270f0 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54  Ckpt = -555;.  T
27100 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
27110 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d   const char * aM
27120 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69  ode[] = { "passi
27130 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65  ve", "full", "re
27140 73 74 61 72 74 22 2c 20 30 20 7d 3b 0a 20 20 61  start", 0 };.  a
27150 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
27160 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
27170 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27180 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
27190 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
271a0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
271b0 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
271c0 54 3d 3d 32 20 29 3b 0a 0a 20 20 69 66 28 20 6f  T==2 );..  if( o
271d0 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
271e0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
271f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
27200 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d  , 1, objv, "DB M
27210 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  ODE ?NAME?");.  
27220 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27230 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
27240 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44  bjc==4 ){.    zD
27250 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
27260 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a  g(objv[3]);.  }.
27270 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
27280 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
27290 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
272a0 29 2c 20 26 64 62 29 0a 20 20 20 7c 7c 20 54 63  ), &db).   || Tc
272b0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
272c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
272d0 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22  ], aMode, "mode"
272e0 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20  , 0, &eMode) .  
272f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
27300 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
27310 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
27320 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64  _checkpoint_v2(d
27330 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20 26  b, zDb, eMode, &
27340 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a 20  nLog, &nCkpt);. 
27350 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27360 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
27370 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 54 63 6c  _BUSY ){.    Tcl
27380 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
27390 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
273a0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 54  e3_errmsg(db), T
273b0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
273c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
273d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
273e0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
273f0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27400 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27410 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27420 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54  IntObj(rc==SQLIT
27430 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20  E_BUSY?1:0));.  
27440 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27450 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27460 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
27470 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54  tObj(nLog));.  T
27480 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27490 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
274a0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
274b0 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54  Obj(nCkpt));.  T
274c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
274d0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
274e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
274f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
27500 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  :  test_sqlite3_
27510 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  log ?SCRIPT?.*/.
27520 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f  static struct Lo
27530 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63  gCallback {.  Tc
27540 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72  l_Interp *pInter
27550 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
27560 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63  bj;.} logcallbac
27570 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74  k = {0, 0};.stat
27580 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c  ic void xLogcall
27590 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65  back(void *unuse
275a0 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72  d, int err, char
275b0 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f   *zMsg){.  Tcl_O
275c0 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44  bj *pNew = Tcl_D
275d0 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63  uplicateObj(logc
275e0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
275f0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
27600 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c  t(pNew);.  Tcl_L
27610 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
27620 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e  ent(.      0, pN
27630 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
27640 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
27650 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
27660 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27670 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
27680 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
27690 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
276a0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
276b0 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
276c0 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
276d0 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
276e0 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
276f0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
27700 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
27710 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
27720 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
27730 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27740 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
27750 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27760 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27770 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27780 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27790 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
277a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
277b0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
277c0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
277d0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
277e0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
277f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
27800 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
27810 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
27820 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
27830 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
27840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27850 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
27860 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
27870 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
27880 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27890 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
278a0 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
278b0 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
278c0 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
278d0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
278e0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
278f0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
27900 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
27910 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
27920 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20   = objv[1];.    
27930 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
27940 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
27950 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
27960 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e  ack.pInterp = in
27970 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  terp;.    sqlite
27980 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
27990 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67  CONFIG_LOG, xLog
279a0 63 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20  callback, 0);.  
279b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
279c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
279d0 74 63 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d  tcl_objproc COMM
279e0 41 4e 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a  ANDNAME ARGS....
279f0 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20  **.** Run a TCL 
27a00 63 6f 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74  command using it
27a10 73 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  s objProc interf
27a20 61 63 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65  ace.  Throw an e
27a30 72 72 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  rror if.** the c
27a40 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
27a50 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
27a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
27a70 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76  unAsObjProc(.  v
27a80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
27a90 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
27aa0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
27ab0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
27ac0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
27ad0 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
27ae0 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Info;.  if( objc
27af0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
27b00 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27b10 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d  p, 1, objv, "COM
27b20 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20  MAND ...");.    
27b30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27b40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c  ;.  }.  if( !Tcl
27b50 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
27b60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27b70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27b80 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
27b90 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27ba0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
27bb0 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
27bc0 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
27bd0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27be0 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
27bf0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27c00 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ROR;.  }.  if( c
27c10 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d  mdInfo.objProc==
27c20 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
27c30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27c40 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  , "command has n
27c50 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20  o objProc: ",.  
27c60 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
27c70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27c80 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
27c90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27ca0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
27cb0 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63  mdInfo.objProc(c
27cc0 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
27cd0 44 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62  Data, interp, ob
27ce0 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d  jc-1, objv+1);.}
27cf0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
27d00 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a  _OMIT_EXPLAIN./*
27d10 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65  .** WARNING: The
27d20 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
27d30 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69  ion, printExplai
27d40 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20  nQueryPlan() is 
27d50 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79  an exact.** copy
27d60 20 6f 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65   of example code
27d70 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71   from eqp.in (eq
27d80 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73  p.html). If this
27d90 20 63 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65   code is modifie
27da0 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64  d,.** then the d
27db0 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70  ocumentation cop
27dc0 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  y needs to be mo
27dd0 64 69 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a  dified as well..
27de0 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  */./*.** Argumen
27df0 74 20 70 53 74 6d 74 20 69 73 20 61 20 70 72 65  t pStmt is a pre
27e00 70 61 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d  pared SQL statem
27e10 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
27e20 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61  on compiles.** a
27e30 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
27e40 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  PLAN command to 
27e50 72 65 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72  report on the pr
27e60 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
27e70 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20  ,.** and prints 
27e80 74 68 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74  the report to st
27e90 64 6f 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74  dout using print
27ea0 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e  f()..*/.int prin
27eb0 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
27ec0 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  n(sqlite3_stmt *
27ed0 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20  pStmt){.  const 
27ee0 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20  char *zSql;     
27ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
27f00 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72  ut SQL */.  char
27f10 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *zExplain;     
27f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27f30 51 4c 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20  QL with EXPLAIN 
27f40 51 55 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65  QUERY PLAN prepe
27f50 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nded */.  sqlite
27f60 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
27f70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
27f80 70 69 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55  piled EXPLAIN QU
27f90 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
27fa0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
27fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fc0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
27fd0 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65  code from sqlite
27fe0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a  3_prepare_v2() *
27ff0 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  /..  zSql = sqli
28000 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a  te3_sql(pStmt);.
28010 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
28020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
28030 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e  ROR;..  zExplain
28040 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
28050 74 66 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52  tf("EXPLAIN QUER
28060 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c  Y PLAN %s", zSql
28070 29 3b 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69  );.  if( zExplai
28080 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  n==0 ) return SQ
28090 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72  LITE_NOMEM;..  r
280a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
280b0 61 72 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64  are_v2(sqlite3_d
280c0 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c  b_handle(pStmt),
280d0 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26   zExplain, -1, &
280e0 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
280f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78  sqlite3_free(zEx
28100 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63  plain);.  if( rc
28110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
28120 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c  turn rc;..  whil
28130 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  e( SQLITE_ROW==s
28140 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
28150 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74  lain) ){.    int
28160 20 69 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c   iSelectid = sql
28170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
28180 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
28190 20 20 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73    int iOrder = s
281a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
281b0 74 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a  t(pExplain, 1);.
281c0 20 20 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20      int iFrom = 
281d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
281e0 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b  nt(pExplain, 2);
281f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28200 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73  *zDetail = (cons
28210 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  t char *)sqlite3
28220 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78  _column_text(pEx
28230 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20  plain, 3);..    
28240 70 72 69 6e 74 66 28 22 25 64 20 25 64 20 25 64  printf("%d %d %d
28250 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69   %s\n", iSelecti
28260 64 2c 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d  d, iOrder, iFrom
28270 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a  , zDetail);.  }.
28280 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
28290 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
282a0 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ain);.}..static 
282b0 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65  int test_print_e
282c0 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  qp(.  void * cli
282d0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
282e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
282f0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
28300 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28310 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
28320 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
28330 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
28340 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
28350 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
28360 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
28370 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
28380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28390 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
283a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
283b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
283c0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
283d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
283e0 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45  R;.  rc = printE
283f0 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
28400 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69  pStmt);.  /* Thi
28410 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57  s is needed on W
28420 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61  indows so that a
28430 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e 67   test case using
28440 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63   this .  ** func
28450 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20  tion can open a 
28460 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67 65  read pipe and ge
28470 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a  t the output of.
28480 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69    ** printExplai
28490 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d  nQueryPlan() imm
284a0 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
284b0 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
284c0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
284d0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
284e0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
284f0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
28500 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
28510 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
28520 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XPLAIN */../*.**
28530 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
28540 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e  ntrol VERB ARGS.
28550 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ...*/.static int
28560 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
28570 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ol(.  void * cli
28580 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
28590 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
285a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
285b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
285c0 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56  [].){.  struct V
285d0 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  erb {.    const 
285e0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
285f0 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72   int i;.  } aVer
28600 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  b[] = {.    { "S
28610 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
28620 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c  OCALTIME_FAULT",
28630 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
28640 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
28650 20 7d 2c 20 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   }, .  };.  int 
28660 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c  iVerb;.  int iFl
28670 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ag;.  int rc;.. 
28680 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
28690 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
286a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
286b0 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e  bjv, "VERB ARGS.
286c0 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
286d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
286e0 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49  .  rc = Tcl_GetI
286f0 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63  ndexFromObjStruc
28700 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c  t(.      interp,
28710 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c   objv[1], aVerb,
28720 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d   sizeof(aVerb[0]
28730 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69  ), "VERB", 0, &i
28740 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20  Verb.  );.  if( 
28750 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74  rc!=TCL_OK ) ret
28760 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67  urn rc;..  iFlag
28770 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e   = aVerb[iVerb].
28780 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c  i;.  switch( iFl
28790 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  ag ){.    case S
287a0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
287b0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20  OCALTIME_FAULT: 
287c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b  {.      int val;
287d0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
287e0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =3 ){.        Tc
287f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28800 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
28810 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20  "ONOFF");.      
28820 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28830 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
28840 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
28850 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
28860 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
28870 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
28880 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c  ERROR;.      sql
28890 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
288a0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
288b0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
288c0 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62  T, val);.      b
288d0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
288e0 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
288f0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
28900 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28910 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
28920 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  IX.#include <sys
28930 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
28940 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
28950 68 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  h>..static int t
28960 65 73 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20  est_getrusage(. 
28970 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
28980 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
28990 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
289a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
289b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
289c0 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 32 34  .  char buf[1024
289d0 5d 3b 0a 20 20 73 74 72 75 63 74 20 72 75 73 61  ];.  struct rusa
289e0 67 65 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  ge r;.  memset(&
289f0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29  r, 0, sizeof(r))
28a00 3b 0a 20 20 67 65 74 72 75 73 61 67 65 28 52 55  ;.  getrusage(RU
28a10 53 41 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a  SAGE_SELF, &r);.
28a20 0a 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 20  .  sprintf(buf, 
28a30 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36  "ru_utime=%d.%06
28a40 64 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30  d ru_stime=%d.%0
28a50 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20  6d ru_minflt=%d 
28a60 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a  ru_majflt=%d", .
28a70 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74      (int)r.ru_ut
28a80 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74  ime.tv_sec, (int
28a90 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75  )r.ru_utime.tv_u
28aa0 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72  sec, .    (int)r
28ab0 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63  .ru_stime.tv_sec
28ac0 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d  , (int)r.ru_stim
28ad0 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20  e.tv_usec, .    
28ae0 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74  (int)r.ru_minflt
28af0 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66  , (int)r.ru_majf
28b00 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65  lt.  );.  Tcl_Se
28b10 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
28b20 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
28b30 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20  Obj(buf, -1));. 
28b40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
28b50 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
28b60 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
28b70 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  * Information pa
28b80 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ssed from the ma
28b90 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74  in thread into t
28ba0 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20  he windows file 
28bb0 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72  locker.** backgr
28bc0 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a  ound thread..*/.
28bd0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
28be0 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20  Locker {.  char 
28bf0 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f  *evName;       /
28c00 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20  * Name of event 
28c10 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64  to signal thread
28c20 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41   startup */.  HA
28c30 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
28c40 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74    /* Handle of t
28c50 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f  he file to be lo
28c60 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65  cked */.  int de
28c70 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  lay1;         /*
28c80 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f   Delay before lo
28c90 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64  cking */.  int d
28ca0 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f  elay2;         /
28cb0 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75  * Delay before u
28cc0 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e  nlocking */.  in
28cd0 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20  t ok;           
28ce0 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b    /* Finished ok
28cf0 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20   */.  int err;  
28d00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
28d10 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  e if an error oc
28d20 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69  curs */.};.#endi
28d30 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  f...#if SQLITE_O
28d40 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c  S_WIN.#include <
28d50 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a  process.h>./*.**
28d60 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20   The background 
28d70 74 68 72 65 61 64 20 74 68 61 74 20 64 6f 65 73  thread that does
28d80 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
28d90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
28da0 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28  n32_file_locker(
28db0 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
28dc0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46  .  struct win32F
28dd0 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28  ileLocker *p = (
28de0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
28df0 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61  Locker*)pAppData
28e00 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d  ;.  if( p->evNam
28e10 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  e ){.    HANDLE 
28e20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45  ev = OpenEvent(E
28e30 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54  VENT_MODIFY_STAT
28e40 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e  E, FALSE, p->evN
28e50 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65  ame);.    if ( e
28e60 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76  v ){.      SetEv
28e70 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43  ent(ev);.      C
28e80 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
28e90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28ea0 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65  p->delay1 ) Slee
28eb0 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20  p(p->delay1);.  
28ec0 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e  if( LockFile(p->
28ed0 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
28ee0 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c  00, 0) ){.    Sl
28ef0 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a  eep(p->delay2);.
28f00 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
28f10 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30  ->h, 0, 0, 10000
28f20 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0000, 0);.    p-
28f30 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  >ok = 1;.  }else
28f40 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31  {.    p->err = 1
28f50 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e  ;.  }.  CloseHan
28f60 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e  dle(p->h);.  p->
28f70 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  h = 0;.  p->dela
28f80 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  y1 = 0;.  p->del
28f90 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ay2 = 0;.}.#endi
28fa0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
28fb0 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  _WIN./*.**      
28fc0 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20  lock_win32_file 
28fd0 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
28fe0 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74  DELAY2.**.** Get
28ff0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61   an exclusive ma
29000 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20  nditory lock on 
29010 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20  file for DELAY2 
29020 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a  milliseconds..**
29030 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c   Wait DELAY1 mil
29040 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
29050 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c   acquiring the l
29060 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
29070 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  nt win32_file_lo
29080 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ck(.  void * cli
29090 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
290a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
290b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
290c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
290d0 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73  [].){.  static s
290e0 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c  truct win32FileL
290f0 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e  ocker x = { "win
29100 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30  32_file_lock", 0
29110 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
29120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
29130 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20  ilename;.  char 
29140 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74  zBuf[200];.  int
29150 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41   retry = 0;.  HA
29160 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44  NDLE ev;.  DWORD
29170 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69   wResult;.  .  i
29180 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62  f( objc!=4 && ob
29190 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
291a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
291b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
291c0 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
291d0 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65  DELAY2");.    re
291e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
291f0 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
29200 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
29210 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29220 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
29230 64 20 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a  d %d %d %d %d",.
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72       x.ok, x.err
29260 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65  , x.delay1, x.de
29270 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20  lay2, x.h);.    
29280 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29290 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28  (interp, zBuf, (
292a0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
292b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d  turn TCL_OK;.  }
292c0 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26  .  while( x.h &&
292d0 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20   retry<30 ){.   
292e0 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c   retry++;.    Sl
292f0 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20  eep(100);.  }.  
29300 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54  if( x.h ){.    T
29310 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
29320 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20  interp, "busy", 
29330 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29340 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29350 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
29360 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29370 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78  erp, objv[2], &x
29380 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74 75 72  .delay1) ) retur
29390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
293a0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
293b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
293c0 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29  v[3], &x.delay2)
293d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
293e0 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  ROR;.  zFilename
293f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
29400 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68  (objv[1]);.  x.h
29410 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46   = CreateFile(zF
29420 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43  ilename, GENERIC
29430 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52  _READ|GENERIC_WR
29440 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
29450 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45     FILE_SHARE_RE
29460 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52  AD|FILE_SHARE_WR
29470 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57  ITE, 0, OPEN_ALW
29480 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AYS,.           
29490 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
294a0 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20  E_NORMAL, 0);.  
294b0 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20  if( !x.h ){.    
294c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
294d0 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
294e0 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a   open file: ", z
294f0 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a  Filename, (char*
29500 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
29510 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
29520 20 65 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e   ev = CreateEven
29530 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41  t(NULL, TRUE, FA
29540 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a  LSE, x.evName);.
29550 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20    if ( !ev ){.  
29560 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
29570 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
29580 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a  ot create event:
29590 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63   ", x.evName, (c
295a0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
295b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
295c0 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61   }.  _beginthrea
295d0 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63  d(win32_file_loc
295e0 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26  ker, 0, (void*)&
295f0 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a  x);.  Sleep(0);.
29600 20 20 69 66 20 28 20 28 77 52 65 73 75 6c 74 20    if ( (wResult 
29610 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  = WaitForSingleO
29620 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30 29  bject(ev, 10000)
29630 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30  )!=WAIT_OBJECT_0
29640 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
29650 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
29660 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78  zBuf), zBuf, "0x
29670 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20  %x", wResult);. 
29680 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
29690 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69  ult(interp, "wai
296a0 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75  t failed: ", zBu
296b0 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  f, (char*)0);.  
296c0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
296d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
296e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43  L_ERROR;.  }.  C
296f0 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
29700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65  .}../*.**      e
29720 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68  xists_win32_path
29730 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75   PATH.**.** Retu
29740 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  rns non-zero if 
29750 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
29760 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65  th exists, whose
29770 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
29780 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63   name.** may exc
29790 65 65 64 20 32 36 30 20 63 68 61 72 61 63 74 65  eed 260 characte
297a0 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
297b0 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
297c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
297d0 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
297e0 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  h(.  void *clien
297f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
29800 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
29810 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
29820 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
29830 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
29840 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29850 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29860 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48  , 1, objv, "PATH
29870 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
29880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29890 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
298a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
298b0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20  BooleanObj(.    
298c0 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75    GetFileAttribu
298d0 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69  tesW( Tcl_GetUni
298e0 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d  code(objv[1]))!=
298f0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
29900 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65  RIBUTES ));.  re
29910 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
29920 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f  /*.**      find_
29930 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45  win32_file PATTE
29940 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  RN.**.** Returns
29950 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69   a list of entri
29960 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72  es in a director
29970 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  y that match the
29980 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74 65   specified patte
29990 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c  rn,.** whose ful
299a0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
299b0 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
299c0 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
299d0 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
299e0 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f  th.** "\\?\"..*/
299f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
29a00 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76  2_find_file(.  v
29a10 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
29a20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29a30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
29a40 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
29a50 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
29a60 48 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65  HANDLE hFindFile
29a70 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
29a80 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32  E_VALUE;.  WIN32
29a90 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64  _FIND_DATAW find
29aa0 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  Data;.  Tcl_Obj 
29ab0 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52  *listObj;.  DWOR
29ac0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
29ad0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
29ae0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29af0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
29b00 6a 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a  jv, "PATTERN");.
29b10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29b20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e  RROR;.  }.  hFin
29b30 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73  dFile = FindFirs
29b40 74 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e  tFileW(Tcl_GetUn
29b50 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20  icode(objv[1]), 
29b60 26 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66  &findData);.  if
29b70 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56  ( hFindFile==INV
29b80 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
29b90 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  E ){.    Tcl_Set
29ba0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
29bb0 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
29bc0 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
29bd0 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
29be0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29bf0 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f    listObj = Tcl_
29c00 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
29c10 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73  IncrRefCount(lis
29c20 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20  tObj);.  do {.  
29c30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
29c40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
29c50 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f  p, listObj, Tcl_
29c60 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20  NewUnicodeObj(. 
29c70 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e         findData.
29c80 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b  cFileName, -1));
29c90 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
29ca0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
29cb0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54  terp, listObj, T
29cc0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
29cd0 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61  (.        findDa
29ce0 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  ta.dwFileAttribu
29cf0 74 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65  tes));.  } while
29d00 28 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28  ( FindNextFileW(
29d10 68 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64  hFindFile, &find
29d20 44 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45  Data) );.  lastE
29d30 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72  rrno = GetLastEr
29d40 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73  ror();.  if( las
29d50 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52  tErrno!=NO_ERROR
29d60 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
29d70 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c  RROR_NO_MORE_FIL
29d80 45 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c  ES ){.    FindCl
29d90 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
29da0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
29db0 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20  ount(listObj);. 
29dc0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
29dd0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
29de0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
29df0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
29e00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29e10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64  RROR;.  }.  Find
29e20 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29  Close(hFindFile)
29e30 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
29e40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  sult(interp, lis
29e50 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20  tObj);.  return 
29e60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
29e70 20 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e        delete_win
29e80 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45  32_file FILENAME
29e90 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74  .**.** Deletes t
29ea0 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
29eb0 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  e, whose fully q
29ec0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
29ed0 79 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20  y exceed 260.** 
29ee0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
29ef0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
29f00 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
29f10 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65  tic int win32_de
29f20 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69  lete_file(.  voi
29f30 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
29f40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29f50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
29f60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29f70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
29f80 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
29f90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
29fa0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29fb0 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a  v, "FILENAME");.
29fc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29fd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29fe0 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c  !DeleteFileW(Tcl
29ff0 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2a000 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c  [1])) ){.    Tcl
2a010 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2a020 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2a030 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2a040 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2a050 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a060 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
2a070 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2a080 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a090 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61  }../*.**      ma
2a0a0 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52  ke_win32_dir DIR
2a0b0 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65  ECTORY.**.** Cre
2a0c0 61 74 65 73 20 74 68 65 20 73 70 65 63 69 66 69  ates the specifi
2a0d0 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68  ed directory, wh
2a0e0 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2a0f0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
2a100 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61  eed 248.** chara
2a110 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
2a120 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
2a130 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2a140 6e 74 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a  nt win32_mkdir(.
2a150 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2a160 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2a170 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2a180 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2a190 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2a1a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2a1b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2a1c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2a1d0 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f  , objv, "DIRECTO
2a1e0 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RY");.    return
2a1f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a200 20 20 69 66 28 20 21 43 72 65 61 74 65 44 69 72    if( !CreateDir
2a210 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55  ectoryW(Tcl_GetU
2a220 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c  nicode(objv[1]),
2a230 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63   NULL) ){.    Tc
2a240 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a250 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2a260 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2a270 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2a280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2a290 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2a2a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2a2b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a2c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72  .}../*.**      r
2a2d0 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20  emove_win32_dir 
2a2e0 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20  DIRECTORY.**.** 
2a2f0 52 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63  Removes the spec
2a300 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c  ified directory,
2a310 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2a320 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2a330 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68  exceed 248.** ch
2a340 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2a350 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2a360 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2a370 63 20 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69  c int win32_rmdi
2a380 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  r(.  void *clien
2a390 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a3a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2a3b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2a3c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2a3d0 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
2a3e0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2a3f0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2a400 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45  , 1, objv, "DIRE
2a410 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74  CTORY");.    ret
2a420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a430 20 7d 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65   }.  if( !Remove
2a440 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47  DirectoryW(Tcl_G
2a450 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2a460 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2a470 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2a480 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2a490 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2a4a0 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2a4b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a4c0 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2a4d0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2a4e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2a4f0 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20  #endif.../*.**  
2a500 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e      optimization
2a510 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20  _control DB OPT 
2a520 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e  BOOLEAN.**.** En
2a530 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
2a540 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69  query optimizati
2a550 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73 71  ons using the sq
2a560 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2a570 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63  ol().** interfac
2a580 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20 42  e.  Disable if B
2a590 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20  OOLEAN is false 
2a5a0 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f  and enable if BO
2a5b0 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a  OLEAN is true..*
2a5c0 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d  * OPT is the nam
2a5d0 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  e of the optimiz
2a5e0 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61  ation to be disa
2a5f0 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bled..*/.static 
2a600 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  int optimization
2a610 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64  _control(.  void
2a620 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2a630 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a640 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a650 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a660 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
2a670 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
2a680 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
2a690 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e   *zOpt;.  int on
2a6a0 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20  off;.  int mask 
2a6b0 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  = 0;.  static co
2a6c0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
2a6d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
2a6e0 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d  tName;.    int m
2a6f0 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20  ask;.  } aOpt[] 
2a700 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c  = {.    { "all",
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20   SQLITE_AllOpts 
2a730 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2a740 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20  "none",         
2a750 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
2a760 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2a770 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61      { "query-fla
2a780 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c  ttener",     SQL
2a790 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e  ITE_QueryFlatten
2a7a0 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c  er },.    { "col
2a7b0 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20  umn-cache",     
2a7c0 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e     SQLITE_Column
2a7d0 43 61 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20  Cache    },.    
2a7e0 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72  { "groupby-order
2a7f0 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
2a800 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d  GroupByOrder   }
2a810 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d  ,.    { "factor-
2a820 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53  constants",    S
2a830 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
2a840 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64  onst },.    { "d
2a850 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20  istinct-opt",   
2a860 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74       SQLITE_Dist
2a870 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20  inctOpt    },.  
2a880 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73    { "cover-idx-s
2a890 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54  can",      SQLIT
2a8a0 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20  E_CoverIdxScan  
2a8b0 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72   },.    { "order
2a8c0 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20  -by-idx-join",  
2a8d0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
2a8e0 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20  dxJoin },.    { 
2a8f0 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20  "transitive",   
2a900 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72         SQLITE_Tr
2a910 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a  ansitive     },.
2a920 20 20 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d      { "subquery-
2a930 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c  coroutine",  SQL
2a940 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e  ITE_SubqCoroutin
2a950 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69  e  },.    { "omi
2a960 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20  t-noop-join",   
2a970 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f     SQLITE_OmitNo
2a980 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20  opJoin   },.    
2a990 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20 20 20  { "stat3",      
2a9a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2a9b0 53 74 61 74 33 20 20 20 20 20 20 20 20 20 20 7d  Stat3          }
2a9c0 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
2a9d0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
2a9e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2a9f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2aa00 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22 29  DB OPT BOOLEAN")
2aa10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2aa20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2aa30 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2aa40 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2aa50 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2aa60 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2aa70 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
2aa80 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
2aa90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2aaa0 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20 72  [3], &onoff) ) r
2aab0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2aac0 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65  .  zOpt = Tcl_Ge
2aad0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2aae0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2aaf0 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
2ab00 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b  of(aOpt[0]); i++
2ab10 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
2ab20 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d 2e  p(zOpt, aOpt[i].
2ab30 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  zOptName)==0 ){.
2ab40 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f 70        mask = aOp
2ab50 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20  t[i].mask;.     
2ab60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ab70 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29 20  }.  if( onoff ) 
2ab80 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20  mask = ~mask;.  
2ab90 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 4f  if( i>=sizeof(aO
2aba0 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b  pt)/sizeof(aOpt[
2abb0 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  0]) ){.    Tcl_A
2abc0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2abd0 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74  rp, "unknown opt
2abe0 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f 75  imization - shou
2abf0 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a  ld be one of:",.
2ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac10 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a       (char*)0);.
2ac20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
2ac30 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65  izeof(aOpt)/size
2ac40 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b  of(aOpt[0]); i++
2ac50 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2ac60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2ac70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a  , " ", aOpt[i].z
2ac80 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  OptName, (char*)
2ac90 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  0);.    }.    re
2aca0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2acb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74 65    }.  sqlite3_te
2acc0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2acd0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2ace0 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61  IZATIONS, db, ma
2acf0 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  sk);.  return TC
2ad00 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  L_OK;.}..typedef
2ad10 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
2ad20 61 70 69 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c  api_routines sql
2ad30 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2ad40 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61  s;./*.**     loa
2ad50 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69  d_static_extensi
2ad60 6f 6e 20 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a  on DB NAME ....*
2ad70 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72  *.** Load one or
2ad80 20 6d 6f 72 65 20 73 74 61 74 69 63 61 6c 6c 79   more statically
2ad90 20 6c 69 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f   linked extensio
2ada0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
2adb0 74 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63 45  t tclLoadStaticE
2adc0 78 74 65 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76  xtensionCmd(.  v
2add0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2ade0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2adf0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2ae00 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2ae10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2ae20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2ae30 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28  te3_amatch_init(
2ae40 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2ae50 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2ae60 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2ae70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ae80 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28  e3_closure_init(
2ae90 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2aea0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2aeb0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2aec0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2aed0 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73  e3_fuzzer_init(s
2aee0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2aef0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2af00 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2af10 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2af20 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c 69  3_ieee_init(sqli
2af30 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2af40 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2af50 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2af60 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e  rn int sqlite3_n
2af70 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71 6c  extchar_init(sql
2af80 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2af90 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2afa0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2afb0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2afc0 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28  percentile_init(
2afd0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2afe0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2aff0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b000 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b010 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 28 73  e3_regexp_init(s
2b020 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2b030 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2b040 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2b050 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b060 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28  3_spellfix_init(
2b070 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2b080 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2b090 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2b0a0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2b0b0 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28 73  e3_totype_init(s
2b0c0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2b0d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2b0e0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2b0f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b100 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2b110 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2b120 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2b130 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2b140 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2b150 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
2b160 73 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d  st char *zExtNam
2b170 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e  e;.    int (*pIn
2b180 69 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  it)(sqlite3*,cha
2b190 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2b1a0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2b1b0 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e  ;.  } aExtension
2b1c0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d  [] = {.    { "am
2b1d0 61 74 63 68 22 2c 20 20 20 20 20 20 20 20 20 20  atch",          
2b1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d        sqlite3_am
2b1f0 61 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20  atch_init       
2b200 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b210 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20   "closure",     
2b220 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b230 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20  3_closure_init  
2b240 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2b250 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
2b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b270 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2b280 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b290 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
2b2a0 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2b2b0 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
2b2c0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2b2d0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
2b2e0 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
2b2f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
2b300 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
2b310 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b320 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
2b330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b340 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
2b350 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2b360 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20     { "regexp",  
2b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2b380 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2b390 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2b3a0 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66  },.    { "spellf
2b3b0 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ix",            
2b3c0 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66    sqlite3_spellf
2b3d0 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ix_init         
2b3e0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f      },.    { "to
2b3f0 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
2b400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2b410 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20  type_init       
2b420 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b430 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20   "wholenumber", 
2b440 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b450 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2b460 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  it          },. 
2b470 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   };.  sqlite3 *d
2b480 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
2b490 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c  *zName;.  int i,
2b4a0 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a   j, rc;.  char *
2b4b0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2b4c0 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
2b4d0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2b4e0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2b4f0 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22  v, "DB NAME ..."
2b500 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b510 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2b520 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2b530 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2b540 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2b550 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2b560 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a  L_ERROR;.  for(j
2b570 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29  =2; j<objc; j++)
2b580 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  {.    zName = Tc
2b590 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2b5a0 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
2b5b0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2b5c0 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29  Extension); i++)
2b5d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2b5e0 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e  mp(zName, aExten
2b5f0 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65  sion[i].zExtName
2b600 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2b610 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41    }.    if( i>=A
2b620 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
2b630 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ion) ){.      Tc
2b640 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b650 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
2b660 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e  extension: ", zN
2b670 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2b680 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2b690 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2b6a0 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f    rc = aExtensio
2b6b0 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26  n[i].pInit(db, &
2b6c0 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
2b6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b6e0 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  OK || zErrMsg ){
2b6f0 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
2b700 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b710 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20  "initialization 
2b720 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66  of ", zName, " f
2b730 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73  ailed: ", zErrMs
2b740 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
2b750 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2b760 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
2b770 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2b780 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2b790 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2b7a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2b7b0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  _OK;.}.../*.** R
2b7c0 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73  egister commands
2b7d0 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e   with the TCL in
2b7e0 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e  terpreter..*/.in
2b7f0 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e  t Sqlitetest1_In
2b800 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
2b810 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e  nterp){.  extern
2b820 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61   int sqlite3_sea
2b830 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  rch_count;.  ext
2b840 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2b850 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65  found_count;.  e
2b860 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b870 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
2b880 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2b890 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
2b8a0 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  e_count;.  exter
2b8b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f  n int sqlite3_so
2b8c0 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  rt_count;.  exte
2b8d0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
2b8e0 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66  urrent_time;.#if
2b8f0 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
2b900 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2b910 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2b920 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2b930 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e  TYLE.  extern in
2b940 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  t sqlite3_hostid
2b950 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65  _num;.#endif.  e
2b960 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2b970 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a  3_max_blobsize;.
2b980 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2b990 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43  ite3BtreeSharedC
2b9a0 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64 2a  acheReport(void*
2b9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
2b9e0 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f  Interp*,int,Tcl_
2b9f0 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73  Obj*CONST*);.  s
2ba00 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20  tatic struct {. 
2ba10 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
2ba20 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f  .     Tcl_CmdPro
2ba30 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43  c *xProc;.  } aC
2ba40 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  md[] = {.     { 
2ba50 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20  "db_enter",     
2ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba70 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2ba80 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20 20  b_enter         
2ba90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2baa0 22 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20  "db_leave",     
2bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bac0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2bad0 62 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20 20  b_leave         
2bae0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2baf0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bb00 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2bb10 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bb20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
2bb30 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt    },.     { 
2bb40 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bb50 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
2bb60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bb70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
2bb80 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nt64  },.     { 
2bb90 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bba0 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 20  _long",         
2bbb0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bbc0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c  qlite3_mprintf_l
2bbd0 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  ong   },.     { 
2bbe0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bbf0 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
2bc00 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bc10 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bc20 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  tr    },.     { 
2bc30 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74  "sqlite3_snprint
2bc40 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  f_str",         
2bc50 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bc60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
2bc70 73 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  str   },.     { 
2bc80 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bc90 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20  _stronly",      
2bca0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bcb0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bcc0 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20  tronly},.     { 
2bcd0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bce0 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
2bcf0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bd00 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
2bd10 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20  ouble },.     { 
2bd20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bd30 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20  _scaled",       
2bd40 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2bd50 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
2bd60 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20  caled },.     { 
2bd70 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bd80 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28  _hexdouble",   (
2bd90 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
2bda0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
2bdb0 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20  double},.     { 
2bdc0 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
2bdd0 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _z_test",       
2bde0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2bdf0 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20  est_mprintf_z   
2be00 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2be10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2be20 6e 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  n_test",        
2be30 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2be40 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20  st_mprintf_n    
2be50 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2be60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f  qlite3_snprintf_
2be70 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 28  int",          (
2be80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2be90 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20  t_snprintf_int  
2bea0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2beb0 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
2bec0 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54  t_rowid",     (T
2bed0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2bee0 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20  _last_rowid     
2bef0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2bf00 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
2bf10 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
2bf20 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2bf30 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20  exec_printf     
2bf40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bf50 74 65 33 5f 65 78 65 63 5f 68 65 78 22 2c 20 20  te3_exec_hex",  
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2bf70 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
2bf80 78 65 63 5f 68 65 78 20 20 20 20 20 20 20 20 20  xec_hex         
2bf90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bfa0 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20  e3_exec",       
2bfb0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2bfc0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
2bfd0 65 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  ec             }
2bfe0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bff0 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20  3_exec_nr",     
2c000 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2c010 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2c020 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c  c_nr          },
2c030 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2c040 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20  OMIT_GET_TABLE. 
2c050 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
2c060 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22  et_table_printf"
2c070 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2c080 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61  roc*)test_get_ta
2c090 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65  ble_printf },.#e
2c0a0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
2c0b0 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20  ite3_close",    
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2c0d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2c0e0 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20  e_test_close    
2c0f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c100 74 65 33 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20  te3_close_v2",  
2c110 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2c120 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2c130 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20  _test_close_v2  
2c140 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c150 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
2c160 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  on",       (Tcl_
2c170 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
2c180 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d  eate_function  }
2c190 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c1a0 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
2c1b0 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43  te",      (Tcl_C
2c1c0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
2c1d0 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c  ate_aggregate },
2c1e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2c1f0 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
2c200 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d  nction", (Tcl_Cm
2c210 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69  dProc*)test_regi
2c220 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a  ster_func    },.
2c230 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61       { "sqlite_a
2c240 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20  bort",          
2c250 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2c260 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f  Proc*)sqlite_abo
2c270 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  rt          },. 
2c280 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69      { "sqlite_bi
2c290 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nd",            
2c2a0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2c2b0 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20  roc*)test_bind  
2c2c0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c2d0 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74     { "breakpoint
2c2e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c2f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2c300 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f  oc*)test_breakpo
2c310 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  int       },.   
2c320 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79    { "sqlite3_key
2c330 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c340 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2c350 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20  c*)test_key     
2c360 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2c370 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65   { "sqlite3_reke
2c380 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
2c390 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2c3a0 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20  *)test_rekey    
2c3b0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2c3c0 7b 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  { "sqlite_set_ma
2c3d0 67 69 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  gic",           
2c3e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2c3f0 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69  )sqlite_set_magi
2c400 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  c      },.     {
2c410 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72   "sqlite3_interr
2c420 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  upt",           
2c430 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2c440 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20  test_interrupt  
2c450 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2c460 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66  "sqlite_delete_f
2c470 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
2c480 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
2c490 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  elete_function  
2c4a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2c4b0 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
2c4c0 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  llation",       
2c4d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65  (Tcl_CmdProc*)de
2c4e0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20  lete_collation  
2c4f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2c500 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
2c510 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28  ommit",        (
2c520 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74  Tcl_CmdProc*)get
2c530 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20  _autocommit     
2c540 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2c550 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64  lite3_stack_used
2c560 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ",            (T
2c570 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2c580 5f 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20  _stack_used     
2c590 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2c5a0 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
2c5b0 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  t",          (Tc
2c5c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2c5d0 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20  busy_timeout    
2c5e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e   },.     { "prin
2c5f0 74 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  tf",            
2c600 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2c610 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70  _CmdProc*)test_p
2c620 72 69 6e 74 66 20 20 20 20 20 20 20 20 20 20 20  rintf           
2c630 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c640 65 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20  e3IoTrace",     
2c650 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2c660 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74  dProc*)test_io_t
2c670 72 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a  race         },.
2c680 20 20 20 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61       { "clang_sa
2c690 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73 22 2c  nitize_address",
2c6a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2c6b0 50 72 6f 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69  Proc*)clang_sani
2c6c0 74 69 7a 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a  tize_address },.
2c6d0 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74    };.  static st
2c6e0 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
2c6f0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63   *zName;.     Tc
2c700 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50  l_ObjCmdProc *xP
2c710 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a  roc;.     void *
2c720 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20  clientData;.  } 
2c730 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20  aObjCmd[] = {.  
2c740 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2c750 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
2c760 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65  ",    get_sqlite
2c770 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20  _pointer, 0 },. 
2c780 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2c790 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ind_int",       
2c7a0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2c7b0 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a  _int,      0 },.
2c7c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c7d0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20  bind_zeroblob", 
2c7e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2c7f0 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c  d_zeroblob, 0 },
2c800 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c810 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
2c820 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2c830 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
2c840 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c850 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
2c860 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2c870 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
2c880 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c890 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
2c8a0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2c8b0 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
2c8c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c8d0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
2c8e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2c8f0 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
2c900 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2c910 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
2c920 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2c930 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
2c940 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2c950 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
2c960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
2c970 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
2c980 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2c990 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
2c9a0 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74  meter_count",  t
2c9b0 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
2c9c0 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20  er_count, 0},.  
2c9d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2c9e0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
2c9f0 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f  e",   test_bind_
2ca00 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20  parameter_name, 
2ca10 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2ca20 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
2ca30 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73  ter_index",  tes
2ca40 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
2ca50 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20  _index, 0},.    
2ca60 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61   { "sqlite3_clea
2ca70 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
2ca80 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62      test_clear_b
2ca90 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20  indings, 0},.   
2caa0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65    { "sqlite3_sle
2cab0 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
2cac0 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c       test_sleep,
2cad0 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20            0},.  
2cae0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2caf0 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  rcode",         
2cb00 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f        test_errco
2cb10 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  de       ,0 },. 
2cb20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2cb30 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22  xtended_errcode"
2cb40 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65  ,      test_ex_e
2cb50 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a  rrcode    ,0 },.
2cb60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cb70 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
2cb80 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
2cb90 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
2cba0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cbb0 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
2cbc0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
2cbd0 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
2cbe0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2cbf0 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
2cc00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
2cc10 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
2cc20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2cc30 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
2cc40 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2cc50 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
2cc60 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2cc70 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20  te3_open_v2",   
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2cc90 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c  _open_v2       ,
2cca0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2ccb0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22  ite3_complete16"
2ccc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
2ccd0 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20  t_complete16    
2cce0 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
2ccf0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c  qlite3_prepare",
2cd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2cd10 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20  est_prepare     
2cd20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2cd30 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
2cd40 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
2cd50 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20  test_prepare16  
2cd60 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
2cd70 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2cd80 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
2cd90 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
2cda0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2cdb0 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
2cdc0 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20  e_tkt3134",     
2cdd0 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74    test_prepare_t
2cde0 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20  kt3134, 0},.    
2cdf0 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
2ce00 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20  are16_v2",      
2ce10 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
2ce20 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20  16_v2  ,0 },.   
2ce30 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
2ce40 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
2ce50 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
2ce60 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
2ce70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
2ce80 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20  mt_status",     
2ce90 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
2cea0 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20  status   ,0 },. 
2ceb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
2cec0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
2ced0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
2cee0 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
2cef0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cf00 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
2cf10 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
2cf20 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
2cf30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cf40 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
2cf50 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
2cf60 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
2cf70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2cf80 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
2cf90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2cfa0 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
2cfb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2cfc0 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
2cfd0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2cfe0 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
2cff0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d000 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20  te3_sql",       
2d010 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2d020 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c  _sql           ,
2d030 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2d040 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c  ite3_next_stmt",
2d050 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2d060 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20  t_next_stmt     
2d070 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2d080 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
2d090 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74 65  nly",         te
2d0a0 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  st_stmt_readonly
2d0b0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2d0c0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
2d0d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
2d0e0 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20  est_stmt_busy   
2d0f0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
2d100 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
2d110 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
2d120 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
2d130 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20  l ,0 },..     { 
2d140 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65  "sqlite3_release
2d150 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20  _memory",       
2d160 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
2d170 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20  mory,     0},.  
2d180 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
2d190 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
2d1a0 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65  ,     test_db_re
2d1b0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30  lease_memory,  0
2d1c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2d1d0 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c  e3_db_filename",
2d1e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2d1f0 64 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20  db_filename,    
2d200 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
2d210 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
2d220 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  nly",           
2d230 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  test_db_readonly
2d240 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
2d250 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66    { "sqlite3_sof
2d260 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20  t_heap_limit",  
2d270 20 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68       test_soft_h
2d280 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d  eap_limit,    0}
2d290 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d2a0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
2d2b0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74  ",        test_t
2d2c0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20  hread_cleanup,  
2d2d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2d2e0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66  qlite3_pager_ref
2d2f0 63 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74  counts",       t
2d300 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  est_pager_refcou
2d310 6e 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20  nts,    0},..   
2d320 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61    { "sqlite3_loa
2d330 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20  d_extension",   
2d340 20 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65       test_load_e
2d350 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d  xtension,     0}
2d360 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d370 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
2d380 74 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65  tension", test_e
2d390 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20  nable_load,     
2d3a0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
2d3b0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
2d3c0 72 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74  result_codes", t
2d3d0 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
2d3e0 75 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20  ult_codes, 0},. 
2d3f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
2d400 69 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20  imit",          
2d410 20 20 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69         test_limi
2d420 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
2d430 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
2d440 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  save_prng_state"
2d450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d460 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  save_prng_state,
2d470 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
2d480 22 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74  "restore_prng_st
2d490 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
2d4a0 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74   restore_prng_st
2d4b0 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ate, 0 },.     {
2d4c0 20 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61   "reset_prng_sta
2d4d0 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
2d4e0 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
2d4f0 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  te,   0 },.     
2d500 7b 20 22 64 61 74 61 62 61 73 65 5f 6e 65 76 65  { "database_neve
2d510 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  r_corrupt",     
2d520 20 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65     database_neve
2d530 72 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  r_corrupt, 0},. 
2d540 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f      { "database_
2d550 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c  may_be_corrupt",
2d560 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 5f         database_
2d570 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20  may_be_corrupt, 
2d580 30 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69  0},.     { "opti
2d590 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2d5a0 22 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74 69  ",          opti
2d5b0 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
2d5c0 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f  ,0},.#if SQLITE_
2d5d0 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c  OS_WIN.     { "l
2d5e0 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ock_win32_file",
2d5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
2d600 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20  in32_file_lock, 
2d610 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2d620 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74  exists_win32_pat
2d630 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2d640 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
2d650 68 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  h,  0 },.     { 
2d660 22 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65  "find_win32_file
2d670 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d680 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65   win32_find_file
2d690 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
2d6a0 20 22 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66   "delete_win32_f
2d6b0 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
2d6c0 20 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66    win32_delete_f
2d6d0 69 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20  ile,  0 },.     
2d6e0 7b 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69  { "make_win32_di
2d6f0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2d700 20 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20     win32_mkdir, 
2d710 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
2d720 20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32   { "remove_win32
2d730 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20 20  _dir",          
2d740 20 20 20 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c      win32_rmdir,
2d750 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
2d760 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f  dif.     { "tcl_
2d770 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20  objproc",       
2d780 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41              runA
2d790 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20  sObjProc,       
2d7a0 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71  0 },..     /* sq
2d7b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29  lite3_column_*()
2d7c0 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22   API */.     { "
2d7d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2d7e0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
2d7f0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
2d800 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  t  ,0 },.     { 
2d810 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f  "sqlite3_data_co
2d820 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  unt",           
2d830 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74   test_data_count
2d840 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2d850 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
2d860 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20  _type",         
2d870 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79    test_column_ty
2d880 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  pe   ,0 },.     
2d890 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2d8a0 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  n_blob",        
2d8b0 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62     test_column_b
2d8c0 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  lob   ,0 },.    
2d8d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2d8e0 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20  mn_double",     
2d8f0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
2d900 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20  double ,0 },.   
2d910 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d920 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20  umn_int64",     
2d930 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
2d940 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20  _int64  ,0 },.  
2d950 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2d960 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65  lumn_text",   te
2d970 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
2d980 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
2d990 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20  lumn_text },.   
2d9a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
2d9b0 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  umn_name",   tes
2d9c0 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
2d9d0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2d9e0 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20  umn_name },.    
2d9f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2da00 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74  mn_int",    test
2da10 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
2da20 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
2da30 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20  mn_int  },.     
2da40 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2da50 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f  n_bytes",  test_
2da60 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
2da70 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2da80 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65  n_bytes},.#ifnde
2da90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
2daa0 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73  CLTYPE.     { "s
2dab0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
2dac0 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d  cltype",test_stm
2dad0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2dae0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
2daf0 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23  ltype},.#endif.#
2db00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2db10 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
2db20 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  ATA.{ "sqlite3_c
2db30 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
2db40 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
2db50 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
2db60 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2db70 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  se_name},.{ "sql
2db80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
2db90 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  e_name",test_stm
2dba0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
2dbb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
2dbc0 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c  le_name},.{ "sql
2dbd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
2dbe0 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  in_name",test_st
2dbf0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
2dc00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
2dc10 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64  igin_name},.#end
2dc20 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2dc30 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
2dc40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2dc50 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74  lumn_bytes16", t
2dc60 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76  est_stmt_int, (v
2dc70 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
2dc80 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20  umn_bytes16 },. 
2dc90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2dca0 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20  olumn_text16",  
2dcb0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
2dcc0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2dcd0 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a  column_text16},.
2dce0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dcf0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20  column_name16", 
2dd00 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
2dd10 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2dd20 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c  _column_name16},
2dd30 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69  .     { "add_ali
2dd40 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2dd50 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69  ations", add_ali
2dd60 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c  gnment_test_coll
2dd70 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d  ations, 0      }
2dd80 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
2dd90 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20  _OMIT_DECLTYPE. 
2dda0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2ddb0 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
2ddc0 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  ",test_stmt_utf1
2ddd0 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  6,(void*)sqlite3
2dde0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
2ddf0 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  16},.#endif.#ifd
2de00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2de10 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
2de20 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
2de30 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
2de40 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f  6",.  test_stmt_
2de50 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2de60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
2de70 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  abase_name16},.{
2de80 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2de90 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74  table_name16", t
2dea0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
2deb0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2dec0 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
2ded0 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63  16},.{"sqlite3_c
2dee0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
2def0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
2df00 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
2df10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
2df20 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e  gin_name16},.#en
2df30 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  dif.#endif.     
2df40 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2df50 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c  e_collation_v2",
2df60 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c   test_create_col
2df70 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  lation_v2, 0 },.
2df80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2df90 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c  global_recover",
2dfa0 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c       test_global
2dfb0 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c  _recover, 0   },
2dfc0 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67  .     { "working
2dfd0 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20  _64bit_int",    
2dfe0 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34        working_64
2dff0 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d  bit_int,   0   }
2e000 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e  ,.     { "vfs_un
2e010 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20  link_test",     
2e020 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e         vfs_unlin
2e030 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20  k_test,     0   
2e040 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69  },.     { "vfs_i
2e050 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20  nitfail_test",  
2e060 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74          vfs_init
2e070 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  fail_test,   0  
2e080 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
2e090 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  unregister_all",
2e0a0 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72           vfs_unr
2e0b0 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
2e0c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
2e0d0 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _reregister_all"
2e0e0 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65  ,         vfs_re
2e0f0 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
2e100 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2e110 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22  le_control_test"
2e120 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f  ,          file_
2e130 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20  control_test,   
2e140 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2e150 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
2e160 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c  errno_test", fil
2e170 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
2e180 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  rno_test,  0   }
2e190 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2e1a0 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
2e1b0 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
2e1c0 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
2e1d0 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
2e1e0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2e1f0 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
2e200 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
2e210 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20  chunksize_test, 
2e220 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e230 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
2e240 65 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66 69  ehint_test",  fi
2e250 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
2e260 69 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20 20  int_test,   0   
2e270 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2e280 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76  control_win32_av
2e290 5f 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f  _retry", file_co
2e2a0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72  ntrol_win32_av_r
2e2b0 65 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20  etry,  0   },.  
2e2c0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
2e2d0 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c  ol_persist_wal",
2e2e0 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
2e2f0 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20  _persist_wal,   
2e300 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2e310 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f  "file_control_po
2e320 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
2e330 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  e",file_control_
2e340 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
2e350 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ite,0},.     { "
2e360 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
2e370 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69  name",        fi
2e380 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
2e390 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20  me,         0   
2e3a0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
2e3b0 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
2e3c0 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f  name",   file_co
2e3d0 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
2e3e0 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  me,    0   },.  
2e3f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66     { "sqlite3_vf
2e400 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20  s_list",        
2e410 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20     vfs_list,    
2e420 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2e430 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2e440 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  unction_v2", tes
2e450 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
2e460 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20  n_v2, 0 },..    
2e470 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72   /* Functions fr
2e480 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64  om os.h */.#ifnd
2e490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
2e4a0 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64  TF16.     { "add
2e4b0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  _test_collate", 
2e4c0 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c         test_coll
2e4d0 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20  ate, 0          
2e4e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
2e4f0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
2e500 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c  eded", test_coll
2e510 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20  ate_needed, 0   
2e520 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
2e530 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
2e540 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63         test_func
2e550 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20  tion, 0         
2e560 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
2e570 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74   { "sqlite3_test
2e580 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65  _errstr",     te
2e590 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20  st_errstr, 0    
2e5a0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2e5b0 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65   { "tcl_variable
2e5c0 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63  _type",       tc
2e5d0 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c  l_variable_type,
2e5e0 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e   0       },.#ifn
2e5f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e600 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
2e610 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
2e620 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
2e630 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73  ", test_enable_s
2e640 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20  hared, 0  },.   
2e650 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61    { "sqlite3_sha
2e660 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74  red_cache_report
2e670 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ", sqlite3BtreeS
2e680 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74  haredCacheReport
2e690 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  , 0},.#endif.   
2e6a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62    { "sqlite3_lib
2e6b0 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c  version_number",
2e6c0 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e   test_libversion
2e6d0 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23  _number, 0  },.#
2e6e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2e6f0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
2e700 41 54 41 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  ATA.     { "sqli
2e710 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
2e720 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74  _metadata", test
2e730 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
2e740 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65  tadata, 0  },.#e
2e750 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
2e760 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
2e770 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  B.     { "sqlite
2e780 33 5f 62 6c 6f 62 5f 72 65 61 64 22 2c 20 20 20  3_blob_read",   
2e790 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20  test_blob_read, 
2e7a0 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
2e7b0 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65  lite3_blob_write
2e7c0 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72  ",  test_blob_wr
2e7d0 69 74 65 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  ite, 0  },.     
2e7e0 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
2e7f0 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c  reopen", test_bl
2e800 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c  ob_reopen, 0  },
2e810 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2e820 5f 62 6c 6f 62 5f 62 79 74 65 73 22 2c 20 20 74  _blob_bytes",  t
2e830 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 2c 20  est_blob_bytes, 
2e840 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
2e850 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65  lite3_blob_close
2e860 22 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c  ",  test_blob_cl
2e870 6f 73 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ose, 0  },.#endi
2e880 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65  f.     { "pcache
2e890 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74  _stats",       t
2e8a0 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
2e8b0 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53  , 0  },.#ifdef S
2e8c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
2e8d0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20  OCK_NOTIFY.     
2e8e0 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  { "sqlite3_unloc
2e8f0 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f  k_notify", test_
2e900 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30  unlock_notify, 0
2e910 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
2e920 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
2e930 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74  checkpoint",   t
2e940 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
2e950 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  nt, 0  },.     {
2e960 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   "sqlite3_wal_ch
2e970 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73  eckpoint_v2",tes
2e980 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
2e990 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  _v2, 0  },.     
2e9a0 7b 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  { "test_sqlite3_
2e9b0 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65  log",         te
2e9c0 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20  st_sqlite3_log, 
2e9d0 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  0  },.#ifndef SQ
2e9e0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
2e9f0 4e 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f  N.     { "print_
2ea00 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c  explain_query_pl
2ea10 61 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f  an", test_print_
2ea20 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  eqp, 0  },.#endi
2ea30 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2ea40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c  3_test_control",
2ea50 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
2ea60 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45  ol },.#if SQLITE
2ea70 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20  _OS_UNIX.     { 
2ea80 22 67 65 74 72 75 73 61 67 65 22 2c 20 74 65 73  "getrusage", tes
2ea90 74 5f 67 65 74 72 75 73 61 67 65 20 7d 2c 0a 23  t_getrusage },.#
2eaa0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f  endif.     { "lo
2eab0 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
2eac0 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61  ion", tclLoadSta
2ead0 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20  ticExtensionCmd 
2eae0 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63  },.  };.  static
2eaf0 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a   int bitmask_siz
2eb00 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  e = sizeof(Bitma
2eb10 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a  sk)*8;.  int i;.
2eb20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2eb30 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
2eb40 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
2eb50 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  c_count;.  exter
2eb60 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  n int sqlite3_op
2eb70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20  entemp_count;.  
2eb80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2eb90 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20  e3_like_count;. 
2eba0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2ebb0 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
2ebc0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2ebd0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
2ebe0 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  addb_count;.  ex
2ebf0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2ec00 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
2ec10 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2ec20 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
2ec30 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23  _writej_count;.#
2ec40 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2ec50 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2ec60 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23  lite3_os_type;.#
2ec70 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
2ec80 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65  ITE_DEBUG.  exte
2ec90 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68  rn int sqlite3Wh
2eca0 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65  ereTrace;.  exte
2ecb0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53  rn int sqlite3OS
2ecc0 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
2ecd0 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72  int sqlite3WalTr
2ece0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ace;.#endif.#ifd
2ecf0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
2ed00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ed10 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72  BLE_FTS3.  exter
2ed20 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74  n int sqlite3_ft
2ed30 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
2ed40 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65  heses;.#endif.#e
2ed50 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ndif..  for(i=0;
2ed60 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f   i<sizeof(aCmd)/
2ed70 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b  sizeof(aCmd[0]);
2ed80 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
2ed90 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
2eda0 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61  erp, aCmd[i].zNa
2edb0 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f  me, aCmd[i].xPro
2edc0 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  c, 0, 0);.  }.  
2edd0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2ede0 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f  f(aObjCmd)/sizeo
2edf0 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69  f(aObjCmd[0]); i
2ee00 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65  ++){.    Tcl_Cre
2ee10 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
2ee20 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  terp, aObjCmd[i]
2ee30 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20  .zName, .       
2ee40 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f   aObjCmd[i].xPro
2ee50 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c  c, aObjCmd[i].cl
2ee60 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20  ientData, 0);.  
2ee70 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  }.  Tcl_LinkVar(
2ee80 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ee90 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a  search_count", .
2eea0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2eeb0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
2eec0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
2eed0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2eee0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2eef0 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a  _found_count", .
2ef00 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2ef10 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
2ef20 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2ef30 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2ef40 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2ef50 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  sort_count", .  
2ef60 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2ef70 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20  te3_sort_count, 
2ef80 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2ef90 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2efa0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61  erp, "sqlite3_ma
2efb0 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20  x_blobsize", .  
2efc0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2efd0 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
2efe0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2eff0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2f000 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
2f010 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ike_count", .   
2f020 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2f030 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54  e3_like_count, T
2f040 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2f050 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2f060 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74 65  rp, "sqlite_inte
2f070 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  rrupt_count", . 
2f080 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2f090 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
2f0a0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2f0b0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2f0c0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f0d0 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  te_open_file_cou
2f0e0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
2f0f0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
2f100 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c  _file_count, TCL
2f110 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2f120 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f130 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  , "sqlite_curren
2f140 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20 20  t_time", .      
2f150 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2f160 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43  current_time, TC
2f170 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
2f180 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20   SQLITE_OS_UNIX 
2f190 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2f1a0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2f1b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2f1c0 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TYLE.  Tcl_LinkV
2f1d0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f1e0 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20  te_hostid_num", 
2f1f0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2f200 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2f210 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  m, TCL_LINK_INT)
2f220 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
2f230 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f240 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
2f250 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
2f260 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78 66  har*)&sqlite3_xf
2f270 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  eropt_count, TCL
2f280 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2f290 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2f2a0 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
2f2b0 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a  _readdb_count",.
2f2c0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f2d0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
2f2e0 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
2f2f0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2f300 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f310 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2f320 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20  itedb_count",.  
2f330 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2f340 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
2f350 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  b_count, TCL_LIN
2f360 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2f370 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2f380 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
2f390 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  tej_count",.    
2f3a0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2f3b0 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2f3c0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
2f3d0 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
2f3e0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
2f3f0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2f400 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f  erp, "unaligned_
2f410 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c  string_counter",
2f420 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 75  .      (char*)&u
2f430 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
2f440 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e  counter, TCL_LIN
2f450 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
2f460 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f470 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c  IT_UTF16.  Tcl_L
2f480 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f490 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64  sqlite_last_need
2f4a0 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20  ed_collation",. 
2f4b0 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a 4e       (char*)&pzN
2f4c0 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20  eededCollation, 
2f4d0 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c  TCL_LINK_STRING|
2f4e0 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
2f4f0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  LY);.#endif.#if 
2f500 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
2f510 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2f520 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
2f530 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ype",.      (cha
2f540 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  r*)&sqlite3_os_t
2f550 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ype, TCL_LINK_IN
2f560 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  T);.#endif.#ifde
2f570 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2f580 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
2f590 73 74 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70  st char *query_p
2f5a0 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f 4c  lan = "*** OBSOL
2f5b0 45 54 45 20 56 41 52 49 41 42 4c 45 20 2a 2a 2a  ETE VARIABLE ***
2f5c0 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 6e 6b 56  ";.    Tcl_LinkV
2f5d0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f5e0 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a  te_query_plan",.
2f5f0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 71         (char*)&q
2f600 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c  uery_plan, TCL_L
2f610 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c  INK_STRING|TCL_L
2f620 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
2f630 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
2f640 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2f650 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2f660 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65  erp, "sqlite_whe
2f670 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  re_trace",.     
2f680 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2f690 57 68 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f  WhereTrace, TCL_
2f6a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
2f6b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
2f6c0 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63   "sqlite_os_trac
2f6d0 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
2f6e0 29 26 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65  )&sqlite3OSTrace
2f6f0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f700 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f710 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c  OMIT_WAL.  Tcl_L
2f720 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2f730 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65  sqlite_wal_trace
2f740 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2f750 26 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65  &sqlite3WalTrace
2f760 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2f770 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23  .#endif.#endif.#
2f780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2f790 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f  IT_DISKIO.  Tcl_
2f7a0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2f7b0 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70  "sqlite_opentemp
2f7c0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
2f7d0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
2f7e0 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54  pentemp_count, T
2f7f0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2f800 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  ndif.  Tcl_LinkV
2f810 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2f820 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
2f830 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68  alue",.      (ch
2f840 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
2f850 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54  ic_bind_value, T
2f860 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
2f870 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2f880 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
2f890 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
2f8a0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2f8b0 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  &sqlite_static_b
2f8c0 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c  ind_nbyte, TCL_L
2f8d0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
2f8e0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
2f8f0 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72  "sqlite_temp_dir
2f900 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28  ectory",.      (
2f910 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74  char*)&sqlite3_t
2f920 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54  emp_directory, T
2f930 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
2f940 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
2f950 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 64  nterp, "sqlite_d
2f960 61 74 61 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  ata_directory",.
2f970 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f980 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2f990 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
2f9a0 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
2f9b0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62  nkVar(interp, "b
2f9c0 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20  itmask_size",.  
2f9d0 20 20 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d      (char*)&bitm
2f9e0 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  ask_size, TCL_LI
2f9f0 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f  NK_INT|TCL_LINK_
2fa00 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63  READ_ONLY);.  Tc
2fa10 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2fa20 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63  , "sqlite_sync_c
2fa30 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2fa40 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e  ar*)&sqlite3_syn
2fa50 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
2fa60 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
2fa70 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2fa80 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63  qlite_fullsync_c
2fa90 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
2faa0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c  ar*)&sqlite3_ful
2fab0 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  lsync_count, TCL
2fac0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20  _LINK_INT);.#if 
2fad0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2fae0 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64  NABLE_FTS3) && d
2faf0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2fb00 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  ST).  Tcl_LinkVa
2fb10 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
2fb20 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  e_fts3_enable_pa
2fb30 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20  rentheses",.    
2fb40 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2fb50 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
2fb60 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c  rentheses, TCL_L
2fb70 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
2fb80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2fb90 3b 0a 7d 0a                                      ;.}.