/ Hex Artifact Content
Login

Artifact 5890094c09691fe9564cf0f0d5b22d35b3218c47:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0a00: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0a10: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
0a20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a30: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a40: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a50: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a60: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a70: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a90: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0aa0: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0ab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0ac0: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0ad0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ae0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0b00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
0b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
0b20: 2a 20 44 65 63 6f 64 65 20 61 20 57 69 6e 33 32  * Decode a Win32
0b30: 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63 74 2e 0a   HANDLE object..
0b40: 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e 33 32 48  */.int getWin32H
0b50: 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  andle(Tcl_Interp
0b60: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
0b70: 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48 41 4e 44  char *zA, LPHAND
0b80: 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20 20 2a 70  LE phFile){.  *p
0b90: 68 46 69 6c 65 20 3d 20 28 48 41 4e 44 4c 45 29  hFile = (HANDLE)
0ba0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bb0: 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75  oPtr(zA);.  retu
0bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
0bd0: 64 69 66 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73  dif..extern cons
0be0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
0bf0: 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 23 64 65  rrName(int);.#de
0c00: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
0c10: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 0a   sqlite3ErrName.
0c20: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0c30: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20  n sqlite3_stmt* 
0c40: 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a  into an sqlite3*
0c50: 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20  .  This depends 
0c60: 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74  on the.** fact t
0c70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a  hat the sqlite3*
0c80: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
0c90: 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20  eld in the Vdbe 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64  structure..*/.#d
0cb0: 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58  efine StmtToDb(X
0cc0: 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  )   sqlite3_db_h
0cd0: 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20  andle(X)../*.** 
0ce0: 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76  Check a return v
0cf0: 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  alue to make sur
0d00: 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74 68  e it agrees with
0d10: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
0d20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
0d30: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
0d40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0d50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0d60: 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  rp, sqlite3 *db,
0d70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20   int rc){.  if( 
0d80: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0d90: 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d 53  fe()==0 && rc!=S
0da0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20  QLITE_MISUSE && 
0db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc!=SQLITE_OK.  
0dc0: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
0dd0: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
0de0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
0df0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
0e00: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e10: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
0e20: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
0e30: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
0e40: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
0e50: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
0e60: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
0e70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
0e80: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
0e90: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
0ea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
0ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ed0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
0ee0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0ef0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0f00: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0f10: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
0f20: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
0f30: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0f40: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
0f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f60: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
0f70: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
0f80: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
0f90: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
0fa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
0fb0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
0fc0: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
0fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0fe0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74  .** Generate a t
0ff0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
1000: 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  on of a pointer 
1010: 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65  that can be unde
1020: 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65  rstood.** by the
1030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e   getDbPointer an
1040: 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72  d getVmPointer r
1050: 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a  outines above..*
1060: 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d  *.** The problem
1070: 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63   is, on some mac
1080: 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20  hines (Solaris) 
1090: 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e  if you do a prin
10a0: 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20  tf with.** "%p" 
10b0: 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20  you cannot turn 
10c0: 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20  around and do a 
10d0: 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73  scanf with the s
10e0: 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20  ame "%p" and.** 
10f0: 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72  get your pointer
1100: 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65   back.  You have
1110: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30   to prepend a "0
1120: 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c  x" before it wil
1130: 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61  l.** work.  Or a
1140: 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20  t least that is 
1150: 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64  what is reported
1160: 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42   to me (drh).  B
1170: 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76  ut this.** behav
1180: 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20  ior varies from 
1190: 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69  machine to machi
11a0: 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f  ne.  The solutio
11b0: 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a  n used her is.**
11c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72   to test the str
11d0: 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20  ing right after 
11e0: 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  it is generated 
11f0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
1200: 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f   be.** understoo
1210: 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20  d by scanf, and 
1220: 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70  if not, try prep
1230: 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74  ending an "0x" t
1240: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74  o see if.** that
1250: 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68   helps.  If noth
1260: 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74  ing works, a fat
1270: 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  al error is gene
1280: 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rated..*/.int sq
1290: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
14c0: 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63  he I/O tracing c
14d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  allback..*/.#if 
14e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
1500: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1510: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74  ABLE_IOTRACE).st
1520: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
1530: 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61  ce_file = 0;.sta
1540: 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63  tic void io_trac
1550: 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  e_callback(const
1560: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1570: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1580: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
15a0: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f  fprintf(iotrace_
15b0: 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  file, zFormat, a
15c0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
15d0: 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61  ;.  fflush(iotra
15e0: 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ce_file);.}.#end
15f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
1600: 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e    io_trace FILEN
1610: 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49  AME.**.** Turn I
1620: 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  /O tracing on or
1630: 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41   off.  If FILENA
1640: 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70  ME is not an emp
1650: 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f  ty string,.** I/
1660: 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73  O tracing begins
1670: 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45   going into FILE
1680: 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d  NAME. If FILENAM
1690: 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a  E is an empty.**
16a0: 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61   string, I/O tra
16b0: 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
16c0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
16d0: 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28  t test_io_trace(
16e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1700: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1710: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1720: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1730: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1740: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1760: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1770: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1790: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  ent */.){.#if !d
17b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17c0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
17d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17e0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66  LE_IOTRACE).  if
17f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1810: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1820: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1830: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1840: 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49 4c  .          " FIL
1850: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1870: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f  OR;.  }.  if( io
1880: 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20  trace_file ){.  
1890: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18a0: 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f  le!=stdout && io
18b0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65  trace_file!=stde
18c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  rr ){.      fclo
18d0: 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29  se(iotrace_file)
18e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72  ;.    }.    iotr
18f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  ace_file = 0;.  
1900: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
1910: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1920: 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20  argv[1][0] ){.  
1930: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1940: 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d  v[1],"stdout")==
1950: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
1960: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74  ce_file = stdout
1970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1980: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1990: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
19a0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
19b0: 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20  e = stderr;.    
19c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
19d0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65  race_file = fope
19e0: 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b  n(argv[1], "w");
19f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a00: 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74  e3IoTrace = io_t
1a10: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61 6e  .** Usage:  clan
1a50: 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
1a60: 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ss .**.** Return
1a70: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
1a80: 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69 6c  ogram was compil
1a90: 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20 77  ed using clang w
1aa0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73 61  ith the .** -fsa
1ab0: 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20 73  nitize=address s
1ac0: 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f 6d  witch on the com
1ad0: 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73 65  mand line. False
1ae0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1af0: 74 61 74 69 63 20 69 6e 74 20 63 6c 61 6e 67 5f  tatic int clang_
1b00: 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
1b10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1b20: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1b30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b70: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1bd0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1be0: 20 72 65 73 20 3d 20 30 3b 0a 23 69 66 20 64 65   res = 0;.#if de
1bf0: 66 69 6e 65 64 28 5f 5f 68 61 73 5f 66 65 61 74  fined(__has_feat
1c00: 75 72 65 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f  ure).# if __has_
1c10: 66 65 61 74 75 72 65 28 61 64 64 72 65 73 73 5f  feature(address_
1c20: 73 61 6e 69 74 69 7a 65 72 29 0a 20 20 72 65 73  sanitizer).  res
1c30: 20 3d 20 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65   = 1;.# endif.#e
1c40: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
1c70: 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
1c80: 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a  L_OK;.}.  ./*.**
1c90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ca0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
1cb0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
1cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
1cd0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
1ce0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
1cf0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
1d00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
1d10: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
1d20: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
1d30: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
1d40: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
1d50: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
1d60: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
1d70: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
1d80: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1da0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
1db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
1e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
1e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1ea0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1eb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
1ec0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1ed0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
1ee0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
1f40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
1f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
1fb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
1fc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
1fe0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1ff0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2000: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2010: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2020: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2030: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2040: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2050: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2060: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2070: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2090: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
20a0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
20b0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
20c0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
20d0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
20e0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
20f0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2110: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2120: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2150: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2160: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
2170: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
2180: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2190: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
21a0: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
21b0: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
21c0: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
21d0: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
21e0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
21f0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
2200: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
2210: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
2220: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2230: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
2240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
22d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
22e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
22f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2310: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2320: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
2330: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
2340: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2350: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
2360: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
2370: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2380: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23d0: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
23e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2400: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2410: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2420: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
2440: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
2450: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
2460: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
2470: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
2480: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
2490: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
24a0: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
24b0: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
24c0: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
24d0: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
24e0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
24f0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
2500: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
2520: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
2530: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
2540: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
2550: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2560: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2570: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2580: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2590: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
25a0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25b0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
25c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25d0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
25e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25f0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2600: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2610: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2620: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2630: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2640: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2650: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2660: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2670: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2680: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
26c0: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
26d0: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
26e0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
26f0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
2700: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
2710: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
2720: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
2730: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2740: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2750: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2760: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2770: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2780: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2790: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
27f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2810: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2830: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2840: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2850: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2860: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2880: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2890: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
28b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
28c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
28d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
28e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
28f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
2900: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
2910: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
2920: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2930: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2940: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2950: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2960: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2990: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
29b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
29c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
29d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
29e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2a00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a10: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a20: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a30: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2a40: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2ab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ac0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ae0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2af0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
2b00: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
2b10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2b20: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
2b30: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2b40: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
2b50: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
2b60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2b80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2b90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ba0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2bb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2bc0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2be0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2bf0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2c10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2c20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2c30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2c40: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2c50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2c60: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c70: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
2c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2c90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2cd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ce0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2cf0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
2d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2d20: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2d40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d50: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2d60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2d80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2d90: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
2da0: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
2db0: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
2dc0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
2dd0: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
2de0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
2df0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2e00: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
2e10: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
2e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e30: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
2e40: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2e50: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
2e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2e80: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2e90: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2eb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2ec0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
2ed0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2ee0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
2ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2f00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
2f10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
2f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2f30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2f40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2f50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2f60: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2f70: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2f80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2f90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
2fd0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
2fe0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
2ff0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3000: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3010: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3030: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
3040: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
3050: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
3060: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
3070: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3090: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
30a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
30b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
30f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3100: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3110: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3120: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3140: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3150: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
3160: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
3170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3180: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3190: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
31a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
31b0: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
31c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31f0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3200: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3220: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
3230: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
3240: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
3250: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3260: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3270: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
32a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
32b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
32c0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
32d0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
32e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
32f0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3300: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
3310: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
3320: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3330: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3340: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3350: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3380: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3390: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
33a0: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
33b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
33c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3400: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3430: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3440: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3450: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3460: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3470: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3490: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
34a0: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
34b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
34c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
34d0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
34e0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
34f0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3500: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3520: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3530: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3560: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3570: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3580: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3590: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
35a0: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
35b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
35c0: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
35d0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
35f0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
3600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
36a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
36b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
36c0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
36d0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
36e0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
36f0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
3700: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
3710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
3720: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
3730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3740: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
3750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3770: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
3780: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
3790: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
37a0: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
37c0: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
37d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
37e0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
37f0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
3800: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
3810: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
3820: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
3830: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
3840: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
3850: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
3860: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
3870: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
3880: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
3890: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
38a0: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
38b0: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
38c0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
38d0: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
38e0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
38f0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
3900: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
3910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
3920: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
39a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
39b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
39c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
39d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
39e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
39f0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
3a00: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
3a10: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
3a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3a30: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
3a40: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
3a50: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
3a60: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
3a70: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
3a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
3a90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
3aa0: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
3ab0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3ac0: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
3ad0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
3ae0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
3af0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
3b00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
3b10: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
3b20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3b40: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
3b50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3b60: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b70: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
3b80: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
3b90: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
3ba0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
3bb0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
3bc0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3bd0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3be0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
3bf0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
3c00: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
3c10: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
3c20: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
3c30: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
3c40: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
3c50: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
3c60: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
3c70: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
3c80: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
3c90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3ca0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3cb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3cc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3cd0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3cf0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3d20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3d40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3d50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3d60: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
3d70: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3d80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
3d90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
3da0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
3db0: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
3dc0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
3dd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
3de0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
3df0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
3e00: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
3e10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
3e20: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
3e30: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
3e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3e50: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
3e60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
3e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3eb0: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3ec0: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f40: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
3f50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3f60: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
3f70: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3f90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
3fa0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
3fb0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3fd0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3fe0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3ff0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4000: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4010: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4020: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4040: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
4050: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
4060: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
4070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4080: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
4090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
40a0: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
40b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
40c0: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
40d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
40e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
40f0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
4100: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
4110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4120: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4130: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4150: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
4170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4180: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
4190: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
41a0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
41c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
41d0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
41e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
41f0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4200: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4210: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4220: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4230: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4240: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4260: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
4270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4280: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
4290: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
42a0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
42b0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
42d0: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
42e0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
42f0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4300: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4310: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4320: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4340: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4350: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4360: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4370: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4380: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
43a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
43b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
43c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
43d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
43e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
43f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4400: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4410: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4430: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4440: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4450: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4460: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4480: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4490: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
44a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
44b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
44c0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
44d0: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
44e0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
44f0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
4500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4510: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
4520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4540: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
4550: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
4560: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4570: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
4580: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4590: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
45a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
45b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
45c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
45d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4610: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4640: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
4650: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4660: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
4670: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4680: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
4690: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
46a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
46b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
46c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
46d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
46e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
46f0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4720: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4730: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4740: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
4760: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
4770: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
4780: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
4790: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
47a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
47b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
47c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
47d0: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
47f0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4800: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
4810: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4820: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4830: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4840: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4850: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4860: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4870: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
48d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
48e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48f0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4a20: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4a30: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4a50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4a60: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4a70: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4a80: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4a90: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4ab0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
4b90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
4ba0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
4bb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4bc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4bd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4be0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4bf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4c00: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
4c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4c20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4c30: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
4c40: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4c50: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
4c70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
4c80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
4c90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
4ca0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
4cb0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
4cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4ce0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
4cf0: 5f 76 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  _v2 DB.**.** Clo
4d00: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4d10: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4d20: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4d30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4d40: 73 74 5f 63 6c 6f 73 65 5f 76 32 28 0a 20 20 76  st_close_v2(.  v
4d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4e10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4e20: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
4e30: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
4e40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4e50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4e60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4e70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4e80: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4e90: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4ec0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4ed0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ef0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
4f00: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
4f10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
4f30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
4f40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
4f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4f80: 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e  x_coalesce() fun
4f90: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
4fa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4fb0: 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  ent non-NULL arg
4fc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4fd0: 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46   void t1_ifnullF
4fe0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ff0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5000: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5010: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5020: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
5030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5050: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5060: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5070: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
5080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5090: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
50b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
50c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
50d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
50e0: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a  _text(argv[i]),.
50f0: 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c            n, SQL
5100: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5130: 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66  These are test f
5140: 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78  unctions.    hex
5150: 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  8() interprets i
5160: 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  ts argument as.*
5170: 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72  * UTF8 and retur
5180: 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e  ns a hex encodin
5190: 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e  g.  hex16le() in
51a0: 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67  terprets its arg
51b0: 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31  ument.** as UTF1
51c0: 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  6le and returns 
51d0: 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a  a hex encoding..
51e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51f0: 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ex8Func(sqlite3_
5200: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
5210: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5220: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
5230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5240: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
5250: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
5270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5280: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5290: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32  i<sizeof(zBuf)/2
52a0: 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 2 && z[i]; i+
52b0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
52c0: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
52d0: 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a  x", z[i]&0xff);.
52e0: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20    }.  zBuf[i*2] 
52f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5300: 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63  esult_text(p, (c
5310: 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53  har*)zBuf, -1, S
5320: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5330: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
5340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
5350: 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46  atic void hex16F
5360: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5370: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
5380: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
5390: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
53a0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
53b0: 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  int *z;.  int i;
53c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
53d0: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
53e0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
53f0: 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[0]);.  for(i=
5400: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66  0; i<sizeof(zBuf
5410: 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b  )/4 - 4 && z[i];
5420: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e   i++){.    sprin
5430: 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22  tf(&zBuf[i*4], "
5440: 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66  %04x", z[i]&0xff
5450: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a  );.  }.  zBuf[i*
5460: 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  4] = 0;.  sqlite
5470: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c  3_result_text(p,
5480: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31   (char*)zBuf, -1
5490: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
54a0: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  NT);.}.#endif../
54b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
54c0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
54d0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
54e0: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
54f0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
5500: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
5510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
5520: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
5530: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
5550: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
5560: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
5570: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
5580: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
5590: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
55b0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
55c0: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
55d0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
55e0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
55f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
5600: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
5610: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
5620: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
5630: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
5640: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
5650: 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
5660: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  _free(p->z);.   
5690: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
56a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
56b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
56c0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
56d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
56e0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
56f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
5700: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
5710: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
5720: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
5730: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
5740: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
5750: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
5760: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
5770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
5780: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
5790: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
57a0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
57b0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
57c0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
57d0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
57e0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
57f0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
5800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5810: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5820: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
5830: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
5840: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
5850: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
5860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
5870: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
5880: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
5890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
58b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
58c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75  sqlite_exec() fu
58d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
58e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20  nction takes.** 
58f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5900: 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  t and attempts t
5910: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61  o execute that a
5920: 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63  rgument as SQL c
5930: 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ode..** This is 
5940: 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75  illegal and shou
5950: 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54  ld set the SQLIT
5960: 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e  E_MISUSE flag on
5970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
5980: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37  *.** 2004-Jan-07
5990: 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67  :  We have chang
59a0: 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20  ed this to make 
59b0: 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c  it legal to call
59c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
59d0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ** from within a
59e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20   function call. 
59f0: 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f   .** .** This ro
5a00: 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20  utine simulates 
5a10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61  the effect of ha
5a20: 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73  ving two threads
5a30: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75   attempt to.** u
5a40: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
5a50: 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
5a60: 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   time..*/.static
5a70: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65   void sqlite3Exe
5a80: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74  e **argv.){.  st
5ad0: 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d  ruct dstr x;.  m
5ae0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
5af0: 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64  eof(x));.  (void
5b00: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73  )sqlite3_exec((s
5b10: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f  qlite3*)sqlite3_
5b20: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5b30: 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t),.      (char*
5b40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5b50: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
5b60: 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c      execFuncCall
5b70: 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20  back, &x, 0);.  
5b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b90: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a  ext(context, x.z
5ba0: 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54  , x.nUsed, SQLIT
5bb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a  sqlite3_free(x.z
5bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5be0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b  ementation of tk
5bf0: 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73  t2213func(), a s
5c00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
5c10: 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c  hat takes exactl
5c20: 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e  y.** one argumen
5c30: 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e  t. It has two in
5c40: 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72  teresting featur
5c50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63  es:.**.** * It c
5c60: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c  alls sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65  ue_text() 3 time
5c80: 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s on the argumen
5c90: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t sqlite3_value*
5ca0: 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68  ..**   If the th
5cb0: 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  ree pointers ret
5cc0: 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68  urned are not th
5cd0: 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72  e same an SQL er
5ce0: 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a  ror is raised..*
5cf0: 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65  *.** * Otherwise
5d00: 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f   it returns a co
5d10: 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72  py of the text r
5d20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5d30: 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d   its .**   argum
5d40: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
5d50: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
5d60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5d70: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5d80: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5d90: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5da0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5db0: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5dc0: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5dd0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5de0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5df0: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5e00: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
5e10: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
5e20: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
5e30: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
5e40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
5e50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5e60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5e70: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5e90: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5ea0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5eb0: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5ed0: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5ee0: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5ef0: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5f00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5f20: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
5f30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
5f60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f70: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5f80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f90: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5fa0: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5fb0: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5fd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5fe0: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5ff0: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
6000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6010: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
6020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
6030: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
6040: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
6050: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
6060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6070: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6080: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
6090: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
60b0: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
60c0: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
60d0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
60e0: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
60f0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
6100: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
6110: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
6120: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
6130: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
6140: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
6150: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
6160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6170: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
6190: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
61a0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
61b0: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
61c0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
61d0: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
61e0: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
61f0: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
6200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6210: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
6220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6230: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
6240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6250: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
6260: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
6270: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
6280: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
6290: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
62a0: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
62b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
62c0: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
62d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
62e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
62f0: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
6300: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
6310: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6320: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
6330: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
6340: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
6350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6360: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6370: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
6380: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6390: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
63a0: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
63b0: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
63c0: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
63d0: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
63e0: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
63f0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
6400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
6420: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
6430: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6440: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
6450: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
6460: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
6470: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
6480: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6490: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
64a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
64b0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
64c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
64d0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
64e0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
64f0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6510: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
6560: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6570: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
6590: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
65a0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65b0: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
65c0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
65d0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
65e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
65f0: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
6600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6610: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6640: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
6650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6660: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
6670: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6690: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
66a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66b0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
66c0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
66d0: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
66e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
66f0: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
6700: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
6710: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6720: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
6730: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
6740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
6750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6760: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6770: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6780: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
6790: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
67a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
67b0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
67c0: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
67d0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6810: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6820: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6830: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6840: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6850: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6860: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6870: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6880: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6890: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
68a0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
68b0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
68c0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68d0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
68e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6900: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
6910: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=p2);.}../*.**
6920: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
6930: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  on returns a dif
6940: 66 65 72 65 6e 74 20 61 6e 73 77 65 72 20 65 61  ferent answer ea
6950: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
6960: 6c 6c 65 64 2c 20 65 76 65 6e 20 69 66 0a 2a 2a  lled, even if.**
6970: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
6980: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
6990: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6e 64  static void nond
69a0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
69b0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
69c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
69e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61   **argv.){.  sta
6a00: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
6a10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6a20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 63  t_int(context, c
6a30: 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nt++);.}../*.** 
6a40: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6a50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6a60: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6a70: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6a80: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6a90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6aa0: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6ab0: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6ac0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
6ad0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
6ae0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
6af0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
6b00: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
6b10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6b20: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6b30: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6b50: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6b60: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6b70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6b80: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6b90: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6ba0: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6bb0: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6bc0: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
6bd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
6be0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
6bf0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
6c00: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
6c10: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
6c20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6c30: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6c40: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6c60: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6c70: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6c80: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6c90: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6ca0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6cb0: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6cc0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
6cd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
6ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
6cf0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
6d00: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
6d10: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
6d20: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6d30: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6d40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6d60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6d70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6d80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6dc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
6dd0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
6de0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6df0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6e00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6e10: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
6e20: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6e30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6e50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6e60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
6e70: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6e80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ea0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6eb0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6ec0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6ee0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ef0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6f00: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6f10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f20: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6f30: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6f60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6f70: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
6f80: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
6f90: 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
6fa0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
6fb0: 20 20 20 20 30 2c 20 68 65 78 38 46 75 6e 63 2c      0, hex8Func,
6fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
6fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6fe0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
6ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7010: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7020: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7030: 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c  LITE_UTF16 | SQL
7040: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7050: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7060: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
7070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
70a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
70b0: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
70c0: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
70d0: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
70e0: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
70f0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7120: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7130: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
7140: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
7150: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7160: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
7170: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
7180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 75  0);.  }..  /* Fu
7190: 6e 63 74 69 6f 6e 73 20 63 6f 75 6e 74 65 72 31  nctions counter1
71a0: 28 29 20 61 6e 64 20 63 6f 75 6e 74 65 72 32 28  () and counter2(
71b0: 29 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  ) have the same 
71c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2d  implementation -
71d0: 20 74 68 65 79 0a 20 20 2a 2a 20 62 6f 74 68 20   they.  ** both 
71e0: 72 65 74 75 72 6e 20 61 6e 20 61 73 63 65 6e 64  return an ascend
71f0: 69 6e 67 20 69 6e 74 65 67 65 72 20 77 69 74 68  ing integer with
7200: 20 65 61 63 68 20 63 61 6c 6c 2e 20 20 42 75 74   each call.  But
7210: 20 63 6f 75 6e 74 65 72 31 28 29 20 69 73 20 6d   counter1() is m
7220: 61 72 6b 65 64 0a 20 20 2a 2a 20 61 73 20 6e 6f  arked.  ** as no
7230: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
7240: 61 6e 64 20 63 6f 75 6e 74 65 72 32 28 29 20 69  and counter2() i
7250: 73 20 6d 61 72 6b 65 64 20 61 73 20 64 65 74 65  s marked as dete
7260: 72 6d 69 6e 69 73 74 69 63 2e 0a 20 20 2a 2f 0a  rministic..  */.
7270: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7290: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
72b0: 6e 74 65 72 31 22 2c 20 2d 31 2c 20 53 51 4c 49  nter1", -1, SQLI
72c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
72d0: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
72e0: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
72f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7310: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7330: 6f 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 32  on(db, "counter2
7340: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7350: 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  F8|SQLITE_DETERM
7360: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
7370: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
7380: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
7390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
73a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73b0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73d0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73e0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73f0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
7400: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7410: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7420: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7430: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7450: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7470: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7490: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
74a0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74b0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74e0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7500: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7510: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7520: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7540: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7560: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
75a0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75b0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75c0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75d0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75e0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7610: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7620: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7650: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7660: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7670: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7680: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
76a0: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76d0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76f0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
7700: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7710: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7720: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7730: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7740: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7750: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7760: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7770: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7780: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7790: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
77a0: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77b0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77e0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77f0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
7800: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7810: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7820: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7830: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7840: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7850: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7860: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7870: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7880: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7890: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
78a0: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78b0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78c0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78d0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78e0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7900: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7920: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7930: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7940: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7950: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7970: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7990: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
79a0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79d0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
7a00: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a20: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a30: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a40: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a50: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a80: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a90: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7aa0: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7ab0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ac0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ae0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7af0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7b00: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b10: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b20: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b30: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b40: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ba0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7bb0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bc0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7be0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bf0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7c00: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7c70: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7c80: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7c90: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7ca0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7cb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7cd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f  *argv.){.  /* no
7ce0: 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63  -op */.}..static
7cf0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7d00: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d20: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d40: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d50: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d60: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d90: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7da0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7db0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7dc0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dd0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7de0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7df0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7e00: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e20: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e50: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e60: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e70: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e90: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7ea0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7eb0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7ec0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ed0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ee0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ef0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7f00: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f10: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f20: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f30: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f40: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f50: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f60: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f80: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f90: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7fa0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fb0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fc0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fd0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fe0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7ff0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
8000: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8020: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8030: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8040: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8050: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8060: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8070: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8080: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8090: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
80a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80b0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80c0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8100: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8110: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8120: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8140: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8150: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8160: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8170: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8180: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8190: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
81a0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8200: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8230: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8240: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8250: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8270: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8280: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8290: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
82a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82b0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82c0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8300: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8310: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8320: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8330: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8340: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8350: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
83a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83b0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83c0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83d0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83e0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83f0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8400: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8420: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8430: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8440: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8470: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8480: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
84a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84b0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84c0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84d0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84e0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84f0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8500: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8510: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8520: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8530: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8540: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8550: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8560: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8570: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8580: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8590: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
85a0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85c0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8690: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
86a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86f0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8720: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8730: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8750: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8760: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8770: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8780: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
8790: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
87a0: 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87b0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8840: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8870: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8890: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88b0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8900: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8910: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8920: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8930: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8950: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8960: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8970: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8980: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8990: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
89a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89c0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89d0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46  _mprintf_int64 F
8a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8a60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8a70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8a80: 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62   with three 64-b
8a90: 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  it integer argum
8aa0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8ac0: 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  tf_int64(.  void
8ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8b90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8ba0: 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b  lite_int64 a[3];
8bb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
8bc0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
8bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8bf0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8c00: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8c10: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
8c20: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
8c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c50: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
8c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8c70: 69 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b  ite3Atoi64(argv[
8c80: 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30  i], &a[i-2], 100
8c90: 30 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0000, SQLITE_UTF
8ca0: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8ce0: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8cf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8d10: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8d20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8d30: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8d40: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
8db0: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
8dc0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8dd0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8de0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8df0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
8e00: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
8e10: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
8e20: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
8e30: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
8e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8e50: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
8e60: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
8e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
8e90: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
8ea0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8eb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ec0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8ed0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8ee0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8ef0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f60: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
8f70: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
8f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8f90: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8fa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8fc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8fd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8fe0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8ff0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
9000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9050: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9070: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9080: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9090: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
90a0: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
90b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
90c0: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
90d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
90e0: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
90f0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
9100: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9110: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9120: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9160: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9170: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9180: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9190: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
91a0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
91b0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
91c0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
91d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
91e0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
91f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
92a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
92b0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
92c0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
92d0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
92e0: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
92f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9300: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9310: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9320: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9330: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
9340: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9350: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9370: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9390: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
93a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
93b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
93c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
93d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
93e0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
93f0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9400: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
9410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9420: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9440: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9460: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9470: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9480: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9490: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
94a0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
94b0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
94c0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
94d0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
94e0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
94f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9500: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9510: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9530: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9540: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9550: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9560: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9570: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9590: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
95a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
95b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
95c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
95d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
95e0: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
95f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9600: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9610: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9630: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9640: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9650: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9660: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9670: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
96a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
96b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
96c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
96d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
96e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
96f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9700: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9710: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9730: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9740: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9750: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9760: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9770: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
97a0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
97b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
97c0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
97d0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
97e0: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
97f0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9810: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9850: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9860: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9870: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9880: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9890: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
98a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
98b0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
98c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
98d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
98e0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
98f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
99a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
99b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
99c0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
99d0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
9a50: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9a80: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9a90: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9aa0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ab0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9ad0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
9ae0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
9af0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
9b10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b20: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9b30: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b90: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9ba0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
9bb0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
9bc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9bd0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9be0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9bf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9c00: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9c10: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
9c20: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
9c30: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
9c40: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
9c50: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
9c60: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
9c70: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9c80: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9ca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9cb0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
9cc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9cd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ce0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9cf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9d00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9d10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9d40: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9d50: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9d60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9d70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9d80: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
9d90: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
9da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
9db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9e00: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9e10: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e30: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9e40: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9e50: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
9e60: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9e70: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
9e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9eb0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
9ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9ef0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9f00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9f10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9f20: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
9f30: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
9f40: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f50: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
9f60: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
9f70: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
9f80: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9f90: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9fa0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9fd0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9fe0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9ff0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a000: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a010: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a020: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a030: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a040: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a050: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a060: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a070: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a080: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a090: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a0b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a0c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a0d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a0e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a0f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a100: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a110: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a120: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a130: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a140: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a150: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a160: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a170: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a190: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a1a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a1b0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a1c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a1d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a1e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a1f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a210: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a220: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a230: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a240: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a250: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a260: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a270: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a280: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a290: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a2a0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2d0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a2e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a2f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a300: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a310: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a320: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a330: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a340: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a360: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a370: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a380: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a390: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a3a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a3b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a3c0: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a3e0: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a3f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a410: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a420: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a430: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a440: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
a450: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a470: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
a480: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
a490: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
a4a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
a4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a4c0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
a4d0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
a4e0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
a4f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a500: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a510: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
a520: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
a530: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
a540: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
a550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a560: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
a570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a580: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
a5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a5b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a5c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
a5d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
a5e0: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
a5f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a600: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a610: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
a620: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
a630: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
a640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
a650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
a660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
a670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
a680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
a6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
a6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
a720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
a730: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
a740: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
a750: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
a760: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
a770: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a780: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a790: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
a7a0: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
a7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a7c0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
a7d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
a7e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
a7f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
a800: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a810: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a820: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
a830: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a860: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
a870: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
a880: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
a890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
a8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a8c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a8d0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a8e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
a8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
a930: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
a940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a950: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
a960: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a970: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a980: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
a990: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
a9b0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a9c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a9d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a9e0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a9f0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
aa10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
aa20: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
aa30: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aa40: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
aa50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa70: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
aa80: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
aa90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
aaa0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
aab0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
aac0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
aad0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
aae0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
aaf0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ab00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ab10: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
ab20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ab40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ab50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ab60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
ab70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ab80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ab90: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
aba0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
abb0: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
abe0: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
abf0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
ac00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac20: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
ac30: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
ac40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
ac50: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
ac60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
ac70: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
ac80: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
ac90: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
aca0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
acb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
acc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
acd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
ace0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
acf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
ad20: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
ad30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
ad40: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ad50: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
ad60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad70: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
ad80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
ad90: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
adc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
add0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ade0: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
adf0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
ae00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ae10: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ae20: 54 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e  TADATA.static in
ae30: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
ae40: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
ae50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ae60: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ae70: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
ae80: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ae90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
aea0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
aeb0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
aec0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
aed0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
aee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
af10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
af20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
af30: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
af40: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
af50: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
af60: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
af70: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
af80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
afa0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
afb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
afc0: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
afe0: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
aff0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b000: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b010: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b020: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
b030: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b040: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b050: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b060: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b080: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b090: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b0a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b0c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b0d0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b0e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b0f0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b100: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b110: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47  ;.  zCol = Tcl_G
b120: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b130: 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e  );..  if( strlen
b140: 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d  (zDb)==0 ) zDb =
b150: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
b160: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
b170: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
b180: 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a  b, zTbl, zCol, .
b190: 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65        &zDatatype
b1a0: 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f  , &zCollseq, &no
b1b0: 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b  tnull, &primaryk
b1c0: 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65  ey, &autoincreme
b1d0: 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  nt);..  if( rc!=
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b1f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b200: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
b210: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
b220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b230: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
b240: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
b250: 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
b260: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b270: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b280: 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79  tringObj(zDataty
b290: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  pe, -1));.  Tcl_
b2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b2b0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b2c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
b2d0: 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20  Collseq, -1));. 
b2e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b2f0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b300: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
b310: 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63  (notnull));.  Tc
b320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b330: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b340: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72  Tcl_NewIntObj(pr
b350: 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63  imarykey));.  Tc
b360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b370: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b380: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75  Tcl_NewIntObj(au
b390: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20  toincrement));. 
b3a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b3b0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
b3c0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b3d0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
b3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b3f0: 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69  _INCRBLOB..stati
b400: 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65  c int blobHandle
b410: 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49  FromObj(.  Tcl_I
b420: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
b430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
b440: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b450: 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68  **ppBlob.){.  ch
b460: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
b470: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
b480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a  ringFromObj(pObj
b490: 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  , &n);.  if( n==
b4a0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  0 ){.    *ppBlob
b4b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b4c0: 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
b4d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
b4e0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69  channel;.    Cli
b4f0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
b500: 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63  Data;.    .    c
b510: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
b520: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
b530: 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  z, &notUsed);.  
b540: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29    if( !channel )
b550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b560: 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73  R;..    Tcl_Flus
b570: 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  h(channel);.    
b580: 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c  Tcl_Seek(channel
b590: 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
b5a0: 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74  .    instanceDat
b5b0: 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  a = Tcl_GetChann
b5c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
b5d0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70  hannel);.    *pp
b5e0: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
b5f0: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
b600: 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ceData);.  }..  
b610: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b620: 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
b630: 62 6c 6f 62 5f 62 79 74 65 73 20 20 43 48 41 4e  blob_bytes  CHAN
b640: 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NEL.*/.static in
b650: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74 65  t test_blob_byte
b660: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
b670: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
b680: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
b690: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b6a0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b6b0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b6c0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b6d0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b6e0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b6f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b700: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b710: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b720: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b730: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b740: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
b750: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74  Blob;.  int nByt
b760: 65 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  e;.  .  if( objc
b770: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
b780: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b790: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48  rp, 1, objv, "CH
b7a0: 41 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72 65 74  ANNEL");.    ret
b7b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b7c0: 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61   }..  if( blobHa
b7d0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndleFromObj(inte
b7e0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42  rp, objv[1], &pB
b7f0: 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  lob) ) return TC
b800: 4c 5f 45 52 52 4f 52 3b 0a 20 20 6e 42 79 74 65  L_ERROR;.  nByte
b810: 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f   = sqlite3_blob_
b820: 62 79 74 65 73 28 70 42 6c 6f 62 29 3b 0a 20 20  bytes(pBlob);.  
b830: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
b840: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
b850: 49 6e 74 4f 62 6a 28 6e 42 79 74 65 29 29 3b 0a  IntObj(nByte));.
b860: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
b870: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74  ;.}../*.** sqlit
b880: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 20 20 43  e3_blob_close  C
b890: 48 41 4e 4e 45 4c 0a 2a 2f 0a 73 74 61 74 69 63  HANNEL.*/.static
b8a0: 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 63   int test_blob_c
b8b0: 6c 6f 73 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  lose(.  ClientDa
b8c0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b8d0: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
b8e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b8f0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
b900: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
b910: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
b920: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
b930: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
b940: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b950: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b960: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b970: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
b980: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
b990: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
b9a0: 20 2a 70 42 6c 6f 62 3b 0a 20 20 0a 20 20 69 66   *pBlob;.  .  if
b9b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
b9c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
b9d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
b9e0: 76 2c 20 22 43 48 41 4e 4e 45 4c 22 29 3b 0a 20  v, "CHANNEL");. 
b9f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ba00: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ba10: 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62  blobHandleFromOb
ba20: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
ba30: 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74  ], &pBlob) ) ret
ba40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ba50: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63 6c   sqlite3_blob_cl
ba60: 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 0a 20 20 72  ose(pBlob);..  r
ba70: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ba80: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
ba90: 6c 6f 62 5f 72 65 61 64 20 20 43 48 41 4e 4e 45  lob_read  CHANNE
baa0: 4c 20 4f 46 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a  L OFFSET N.**.**
bab0: 20 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20     This command 
bac0: 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
bad0: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
bae0: 5f 72 65 61 64 28 29 20 69 6e 20 77 61 79 73 20  _read() in ways 
baf0: 74 68 61 74 0a 2a 2a 20 20 20 74 68 65 20 54 63  that.**   the Tc
bb00: 6c 20 63 68 61 6e 6e 65 6c 20 69 6e 74 65 72 66  l channel interf
bb10: 61 63 65 20 64 6f 65 73 20 6e 6f 74 2e 20 54 68  ace does not. Th
bb20: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
bb30: 20 73 68 6f 75 6c 64 0a 2a 2a 20 20 20 62 65 20   should.**   be 
bb40: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61  the name of a va
bb50: 6c 69 64 20 63 68 61 6e 6e 65 6c 20 63 72 65 61  lid channel crea
bb60: 74 65 64 20 62 79 20 74 68 65 20 5b 69 6e 63 72  ted by the [incr
bb70: 62 6c 6f 62 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20  blob] method.** 
bb80: 20 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20    of a database 
bb90: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 66 75 6e  handle. This fun
bba0: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69  ction calls sqli
bbb0: 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
bbc0: 2a 2a 20 20 20 74 6f 20 72 65 61 64 20 4e 20 62  **   to read N b
bbd0: 79 74 65 73 20 66 72 6f 6d 20 6f 66 66 73 65 74  ytes from offset
bbe0: 20 4f 46 46 53 45 54 20 66 72 6f 6d 20 74 68 65   OFFSET from the
bbf0: 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69   underlying SQLi
bc00: 74 65 0a 2a 2a 20 20 20 62 6c 6f 62 20 68 61 6e  te.**   blob han
bc10: 64 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20  dle..**.**   On 
bc20: 73 75 63 63 65 73 73 2c 20 61 20 62 79 74 65 2d  success, a byte-
bc30: 61 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  array object con
bc40: 74 61 69 6e 69 6e 67 20 74 68 65 20 72 65 61 64  taining the read
bc50: 20 64 61 74 61 20 69 73 20 0a 2a 2a 20 20 20 72   data is .**   r
bc60: 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c  eturned. On fail
bc70: 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70 72  ure, the interpr
bc80: 65 74 65 72 20 72 65 73 75 6c 74 20 69 73 20 73  eter result is s
bc90: 65 74 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 74  et to the.**   t
bca0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
bcb0: 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e  on of the return
bcc0: 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69  ed error code (i
bcd0: 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  .e. "SQLITE_NOME
bce0: 4d 22 29 0a 2a 2a 20 20 20 61 6e 64 20 61 20 54  M").**   and a T
bcf0: 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  cl exception is 
bd00: 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69  thrown..*/.stati
bd10: 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f  c int test_blob_
bd20: 72 65 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  read(.  ClientDa
bd30: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
bd40: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
bd50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
bd60: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
bd70: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
bd80: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
bd90: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
bda0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
bdb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bdc0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
bdd0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
bde0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
bdf0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
be00: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  {.  sqlite3_blob
be10: 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e   *pBlob;.  int n
be20: 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Byte;.  int iOff
be30: 73 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  set;.  unsigned 
be40: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 30 3b 0a  char *zBuf = 0;.
be50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 69    int rc;.  .  i
be60: 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
be70: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
be80: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
be90: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 4f 46 46  jv, "CHANNEL OFF
bea0: 53 45 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  SET N");.    ret
beb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bec0: 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61   }..  if( blobHa
bed0: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndleFromObj(inte
bee0: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42  rp, objv[1], &pB
bef0: 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  lob) ) return TC
bf00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
bf10: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
bf20: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bf30: 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66 73   objv[2], &iOffs
bf40: 65 74 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  et).   || TCL_OK
bf50: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
bf60: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
bf70: 5b 33 5d 2c 20 26 6e 42 79 74 65 29 0a 20 20 29  [3], &nByte).  )
bf80: 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  { .    return TC
bf90: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
bfa0: 69 66 28 20 6e 42 79 74 65 3e 30 20 29 7b 0a 20  if( nByte>0 ){. 
bfb0: 20 20 20 7a 42 75 66 20 3d 20 28 75 6e 73 69 67     zBuf = (unsig
bfc0: 6e 65 64 20 63 68 61 72 20 2a 29 54 63 6c 5f 41  ned char *)Tcl_A
bfd0: 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20 7d  lloc(nByte);.  }
bfe0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
bff0: 62 6c 6f 62 5f 72 65 61 64 28 70 42 6c 6f 62 2c  blob_read(pBlob,
c000: 20 7a 42 75 66 2c 20 6e 42 79 74 65 2c 20 69 4f   zBuf, nByte, iO
c010: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
c020: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c030: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
c040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
c050: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
c060: 7a 42 75 66 2c 20 6e 42 79 74 65 29 29 3b 0a 20  zBuf, nByte));. 
c070: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
c080: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
c090: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
c0a0: 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
c0b0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d  L_VOLATILE);.  }
c0c0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
c0d0: 72 20 2a 29 7a 42 75 66 29 3b 0a 0a 20 20 72 65  r *)zBuf);..  re
c0e0: 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
c0f0: 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54  _OK ? TCL_OK : T
c100: 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a  CL_ERROR);.}../*
c110: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
c120: 5f 77 72 69 74 65 20 43 48 41 4e 4e 45 4c 20 4f  _write CHANNEL O
c130: 46 46 53 45 54 20 44 41 54 41 20 3f 4e 44 41 54  FFSET DATA ?NDAT
c140: 41 3f 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  A?.**.**   This 
c150: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
c160: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
c170: 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 28 29  te3_blob_write()
c180: 20 69 6e 20 77 61 79 73 20 74 68 61 74 0a 2a 2a   in ways that.**
c190: 20 20 20 74 68 65 20 54 63 6c 20 63 68 61 6e 6e     the Tcl chann
c1a0: 65 6c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  el interface doe
c1b0: 73 20 6e 6f 74 2e 20 54 68 65 20 66 69 72 73 74  s not. The first
c1c0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
c1d0: 0a 2a 2a 20 20 20 62 65 20 74 68 65 20 6e 61 6d  .**   be the nam
c1e0: 65 20 6f 66 20 61 20 76 61 6c 69 64 20 63 68 61  e of a valid cha
c1f0: 6e 6e 65 6c 20 63 72 65 61 74 65 64 20 62 79 20  nnel created by 
c200: 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d  the [incrblob] m
c210: 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66 20 61 20  ethod.**   of a 
c220: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
c230: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
c240: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 62 6c 6f  alls sqlite3_blo
c250: 62 5f 77 72 69 74 65 28 29 0a 2a 2a 20 20 20 74  b_write().**   t
c260: 6f 20 77 72 69 74 65 20 74 68 65 20 44 41 54 41  o write the DATA
c270: 20 62 79 74 65 2d 61 72 72 61 79 20 74 6f 20 74   byte-array to t
c280: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 53 51  he underlying SQ
c290: 4c 69 74 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65  Lite blob handle
c2a0: 2e 0a 2a 2a 20 20 20 61 74 20 6f 66 66 73 65 74  ..**   at offset
c2b0: 20 4f 46 46 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20   OFFSET..**.**  
c2c0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61 6e 20   On success, an 
c2d0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
c2e0: 72 65 74 75 72 6e 65 64 2e 20 4f 6e 20 66 61 69  returned. On fai
c2f0: 6c 75 72 65 2c 20 74 68 65 20 69 6e 74 65 72 70  lure, the interp
c300: 72 65 74 65 72 0a 2a 2a 20 20 20 72 65 73 75 6c  reter.**   resul
c310: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
c320: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
c330: 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 74 75 72  ion of the retur
c340: 6e 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20 0a  ned error code .
c350: 2a 2a 20 20 20 28 69 2e 65 2e 20 22 53 51 4c 49  **   (i.e. "SQLI
c360: 54 45 5f 4e 4f 4d 45 4d 22 29 20 61 6e 64 20 61  TE_NOMEM") and a
c370: 20 54 63 6c 20 65 78 63 65 70 74 69 6f 6e 20 69   Tcl exception i
c380: 73 20 74 68 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61  s thrown..*/.sta
c390: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f  tic int test_blo
c3a0: 62 5f 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  b_write(.  Clien
c3b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c3c0: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c3d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c3e0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c3f0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c400: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c410: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c420: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c430: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c440: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c450: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c460: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c470: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c480: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 62  /.){.  sqlite3_b
c490: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
c4a0: 74 20 69 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74  t iOffset;.  int
c4b0: 20 72 63 3b 0a 0a 20 20 75 6e 73 69 67 6e 65 64   rc;..  unsigned
c4c0: 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 20 20 69   char *zBuf;.  i
c4d0: 6e 74 20 6e 42 75 66 3b 0a 20 20 0a 20 20 69 66  nt nBuf;.  .  if
c4e0: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
c4f0: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
c500: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
c510: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
c520: 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20 44 41  HANNEL OFFSET DA
c530: 54 41 20 3f 4e 44 41 54 41 3f 22 29 3b 0a 20 20  TA ?NDATA?");.  
c540: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c550: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
c560: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
c570: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
c580: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
c590: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c5a0: 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
c5b0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
c5c0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c5d0: 69 4f 66 66 73 65 74 29 20 29 7b 20 0a 20 20 20  iOffset) ){ .   
c5e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c5f0: 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d  R;.  }..  zBuf =
c600: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
c610: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
c620: 2c 20 26 6e 42 75 66 29 3b 0a 20 20 69 66 28 20  , &nBuf);.  if( 
c630: 6f 62 6a 63 3d 3d 35 20 26 26 20 54 63 6c 5f 47  objc==5 && Tcl_G
c640: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
c650: 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e  erp, objv[4], &n
c660: 42 75 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Buf) ){.    retu
c670: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
c680: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
c690: 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
c6a0: 62 2c 20 7a 42 75 66 2c 20 6e 42 75 66 2c 20 69  b, zBuf, nBuf, i
c6b0: 4f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  Offset);.  if( r
c6c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c6d0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c6e0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c6f0: 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  *)sqlite3ErrName
c700: 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (rc), TCL_VOLATI
c710: 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  LE);.  }..  retu
c720: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
c730: 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c  K ? TCL_OK : TCL
c740: 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74  _ERROR);.}..stat
c750: 69 63 20 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62  ic int test_blob
c760: 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c 69 65 6e  _reopen(.  Clien
c770: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c780: 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f  , /* Not used */
c790: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c7a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
c7b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
c7c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
c7d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
c7e0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
c7f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c800: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
c810: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
c820: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
c830: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
c840: 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49  /.){.  Tcl_WideI
c850: 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20 73 71 6c  nt iRowid;.  sql
c860: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
c870: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c880: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
c890: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c8a0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c8b0: 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 52 4f 57  jv, "CHANNEL ROW
c8c0: 49 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ID");.    return
c8d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
c8e0: 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c  .  if( blobHandl
c8f0: 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  eFromObj(interp,
c900: 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62   objv[1], &pBlob
c910: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
c920: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
c930: 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
c940: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
c950: 5d 2c 20 26 69 52 6f 77 69 64 29 20 29 20 72 65  ], &iRowid) ) re
c960: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
c970: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
c980: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f  blob_reopen(pBlo
c990: 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  b, iRowid);.  if
c9a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c9b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
c9c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
c9d0: 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
c9e0: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f 4c  ame(rc), TCL_VOL
c9f0: 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20 72  ATILE);.  }..  r
ca00: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
ca10: 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20  E_OK ? TCL_OK : 
ca20: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23  TCL_ERROR);.}..#
ca30: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
ca40: 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ge: sqlite3_crea
ca50: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20  te_collation_v2 
ca60: 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43  DB-HANDLE NAME C
ca70: 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43  MP-PROC DEL-PROC
ca80: 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54 63  .**.**   This Tc
ca90: 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20 66  l proc is used f
caa0: 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 65  or testing the e
cab0: 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20  xperimental.**  
cac0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
cad0: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20 69  collation_v2() i
cae0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 72  nterface..*/.str
caf0: 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  uct TestCollatio
cb00: 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  nX {.  Tcl_Inter
cb10: 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
cb20: 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54 63  _Obj *pCmp;.  Tc
cb30: 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a  l_Obj *pDel;.};.
cb40: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 54  typedef struct T
cb50: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54 65  estCollationX Te
cb60: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74  stCollationX;.st
cb70: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43 72  atic void testCr
cb80: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
cb90: 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20 20  (void *pCtx){.  
cba0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cbb0: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
cbc0: 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20 69  onX *)pCtx;..  i
cbd0: 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  nt rc = Tcl_Eval
cbe0: 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c  ObjEx(p->interp,
cbf0: 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45 56   p->pDel, TCL_EV
cc00: 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56  AL_DIRECT|TCL_EV
cc10: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69 66  AL_GLOBAL);.  if
cc20: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  ( rc!=TCL_OK ){.
cc30: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
cc40: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
cc50: 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 44  p);.  }..  Tcl_D
cc60: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
cc70: 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  Cmp);.  Tcl_Decr
cc80: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c  RefCount(p->pDel
cc90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
cca0: 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a  e((void *)p);.}.
ccb0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 43  static int testC
ccc0: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d  reateCollationCm
ccd0: 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  p(.  void *pCtx,
cce0: 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20 20  .  int nLeft,.  
ccf0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65 66  const void *zLef
cd00: 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74 2c  t,.  int nRight,
cd10: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
cd20: 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74 43  Right.){.  TestC
cd30: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28  ollationX *p = (
cd40: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
cd50: 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a  )pCtx;.  Tcl_Obj
cd60: 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c 5f   *pScript = Tcl_
cd70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
cd80: 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52 65  pCmp);.  int iRe
cd90: 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e  s = 0;..  Tcl_In
cda0: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
cdb0: 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pt);.  Tcl_ListO
cdc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
cdd0: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
cde0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
cdf0: 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65 66  ar *)zLeft, nLef
ce00: 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  t));.  Tcl_ListO
ce10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ce20: 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c 5f  0, pScript, Tcl_
ce30: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
ce40: 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69 67  ar *)zRight,nRig
ce50: 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43 4c  ht));..  if( TCL
ce60: 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a  _OK!=Tcl_EvalObj
ce70: 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 53  Ex(p->interp, pS
ce80: 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c 5f  cript, TCL_EVAL_
ce90: 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f  DIRECT|TCL_EVAL_
cea0: 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54 43  GLOBAL).   || TC
ceb0: 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
cec0: 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65 72  FromObj(p->inter
ced0: 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  p, Tcl_GetObjRes
cee0: 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c 20  ult(p->interp), 
cef0: 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20 20  &iRes).  ){.    
cf00: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
cf10: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
cf20: 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52 65    }.  Tcl_DecrRe
cf30: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
cf40: 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73 3b  ..  return iRes;
cf50: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
cf60: 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
cf70: 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  ion_v2(.  Client
cf80: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
cf90: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
cfa0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
cfb0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
cfc0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
cfd0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
cfe0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
cff0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d000: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d010: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d020: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d030: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d040: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d050: 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  .){.  TestCollat
d060: 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74  ionX *p;.  sqlit
d070: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
d080: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
d090: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d0a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d0b0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
d0c0: 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52  NDLE NAME CMP-PR
d0d0: 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20  OC DEL-PROC");. 
d0e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d0f0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
d100: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
d110: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
d120: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
d130: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
d140: 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73  ROR;..  p = (Tes
d150: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71  tCollationX *)sq
d160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
d170: 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f  eof(TestCollatio
d180: 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20  nX));.  p->pCmp 
d190: 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e  = objv[3];.  p->
d1a0: 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a  pDel = objv[4];.
d1b0: 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e    p->interp = in
d1c0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  terp;.  Tcl_Incr
d1d0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70  RefCount(p->pCmp
d1e0: 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
d1f0: 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a  Count(p->pDel);.
d200: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
d210: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
d220: 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53  _v2(db, Tcl_GetS
d230: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
d240: 31 36 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64  16, .      (void
d250: 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65   *)p, testCreate
d260: 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65  CollationCmp, te
d270: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
d280: 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20  nDel.  );.  if( 
d290: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
d2a0: 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  E ){.    Tcl_App
d2b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d2c0: 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  , "sqlite3_creat
d2d0: 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66  e_collate_v2() f
d2e0: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
d2f0: 22 0a 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61  ".      "an inva
d300: 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28  lid encoding", (
d310: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
d320: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d330: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d340: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d350: 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47  ion_v2(db, Tcl_G
d360: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
d370: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ), SQLITE_UTF8, 
d380: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
d390: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
d3a0: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
d3b0: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
d3c0: 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .  );.  return T
d3d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
d3e0: 55 53 41 47 45 3a 20 73 71 6c 69 74 65 33 5f 63  USAGE: sqlite3_c
d3f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
d400: 32 20 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45  2 DB NAME NARG E
d410: 4e 43 20 3f 53 57 49 54 43 48 45 53 3f 0a 2a 2a  NC ?SWITCHES?.**
d420: 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 77  .** Available sw
d430: 69 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a  itches are:.**.*
d440: 2a 20 20 20 2d 66 75 6e 63 20 20 20 20 53 43 52  *   -func    SCR
d450: 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70 20 20  IPT.**   -step  
d460: 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 66    SCRIPT.**   -f
d470: 69 6e 61 6c 20 20 20 53 43 52 49 50 54 0a 2a 2a  inal   SCRIPT.**
d480: 20 20 20 2d 64 65 73 74 72 6f 79 20 53 43 52 49     -destroy SCRI
d490: 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  PT.*/.typedef st
d4a0: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
d4b0: 69 6f 6e 56 32 20 43 72 65 61 74 65 46 75 6e 63  ionV2 CreateFunc
d4c0: 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74 20 43  tionV2;.struct C
d4d0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d4e0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
d4f0: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
d500: 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20  j *pFunc;       
d510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72            /* Scr
d520: 69 70 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  ipt for function
d530: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
d540: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65 70 3b   Tcl_Obj *pStep;
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61   /* Script for a
d570: 67 67 2e 20 73 74 65 70 20 69 6e 76 6f 63 61 74  gg. step invocat
d580: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
d590: 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 20 20   *pFinal;       
d5a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
d5b0: 70 74 20 66 6f 72 20 61 67 67 2e 20 66 69 6e 61  pt for agg. fina
d5c0: 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63 61 74  lization invocat
d5d0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
d5e0: 20 2a 70 44 65 73 74 72 6f 79 3b 20 20 20 20 20   *pDestroy;     
d5f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74           /* Dest
d600: 72 75 63 74 6f 72 20 73 63 72 69 70 74 20 2a 2f  ructor script */
d610: 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .};.static void 
d620: 63 66 32 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  cf2Func(sqlite3_
d630: 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e  context *ctx, in
d640: 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f  t nArg, sqlite3_
d650: 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d  value **aArg){.}
d660: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32  .static void cf2
d670: 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e  Step(sqlite3_con
d680: 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e  text *ctx, int n
d690: 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Arg, sqlite3_val
d6a0: 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74  ue **aArg){.}.st
d6b0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 69 6e  atic void cf2Fin
d6c0: 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  al(sqlite3_conte
d6d0: 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74 61 74  xt *ctx){.}.stat
d6e0: 69 63 20 76 6f 69 64 20 63 66 32 44 65 73 74 72  ic void cf2Destr
d6f0: 6f 79 28 76 6f 69 64 20 2a 70 55 73 65 72 29 7b  oy(void *pUser){
d700: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
d710: 6e 56 32 20 2a 70 20 3d 20 28 43 72 65 61 74 65  nV2 *p = (Create
d720: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70 55 73  FunctionV2 *)pUs
d730: 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  er;..  if( p->in
d740: 74 65 72 70 20 26 26 20 70 2d 3e 70 44 65 73 74  terp && p->pDest
d750: 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  roy ){.    int r
d760: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
d770: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
d780: 70 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a 20 20  pDestroy, 0);.  
d790: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
d7a0: 20 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e   ) Tcl_Backgroun
d7b0: 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70  dError(p->interp
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d  );.  }..  if( p-
d7d0: 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 44 65 63  >pFunc ) Tcl_Dec
d7e0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75  rRefCount(p->pFu
d7f0: 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  nc); .  if( p->p
d800: 53 74 65 70 20 29 20 54 63 6c 5f 44 65 63 72 52  Step ) Tcl_DecrR
d810: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70  efCount(p->pStep
d820: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69  ); .  if( p->pFi
d830: 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65  nal ) Tcl_DecrRe
d840: 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c  fCount(p->pFinal
d850: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
d860: 73 74 72 6f 79 20 29 20 54 63 6c 5f 44 65 63 72  stroy ) Tcl_Decr
d870: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73  RefCount(p->pDes
d880: 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69 74 65  troy); .  sqlite
d890: 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61  3_free(p);.}.sta
d8a0: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
d8b0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
d8c0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
d8d0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
d8e0: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
d8f0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
d900: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
d910: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b      /* The invok
d920: 69 6e 67 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ing TCL interpre
d930: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  ter */.  int obj
d940: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
d950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
d960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
d970: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
d980: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20  NST objv[]      
d990: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
d9a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
d9b0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
d9c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
d9d0: 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  nc;.  int nArg;.
d9e0: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65    int enc;.  Cre
d9f0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
da00: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
da10: 20 72 63 3b 0a 0a 20 20 73 74 72 75 63 74 20 45   rc;..  struct E
da20: 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f  ncTable {.    co
da30: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a  nst char *zEnc;.
da40: 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d      int enc;.  }
da50: 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20   aEnc[] = {.    
da60: 7b 22 75 74 66 38 22 2c 20 20 20 20 53 51 4c 49  {"utf8",    SQLI
da70: 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b  TE_UTF8 },.    {
da80: 22 75 74 66 31 36 22 2c 20 20 20 53 51 4c 49 54  "utf16",   SQLIT
da90: 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b  E_UTF16 },.    {
daa0: 22 75 74 66 31 36 6c 65 22 2c 20 53 51 4c 49 54  "utf16le", SQLIT
dab0: 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20  E_UTF16LE },.   
dac0: 20 7b 22 75 74 66 31 36 62 65 22 2c 20 53 51 4c   {"utf16be", SQL
dad0: 49 54 45 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20  ITE_UTF16BE },. 
dae0: 20 20 20 7b 22 61 6e 79 22 2c 20 20 20 20 20 53     {"any",     S
daf0: 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20  QLITE_ANY },.   
db00: 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a   {"0", 0 }.  };.
db10: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c  .  if( objc<5 ||
db20: 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a   (objc%2)==0 ){.
db30: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
db40: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
db50: 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e  objv, "DB NAME N
db60: 41 52 47 20 45 4e 43 20 53 57 49 54 43 48 45 53  ARG ENC SWITCHES
db70: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
db80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
db90: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
dba0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
dbb0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
dbc0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
dbd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dbe0: 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53  zFunc = Tcl_GetS
dbf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
dc00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
dc10: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
dc20: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20  objv[3], &nArg) 
dc30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
dc40: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
dc50: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
dc60: 75 63 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  uct(interp, objv
dc70: 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f  [4], aEnc, sizeo
dc80: 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20  f(aEnc[0]), .   
dc90: 20 20 20 20 20 20 20 22 65 6e 63 6f 64 69 6e 67         "encoding
dca0: 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b  ", 0, &enc).  ){
dcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
dcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63  ERROR;.  }.  enc
dcd0: 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63   = aEnc[enc].enc
dce0: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
dcf0: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43  _malloc(sizeof(C
dd00: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29  reateFunctionV2)
dd10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
dd20: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
dd30: 20 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75   sizeof(CreateFu
dd40: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d  nctionV2));.  p-
dd50: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
dd60: 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c  ;..  for(i=5; i<
dd70: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
dd80: 20 69 6e 74 20 69 53 77 69 74 63 68 3b 0a 20 20   int iSwitch;.  
dd90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
dda0: 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75  Switch[] = {"-fu
ddb0: 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d  nc", "-step", "-
ddc0: 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f  final", "-destro
ddd0: 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69 66 28 20  y", 0};.    if( 
dde0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
ddf0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
de00: 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68 2c 20 22  [i], azSwitch, "
de10: 73 77 69 74 63 68 22 2c 20 30 2c 20 26 69 53 77  switch", 0, &iSw
de20: 69 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 73  itch) ){.      s
de30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
de40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
de50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
de60: 20 20 20 73 77 69 74 63 68 28 20 69 53 77 69 74     switch( iSwit
de70: 63 68 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ch ){.      case
de80: 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f   0: p->pFunc = o
de90: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
dea0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
deb0: 20 31 3a 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f   1: p->pStep = o
dec0: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
ded0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dee0: 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20   2: p->pFinal = 
def0: 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62  objv[i+1];     b
df00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
df10: 20 33 3a 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   3: p->pDestroy 
df20: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62  = objv[i+1];   b
df30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
df40: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
df50: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f   p->pFunc = Tcl_
df60: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
df70: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
df80: 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e 70 53 74  ->pStep ) p->pSt
df90: 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ep = Tcl_Duplica
dfa0: 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b  teObj(p->pStep);
dfb0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
dfc0: 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20  l ) p->pFinal = 
dfd0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
dfe0: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
dff0: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
e000: 29 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20  ) p->pDestroy = 
e010: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
e020: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
e030: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
e040: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
e050: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
e060: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
e070: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
e080: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
e090: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
e0a0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
e0b0: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
e0c0: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
e0d0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
e0e0: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
e0f0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
e100: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
e110: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
e120: 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20  Arg, enc, (void 
e130: 2a 29 70 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e  *)p, .      (p->
e140: 70 46 75 6e 63 20 3f 20 63 66 32 46 75 6e 63 20  pFunc ? cf2Func 
e150: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e160: 70 53 74 65 70 20 3f 20 63 66 32 53 74 65 70 20  pStep ? cf2Step 
e170: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
e180: 70 46 69 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61  pFinal ? cf2Fina
e190: 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 63 66  l : 0),.      cf
e1a0: 32 44 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20  2Destroy.  );.  
e1b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e1c0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
e1d0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
e1e0: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
e1f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
e200: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
e210: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
e220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
e230: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
e250: 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  : sqlite3_load_e
e260: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
e270: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a  LE FILE ?PROC?.*
e280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
e290: 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  t_load_extension
e2a0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
e2b0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
e2c0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
e2d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e2e0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
e2f0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
e300: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
e310: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
e320: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e330: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
e340: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
e350: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e360: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
e370: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
e380: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
e390: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
e3a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
e3b0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61  char *zDb;.  cha
e3c0: 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72  r *zFile;.  char
e3d0: 20 2a 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63   *zProc = 0;.  c
e3e0: 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a  har *zErr = 0;..
e3f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
e400: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
e410: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
e420: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
e430: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  , "DB-HANDLE FIL
e440: 45 20 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20  E ?PROC?");.    
e450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e460: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
e470: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
e480: 5b 31 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  [1]);.  zFile = 
e490: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
e4a0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62  jv[2]);.  if( ob
e4b0: 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72  jc==4 ){.    zPr
e4c0: 6f 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  oc = Tcl_GetStri
e4d0: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d  ng(objv[3]);.  }
e4e0: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
e4f0: 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61  he C database ha
e500: 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63  ndle from the Tc
e510: 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a  l command name *
e520: 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  /.  if( !Tcl_Get
e530: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
e540: 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
e550: 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
e560: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e570: 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
e580: 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28  found: ", zDb, (
e590: 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
e5a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e5b0: 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72    }.  db = ((str
e5c0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
e5d0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
e5e0: 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65  ata)->db;.  asse
e5f0: 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61  rt(db);..  /* Ca
e600: 6c 6c 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ll the underlyin
e610: 67 20 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66  g C function. If
e620: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
e630: 2c 20 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a  , set rc to .  *
e640: 2a 20 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20  * TCL_ERROR and 
e650: 6c 6f 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73  load any error s
e660: 74 72 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69  tring into the i
e670: 6e 74 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e  nterpreter. If n
e680: 6f 20 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63  o .  ** error oc
e690: 63 75 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20  curs, set rc to 
e6a0: 54 43 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66  TCL_OK..  */.#if
e6b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e6c0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
e6d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e6e0: 4f 52 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c  OR;.  zErr = sql
e6f0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68  ite3_mprintf("th
e700: 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73  is build omits s
e710: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
e720: 6e 73 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65  nsion()");.#else
e730: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
e740: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
e750: 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
e760: 20 26 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a   &zErr);.#endif.
e770: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
e790: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e7a0: 20 7a 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22   zErr ? zErr : "
e7b0: 22 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ", TCL_VOLATILE)
e7c0: 3b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45  ;.    rc = TCL_E
e7d0: 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
e7e0: 20 20 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a     rc = TCL_OK;.
e7f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
e800: 65 65 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74  ee(zErr);..  ret
e810: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e820: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
e830: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
e840: 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20  nsion DB-HANDLE 
e850: 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20  ONOFF.*/.static 
e860: 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  int test_enable_
e870: 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  load(.  ClientDa
e880: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
e890: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
e8a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e8b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
e8c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
e8d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
e8e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
e8f0: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
e900: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e910: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
e920: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
e930: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
e940: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
e950: 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
e960: 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  cmdInfo;.  sqlit
e970: 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
e980: 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66  zDb;.  int onoff
e990: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
e9a0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
e9b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
e9c0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
e9d0: 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20  NDLE ONOFF");.  
e9e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e9f0: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
ea00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ea10: 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78  jv[1]);..  /* Ex
ea20: 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61  tract the C data
ea30: 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  base handle from
ea40: 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64   the Tcl command
ea50: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21   name */.  if( !
ea60: 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
ea70: 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
ea80: 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
ea90: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eaa0: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
eab0: 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c  nd not found: ",
eac0: 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b   zDb, (char*)0);
ead0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
eae0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20  ERROR;.  }.  db 
eaf0: 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
eb00: 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
eb10: 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
eb20: 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a  .  assert(db);..
eb30: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f    /* Get the ono
eb40: 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  ff parameter */.
eb50: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
eb60: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
eb70: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e  rp, objv[2], &on
eb80: 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75  off) ){.    retu
eb90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
eba0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
ebb0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
ebc0: 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e  SION.  Tcl_Appen
ebd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
ebe0: 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74  "this build omit
ebf0: 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  s sqlite3_load_e
ec00: 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20  xtension()");.  
ec10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ec20: 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65  ;.#else.  sqlite
ec30: 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
ec40: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66  tension(db, onof
ec50: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  f);.  return TCL
ec60: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
ec70: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
ec80: 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20  ite_abort.**.** 
ec90: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f  Shutdown the pro
eca0: 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  cess immediately
ecb0: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  .  This is not a
ecc0: 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e   clean shutdown.
ecd0: 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
ece0: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
ecf0: 20 74 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c   the recoverabil
ed00: 69 74 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ity of a databas
ed10: 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e  e in.** the even
ed20: 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63  t of a program c
ed30: 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rash..*/.static 
ed40: 69 6e 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  int sqlite_abort
ed50: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
ed60: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
ed70: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
ed80: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
ed90: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
eda0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
edb0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
edc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
edd0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ede0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
ee00: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
ee10: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
ee20: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
ee30: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
ee40: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
ee50: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
ee60: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
ee70: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
ee80: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
ee90: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
eea0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
eeb0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
eec0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
eed0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
eee0: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
eef0: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
ef00: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
ef10: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
ef20: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
ef30: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
ef40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
ef50: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
ef60: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
ef70: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
ef80: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
ef90: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
efa0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
efb0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
efc0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
efd0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
efe0: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
eff0: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
f000: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
f010: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
f020: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f030: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
f040: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f050: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
f060: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
f070: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
f080: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
f090: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
f0a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f0b0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
f0c0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
f0d0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
f0e0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
f0f0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
f100: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
f110: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
f120: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
f130: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
f140: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
f150: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
f160: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
f170: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
f180: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
f190: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
f1a0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
f1b0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f1c0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
f1d0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
f1e0: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
f1f0: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
f200: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
f210: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
f220: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
f230: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
f240: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
f250: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
f260: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
f270: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f280: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
f290: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
f2a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f2b0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
f2c0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
f2d0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
f2e0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
f2f0: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
f300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
f310: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
f320: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
f330: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
f340: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
f350: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
f360: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
f370: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
f380: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
f390: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
f3a0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
f3b0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
f3c0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
f3d0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
f3e0: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
f3f0: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
f400: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
f410: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
f420: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
f430: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
f440: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
f450: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
f460: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
f470: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
f480: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
f490: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
f4a0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
f4b0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
f4c0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
f4d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f4e0: 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a  _register_func(.
f4f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
f500: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f510: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
f520: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
f530: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
f540: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
f550: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
f560: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
f570: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
f580: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
f590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
f5a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
f5b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
f5c0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
f5d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
f5e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f5f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f600: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f610: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
f620: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
f630: 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d   DB FUNCTION-NAM
f640: 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
f650: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f660: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
f670: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
f680: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
f690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f6a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
f6b0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
f6c0: 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53  , argv[2], -1, S
f6d0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a  QLITE_UTF8, 0, .
f6e0: 20 20 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20        testFunc, 
f6f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
f700: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =0 ){.    Tcl_Ap
f710: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f720: 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  p, sqlite3ErrStr
f730: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
f740: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f750: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
f760: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
f770: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
f780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f790: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
f7a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
f7b0: 3a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  :  sqlite3_final
f7c0: 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  ize  STMT .**.**
f7d0: 20 46 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74   Finalize a stat
f7e0: 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
f7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
f800: 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69  _finalize(.  voi
f810: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f820: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f830: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f840: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f850: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
f860: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
f870: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
f880: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
f890: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
f8a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
f8b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f8c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
f8d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
f8e0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
f8f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
f900: 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
f910: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
f920: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
f930: 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
f940: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f950: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f960: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f970: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f980: 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20  R;..  if( pStmt 
f990: 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d 74  ){.    db = Stmt
f9a0: 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d  ToDb(pStmt);.  }
f9b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
f9c0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
f9d0: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
f9e0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
f9f0: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
fa00: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
fa10: 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69 74   if( db && sqlit
fa20: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
fa30: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
fa40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fa50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
fa60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
fa70: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
fa80: 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20 20 43  _status  STMT  C
fa90: 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47 0a 2a  ODE  RESETFLAG.*
faa0: 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76 61 6c  *.** Get the val
fab0: 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20 63  ue of a status c
fac0: 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20 73 74  ounter from a st
fad0: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
fae0: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
faf0: 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20  _status(.  void 
fb00: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
fb10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
fb20: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
fb30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
fb40: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
fb50: 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 69   iValue;.  int i
fb60: 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 3b  , op, resetFlag;
fb70: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fb80: 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  OpName;.  sqlite
fb90: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
fba0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
fbb0: 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
fbc0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
fbd0: 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61     int op;.  } a
fbe0: 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  Op[] = {.    { "
fbf0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fc00: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22  S_FULLSCAN_STEP"
fc10: 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  ,   SQLITE_STMTS
fc20: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
fc30: 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  TEP   },.    { "
fc40: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fc50: 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20  S_SORT",        
fc60: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fc70: 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20  TATUS_SORT      
fc80: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
fc90: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fca0: 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20  S_AUTOINDEX",   
fcb0: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fcc0: 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20  TATUS_AUTOINDEX 
fcd0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
fce0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
fcf0: 53 5f 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20  S_VM_STEP",     
fd00: 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53      SQLITE_STMTS
fd10: 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20  TATUS_VM_STEP   
fd20: 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20        },.  };.  
fd30: 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
fd40: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
fd50: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
fd60: 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d  bjv, "STMT PARAM
fd70: 45 54 45 52 20 52 45 53 45 54 46 4c 41 47 22 29  ETER RESETFLAG")
fd80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fd90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
fda0: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
fdb0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
fdc0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
fdd0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
fde0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
fdf0: 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  OpName = Tcl_Get
fe00: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
fe10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
fe20: 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b  raySize(aOp); i+
fe30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
fe40: 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  mp(aOp[i].zName,
fe50: 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a   zOpName)==0 ){.
fe60: 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69        op = aOp[i
fe70: 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61  ].op;.      brea
fe80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
fe90: 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( i>=ArraySize(
fea0: 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20  aOp) ){.    if( 
feb0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
fec0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
fed0: 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e  ], &op) ) return
fee0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
fef0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
ff00: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
ff10: 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65  rp, objv[3], &re
ff20: 73 65 74 46 6c 61 67 29 20 29 20 72 65 74 75 72  setFlag) ) retur
ff30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ff40: 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f  Value = sqlite3_
ff50: 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d  stmt_status(pStm
ff60: 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67  t, op, resetFlag
ff70: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
ff80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
ff90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c  l_NewIntObj(iVal
ffa0: 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ue));.  return T
ffb0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  CL_OK;.}..#ifdef
ffc0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ffd0: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f  TMT_SCANSTATUS./
ffe0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fff0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
10000 61 74 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f  atus STMT IDX.*/
10010 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10020 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
10030 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10040 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10050 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10060 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10070 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10080 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10090 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
100a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
100b0 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  rgument */.  int
100c0 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
100e0 53 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  Second argument 
100f0 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
10100 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74   *zName;.  const
10110 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
10120 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10130 20 6e 4c 6f 6f 70 3b 0a 20 20 73 71 6c 69 74 65   nLoop;.  sqlite
10140 33 5f 69 6e 74 36 34 20 6e 56 69 73 69 74 3b 0a  3_int64 nVisit;.
10150 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10160 6e 45 73 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  nEst;.  int res;
10170 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
10180 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
10190 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
101a0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49  1, objv, "STMT I
101b0 44 58 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DX");.    return
101c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
101d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
101e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
101f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10200 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10210 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10220 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
10230 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
10240 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
10250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10260 4f 52 3b 0a 0a 20 20 72 65 73 20 3d 20 73 71 6c  OR;..  res = sql
10270 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
10280 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c  atus(pStmt, idx,
10290 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54   SQLITE_SCANSTAT
102a0 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26  _NLOOP, (void*)&
102b0 6e 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 72 65  nLoop);.  if( re
102c0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s==0 ){.    Tcl_
102d0 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f  Obj *pRet = Tcl_
102e0 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63  NewObj();.    Tc
102f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10300 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
10310 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10320 28 22 6e 4c 6f 6f 70 22 2c 20 2d 31 29 29 3b 0a  ("nLoop", -1));.
10330 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10340 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
10350 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pRet, Tcl_NewWid
10360 65 49 6e 74 4f 62 6a 28 6e 4c 6f 6f 70 29 29 3b  eIntObj(nLoop));
10370 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
10380 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74  t_scanstatus(pSt
10390 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f  mt, idx, SQLITE_
103a0 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
103b0 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
103c0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
103d0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
103e0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
103f0 74 72 69 6e 67 4f 62 6a 28 22 6e 56 69 73 69 74  tringObj("nVisit
10400 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
10410 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10420 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
10430 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
10440 28 6e 56 69 73 69 74 29 29 3b 0a 20 20 20 20 73  (nVisit));.    s
10450 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
10460 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64  status(pStmt, id
10470 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  x, SQLITE_SCANST
10480 41 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26  AT_EST, (void*)&
10490 6e 45 73 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  nEst);.    Tcl_L
104a0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
104b0 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
104c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
104d0 45 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Est", -1));.    
104e0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
104f0 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
10500 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
10510 4f 62 6a 28 6e 45 73 74 29 29 3b 0a 20 20 20 20  Obj(nEst));.    
10520 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
10530 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69  nstatus(pStmt, i
10540 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53  dx, SQLITE_SCANS
10550 54 41 54 5f 4e 41 4d 45 2c 20 28 76 6f 69 64 2a  TAT_NAME, (void*
10560 29 26 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 54 63  )&zName);.    Tc
10570 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10580 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
10590 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
105a0 28 22 7a 4e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a  ("zName", -1));.
105b0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
105c0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
105d0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
105e0 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31  ingObj(zName, -1
105f0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ));.    sqlite3_
10600 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
10610 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49  pStmt, idx, SQLI
10620 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c  TE_SCANSTAT_EXPL
10630 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78  AIN, (void*)&zEx
10640 70 6c 61 69 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  plain);.    Tcl_
10650 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10660 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
10670 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10680 7a 45 78 70 6c 61 69 6e 22 2c 20 2d 31 29 29 3b  zExplain", -1));
10690 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
106a0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
106b0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
106c0 72 69 6e 67 4f 62 6a 28 7a 45 78 70 6c 61 69 6e  ringObj(zExplain
106d0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
106e0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
106f0 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 65  erp, pRet);.  }e
10700 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  lse{.    Tcl_Res
10710 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
10720 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10730 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10740 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10750 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f  stmt_scanstatus_
10760 72 65 73 65 74 20 20 53 54 4d 54 0a 2a 2f 0a 73  reset  STMT.*/.s
10770 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10780 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72  tmt_scanstatus_r
10790 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eset(.  void * c
107a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
107b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
107c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
107d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
107e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
107f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
10800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
10810 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  st argument */. 
10820 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10830 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10840 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10850 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
10860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10870 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10880 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
10890 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
108a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
108b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
108c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
108d0 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
108e0 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d 74 29  tus_reset(pStmt)
108f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10900 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
10910 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10920 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42  e3_next_stmt  DB
10930 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
10940 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61  urn the next sta
10950 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63  tment in sequenc
10960 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f  e after STMT..*/
10970 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10980 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f  _next_stmt(.  vo
10990 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
109a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
109b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
109c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
109d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
109e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
109f0 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tmt;.  sqlite3 *
10a00 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  db = 0;.  char z
10a10 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20  Buf[50];..  if( 
10a20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10a30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10a40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10a50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10a60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10a70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10a80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10a90 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a  " DB STMT", 0);.
10aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10ab0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10ac0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
10ad0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10ae0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
10af0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
10b00 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
10b10 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
10b20 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10b30 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
10b40 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
10b50 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20  _ERROR;.  pStmt 
10b60 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73  = sqlite3_next_s
10b70 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a  tmt(db, pStmt);.
10b80 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
10b90 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
10ba0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
10bb0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
10bc0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10bd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
10be0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10bf0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
10c00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10c10 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
10c20 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
10c30 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54  tmt_readonly  ST
10c40 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
10c50 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
10c60 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f  a NULL pointer o
10c70 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
10c80 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68   statement.** th
10c90 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
10ca0 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61   to leave the da
10cb0 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65  tabase unmodifie
10cc0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10cd0 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f   test_stmt_reado
10ce0 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nly(.  void * cl
10cf0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10d00 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10d10 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10d20 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10d30 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10d40 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
10d50 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
10d60 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
10d70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10d80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10d90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10da0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10db0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10dc0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10dd0 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
10de0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10df0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
10e00 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
10e10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10e20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
10e30 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
10e40 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
10e50 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
10e60 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54  only(pStmt);.  T
10e70 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10e80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
10e90 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a  ooleanObj(rc));.
10ea0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62    sqlite3_stmt_b
10ed0 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  usy  STMT.**.** 
10ee0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
10ef0 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c  TMT is a non-NUL
10f00 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  L pointer to a s
10f10 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
10f20 20 68 61 73 20 62 65 65 6e 20 73 74 65 70 70 65   has been steppe
10f30 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d  d but not to com
10f40 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  pletion..*/.stat
10f50 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
10f60 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20  _busy(.  void * 
10f70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10f80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10f90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10fa0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10fb0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10fc0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
10fe0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11000 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
11010 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
11020 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
11030 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11040 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
11050 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
11060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11070 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
11080 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
11090 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
110a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
110b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
110c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
110d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
110e0 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  sy(pStmt);.  Tcl
110f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
11100 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
11110 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
11120 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11130 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
11140 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
11150 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  l  STMT.**.** Re
11160 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
11170 54 20 75 73 65 73 20 61 20 73 74 61 74 65 6d 65  T uses a stateme
11180 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  nt journal..*/.s
11190 74 61 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73  tatic int uses_s
111a0 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76  tmt_journal(.  v
111b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
111c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
111d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
111e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
111f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11200 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11210 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
11220 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
11230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11240 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
11250 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
11260 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
11270 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11280 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
11290 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
112a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
112b0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
112c0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
112d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
112e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
112f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11300 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
11310 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
11320 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
11330 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11340 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
11350 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d  bj(((Vdbe *)pStm
11360 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72  t)->usesStmtJour
11370 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  nal));.  return 
11380 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
11390 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
113a0 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a  3_reset  STMT .*
113b0 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61  *.** Reset a sta
113c0 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a  tement handle..*
113d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
113e0 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20  t_reset(.  void 
113f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11400 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11410 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11420 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11430 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
11440 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
11450 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
11460 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
11470 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
11480 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
11490 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
114a0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
114b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
114c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
114d0 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
114e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
114f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
11500 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
11510 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
11520 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11530 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
11540 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
11550 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
11560 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
11570 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74  ( pStmt && sqlit
11580 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
11590 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
115a0 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20  Stmt), rc) ){.  
115b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
115c0 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  OR;.  }.  Tcl_Se
115d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
115e0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
115f0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
11600 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72  TIC);./*.  if( r
11610 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
11620 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a  TCL_ERROR;.  }.*
11630 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
11640 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
11650 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69  e:  sqlite3_expi
11660 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  red STMT .**.** 
11670 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61  Return TRUE if a
11680 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f   recompilation o
11690 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
116a0 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a  is recommended..
116b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
116c0 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f  st_expired(.  vo
116d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
116e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
116f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
11700 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
11710 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
11720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11730 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
11740 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
11750 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
11760 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
11770 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11780 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
11790 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
117a0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
117b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
117c0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
117d0 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
117e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
117f0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
11800 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11810 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11820 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
11830 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11840 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
11850 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
11860 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
11870 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  (sqlite3_expired
11880 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69  (pStmt)));.#endi
11890 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
118a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
118b0 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  e:  sqlite3_tran
118c0 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52  sfer_bindings FR
118d0 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a  OMSTMT TOSTMT.**
118e0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c  .** Transfer all
118f0 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46   bindings from F
11900 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20  ROMSTMT over to 
11910 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63  TOSTMT.*/.static
11920 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66   int test_transf
11930 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20  er_bind(.  void 
11940 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11950 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11960 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11970 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11980 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
11990 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
119a0 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
119b0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31  te3_stmt *pStmt1
119c0 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28  , *pStmt2;.  if(
119d0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
119e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
119f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
11a00 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
11a10 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
11a20 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
11a30 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
11a40 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d   " FROM-STMT TO-
11a50 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
11a60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11a70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
11a80 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
11a90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
11aa0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
11ab0 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  1)) return TCL_E
11ac0 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53  RROR;.  if( getS
11ad0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11ae0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11af0 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d  (objv[2]), &pStm
11b00 74 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t2)) return TCL_
11b10 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
11b20 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11b30 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49  , .     Tcl_NewI
11b40 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72  ntObj(sqlite3_tr
11b50 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28  ansfer_bindings(
11b60 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29  pStmt1,pStmt2)))
11b70 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
11b80 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
11b90 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
11ba0 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a  e3_changes DB.**
11bb0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
11bc0 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
11bd0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
11be0 61 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73  abase by the las
11bf0 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69  t SQL.** executi
11c00 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
11c10 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a  t test_changes(.
11c20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
11c30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
11c40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
11c50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
11c60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
11c70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
11c80 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
11c90 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11ca0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11cb0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
11cc0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
11cd0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
11ce0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
11cf0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
11d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11d10 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
11d20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11d30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11d40 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
11d60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11d70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
11d80 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68  ntObj(sqlite3_ch
11d90 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72  anges(db)));.  r
11da0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11db0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
11dc0 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f  he "static_bind_
11dd0 76 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69  value" that vari
11de0 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20  ables are bound 
11df0 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46  to when.** the F
11e00 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71  LAG option of sq
11e10 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73  lite3_bind is "s
11e20 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63  tatic".*/.static
11e30 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74   char *sqlite_st
11e40 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20  atic_bind_value 
11e50 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
11e60 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
11e70 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f  nd_nbyte = 0;../
11e80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11e90 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49  ite3_bind  VM  I
11ea0 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53  DX  VALUE  FLAGS
11eb0 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20  .**.** Sets the 
11ec0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58  value of the IDX
11ed0 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65 20 6f  -th occurrence o
11ee0 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69  f "?" in the ori
11ef0 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72  ginal SQL.** str
11f00 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74  ing.  VALUE is t
11f10 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49  he new value.  I
11f20 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20  f FLAGS=="null" 
11f30 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a  then VALUE is.**
11f40 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65   ignored and the
11f50 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f   value is set to
11f60 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53   NULL.  If FLAGS
11f70 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a  =="static" then.
11f80 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  ** the value is 
11f90 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
11fa0 20 6f 66 20 61 20 73 74 61 74 69 63 20 76 61 72   of a static var
11fb0 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22  iable named.** "
11fc0 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
11fd0 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46  nd_value".  If F
11fe0 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74  LAGS=="normal" t
11ff0 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66  hen a copy.** of
12000 20 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61   the VALUE is ma
12010 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  de.  If FLAGS=="
12020 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56  blob10" then a V
12030 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a  ALUE is ignored.
12040 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20  ** an a 10-byte 
12050 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a  blob "abc\000xyz
12060 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73 65 72  \000pq" is inser
12070 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
12080 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20  nt test_bind(.  
12090 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
120a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
120b0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
120c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
120d0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
120e0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
120f0 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
12100 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12110 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
12120 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
12130 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
12140 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
12150 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
12160 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
12170 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
12180 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  x;.  if( argc!=5
12190 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
121a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
121b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
121c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
121d0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
121e0 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28  " VM IDX VALUE (
121f0 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d  null|static|norm
12200 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  al)\"", 0);.    
12210 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
12230 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12240 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74  p, argv[1], &pSt
12250 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
12260 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
12270 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
12280 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20   argv[2], &idx) 
12290 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
122a0 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
122b0 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29  (argv[4],"null")
122c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
122d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
122e0 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
122f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12300 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
12310 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  c")==0 ){.    rc
12320 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
12330 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
12340 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
12350 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30  ind_value, -1, 0
12360 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
12370 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73  trcmp(argv[4],"s
12380 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d  tatic-nbytes")==
12390 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
123a0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
123b0 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
123c0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
123d0 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12400 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
12410 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nbyte, 0);.  }el
12420 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
12430 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d  gv[4],"normal")=
12440 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
12450 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
12460 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67  (pStmt, idx, arg
12470 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[3], -1, SQLITE
12480 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
12490 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
124a0 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22  argv[4],"blob10"
124b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
124c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
124d0 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22  xt(pStmt, idx, "
124e0 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71  abc\000xyz\000pq
124f0 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54  ", 10, SQLITE_ST
12500 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
12510 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12520 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74  sult(interp, "4t
12530 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  h argument shoul
12540 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 22  d be ".        "
12550 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74  \"null\" or \"st
12560 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d  atic\" or \"norm
12570 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  al\"", 0);.    r
12580 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12590 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
125a0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
125b0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
125c0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
125d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
125e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
125f0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
12600 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
12610 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
12620 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12630 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
12640 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
12650 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
12660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12670 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
12680 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
12690 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
126a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
126b0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64  _test_collate <d
126c0 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75  b ptr> <utf8> <u
126d0 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
126e0 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
126f0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
12700 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
12710 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f  e selects the co
12720 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a  rrect collation.
12730 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c  ** sequence call
12740 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
12750 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
12760 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
12770 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
12780 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
12790 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
127a0 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
127b0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
127c0 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63  sequence "test_c
127d0 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20  ollate".** with 
127e0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
127f0 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64  <db>. The second
12800 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
12810 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  e a list of thre
12820 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  e.** boolean val
12830 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ues. If the firs
12840 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
12850 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
12860 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20  t_collate is.** 
12870 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
12880 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63  TF-8, if the sec
12890 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ond is true, a v
128a0 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
128b0 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d  ered for.** UTF-
128c0 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69  16le, if the thi
128d0 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55 54  rd is true, a UT
128e0 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69  F-16be version i
128f0 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20  s available..** 
12900 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
12910 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  s of test_collat
12920 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  e are deleted..*
12930 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
12940 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73 74  on sequence test
12950 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c  _collate is impl
12960 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69  emented by calli
12970 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ng the.** follow
12980 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
12990 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f  **.**   "test_co
129a0 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73  llate <enc> <lhs
129b0 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54  > <rhs>".**.** T
129c0 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68  he <lhs> and <rh
129d0 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20 76  s> are the two v
129e0 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70  alues being comp
129f0 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e  ared, encoded in
12a00 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c   UTF-8..** The <
12a10 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69  enc> parameter i
12a20 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
12a30 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
12a40 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
12a50 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64   SQLite selected
12a60 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43   to call. The TC
12a70 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69 6d  L test script im
12a80 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
12a90 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70  "test_collate" p
12aa0 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  roc..**.** Note 
12ab0 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f  that this will o
12ac0 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e  nly work with on
12ad0 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 74  e interpreter at
12ae0 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a   a time, as the.
12af0 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65  ** interp pointe
12b00 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76  r to use when ev
12b10 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c  aluating the TCL
12b20 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65   script is store
12b30 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c  d in.** pTestCol
12b40 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73  lateInterp..*/.s
12b50 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70  tatic Tcl_Interp
12b60 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
12b70 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74  terp;.static int
12b80 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
12b90 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  nc(.  void *pCtx
12ba0 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e  , .  int nA, con
12bb0 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
12bc0 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nB, const voi
12bd0 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49  d *zB.){.  Tcl_I
12be0 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74  nterp *i = pTest
12bf0 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20  CollateInterp;. 
12c00 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c   int encin = SQL
12c10 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
12c20 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Ctx);.  int res;
12c30 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c  .  int n;..  sql
12c40 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12c50 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
12c60 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ..  pX = Tcl_New
12c70 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
12c80 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20  collate", -1);. 
12c90 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
12ca0 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68  t(pX);..  switch
12cb0 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63  ( encin ){.    c
12cc0 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a  ase SQLITE_UTF8:
12cd0 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
12ce0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12cf0 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
12d00 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31  ngObj("UTF-8",-1
12d10 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
12d20 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12d30 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
12d40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12d50 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
12d60 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12d70 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a  UTF-16LE",-1));.
12d80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12d90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
12da0 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16BE:.      Tcl_
12db0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12dc0 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
12dd0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
12de0 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16BE",-1));.    
12df0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
12e00 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
12e10 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  rt(0);.  }..  sq
12e20 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12e30 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c  Malloc();.  pVal
12e40 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
12e50 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61  ew(0);.  if( pVa
12e60 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
12e70 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
12e80 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c  , nA, zA, encin,
12e90 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12ea0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
12eb0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
12ec0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
12ed0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12ee0 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
12ef0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12f00 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12f10 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12f20 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12f30 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
12f40 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c  , nB, zB, encin,
12f50 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12f60 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
12f70 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
12f80 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
12f90 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12fa0 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
12fb0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12fc0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12fd0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12fe0 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12ff0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
13000 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
13010 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
13020 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ..  Tcl_EvalObjE
13030 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  x(i, pX, 0);.  T
13040 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
13050 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e  pX);.  Tcl_GetIn
13060 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f  tFromObj(i, Tcl_
13070 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c  GetObjResult(i),
13080 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   &res);.  return
13090 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69   res;.}.static i
130a0 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  nt test_collate(
130b0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
130c0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
130d0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
130e0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
130f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
13100 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
13110 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
13120 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
13130 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
13140 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
13150 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
13160 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
13170 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69  rp = interp;.  i
13180 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
13190 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
131a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
131b0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
131c0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
131d0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
131e0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
131f0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
13200 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
13210 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
13220 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
13230 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
13240 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
13250 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
13260 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
13270 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
13280 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
13290 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
132a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
132b0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31  onst void *zUtf1
132c0 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  6;.    if( TCL_O
132d0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
132e0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
132f0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
13300 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13310 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  OR;.    rc = sql
13320 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
13330 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
13340 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
13350 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
13360 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
13370 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
13380 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
13390 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28  func:0);.    if(
133a0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
133b0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
133c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
133d0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
133e0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30  CL_ERROR;..#if 0
133f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13400 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
13410 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
13420 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
13430 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13440 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13450 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
13460 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
13470 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
13480 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
13490 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
134a0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
134b0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
134c0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
134d0 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
134e0 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
134f0 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
13500 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
13510 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13520 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13530 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
13550 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
13560 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
13570 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f   zUtf16, SQLITE_
13580 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
13590 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
135a0 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
135b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
135c0 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  c:0);.    }.    
135d0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
135e0 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
135f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13600 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
13610 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13620 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13630 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
13640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
13650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13660 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
13670 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13680 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
13690 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
136a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
136b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
136c0 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
136d0 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
136e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
136f0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
13700 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
13710 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13720 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
13730 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
13740 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
13750 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74  6be>", 0);.  ret
13760 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
13770 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
13780 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
13790 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
137a0 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74  >.**.** Add a ut
137b0 66 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  f-16 collation s
137c0 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75  equence named "u
137d0 74 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20  tf16bin" to the 
137e0 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
137f0 6c 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  le. This collati
13800 6f 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70  on sequence comp
13810 61 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69  ares arguments i
13820 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
13830 73 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69  s the.** built-i
13840 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e  n collation "bin
13850 61 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ary"..*/.static 
13860 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69  int test_utf16bi
13870 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  n_collate_func(.
13880 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
13890 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
138a0 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
138b0 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
138c0 42 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  B.){.  int nCmp 
138d0 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20  = (nA>nB ? nB : 
138e0 6e 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  nA);.  int res =
138f0 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20   memcmp(zA, zB, 
13900 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
13910 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d  ==0 ) res = nA -
13920 20 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65   nB;.  return re
13930 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
13940 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
13950 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
13960 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
13970 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13980 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13990 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
139a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
139b0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
139c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
139d0 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
139e0 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
139f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13a00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13a10 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
13a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
13a40 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
13a50 62 2c 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53  b, "utf16bin", S
13a60 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20  QLITE_UTF16, 0, 
13a70 0a 20 20 20 20 20 20 74 65 73 74 5f 75 74 66 31  .      test_utf1
13a80 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  6bin_collate_fun
13a90 63 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  c.  );.  if( sql
13aa0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13ab0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
13ac0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13ad0 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
13ae0 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
13af0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13b00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
13b10 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
13b20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
13b30 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ../*.** When the
13b40 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65   collation neede
13b50 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  d callback is in
13b60 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68  voked, record th
13b70 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68  e name of .** th
13b80 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
13b90 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68  ating function h
13ba0 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ere.  The record
13bb0 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65  ed name is linke
13bc0 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61  d.** to a TCL va
13bd0 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20  riable and used 
13be0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
13bf0 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  t the requested 
13c00 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d  collation.** nam
13c10 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f  e is correct..*/
13c20 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65  .static char zNe
13c30 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30  ededCollation[20
13c40 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20  0];.static char 
13c50 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  *pzNeededCollati
13c60 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  on = zNeededColl
13c70 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ation;.../*.** C
13c80 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c  alled when a col
13c90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
13ca0 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69  is needed.  Regi
13cb0 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20  stered using.** 
13cc0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
13cd0 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f  n_needed16()..*/
13ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
13cf0 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
13d00 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  _cb(.  void *pCt
13d10 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  x, .  sqlite3 *d
13d20 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  b,.  int eTextRe
13d30 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  p,.  const void 
13d40 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20  *pName.){.  int 
13d50 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
13d60 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
13d70 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68  z;.  for(z = (ch
13d80 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20  ar*)pName, i=0; 
13d90 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29  *z || z[1]; z++)
13da0 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a  {.    if( *z ) z
13db0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
13dc0 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20  i++] = *z;.  }. 
13dd0 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
13de0 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  n[i] = 0;.  sqli
13df0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13e00 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
13e10 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
13e20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f  ENC(db), SQLITE_
13e30 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c  INT_TO_PTR(enc),
13e40 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
13e50 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  nc);.}../*.** Us
13e60 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
13e70 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a  llate_needed DB.
13e80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
13e90 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
13ea0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
13eb0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
13ec0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13ed0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13ee0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13ef0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
13f00 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
13f10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
13f20 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
13f30 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
13f40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13f50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13f60 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
13f70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
13f80 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
13f90 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20  on_needed16(db, 
13fa0 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  0, test_collate_
13fb0 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e  needed_cb);.  zN
13fc0 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30  eededCollation[0
13fd0 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  ] = 0;.  if( sql
13fe0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13ff0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
14000 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14010 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
14020 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
14030 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
14040 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
14050 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
14060 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
14070 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
14080 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f    add_alignment_
14090 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20  test_collations 
140a0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77   DB.**.** Add tw
140b0 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  o new collating 
140c0 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65  sequences to the
140d0 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a   database DB.**.
140e0 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69  **     utf16_ali
140f0 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31  gned.**     utf1
14100 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a  6_unaligned.**.*
14110 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
14120 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74   sequences use t
14130 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
14140 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a  er as BINARY..**
14150 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
14160 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65  ence is that the
14170 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63   utf16_aligned c
14180 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
14190 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64  ence is declared
141a0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
141b0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66  _UTF16_ALIGNED f
141c0 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  lag..** Both col
141d0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
141e0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75   increment the u
141f0 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63  naligned utf16 c
14200 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76  ounter.** whenev
14210 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74  er they see a st
14220 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
14230 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20   on an odd byte 
14240 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61  boundary..*/.sta
14250 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65  tic int unaligne
14260 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
14270 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
14280 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
14290 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
142a0 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
142b0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
142c0 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
142d0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
142e0 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
142f0 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
14300 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
14310 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65  nKey2;.  if( nKe
14320 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53  y1>0 && 1==(1&(S
14330 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
14340 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c  (pKey1))) ) unal
14350 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
14360 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b  nter++;.  if( nK
14370 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey2>0 && 1==(1&(
14380 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
14390 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61  T(pKey2))) ) una
143a0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
143b0 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20  unter++;.  rc = 
143c0 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
143d0 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
143e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
143f0 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
14400 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14410 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  .}.static int ad
14420 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
14430 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76  _collations(.  v
14440 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14450 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14460 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14470 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14480 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14490 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
144a0 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20  if( objc>=2 ){. 
144b0 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
144c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
144d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
144e0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
144f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14500 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14510 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
14520 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c  tf16_unaligned",
14530 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a   SQLITE_UTF16, .
14540 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
14550 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
14560 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
14570 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
14580 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c  "utf16_aligned",
14590 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
145a0 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20  IGNED, .        
145b0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
145c0 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Func);.  }.  ret
145d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
145e0 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
145f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14600 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  UTF16) */../*.**
14610 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
14620 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
14630 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
14640 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
14650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
14660 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
14670 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
14680 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
14690 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
146a0 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
146b0 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
146c0 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
146d0 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
146e0 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
146f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
14700 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
14710 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
14720 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
14730 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
14740 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
14750 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
14760 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
14770 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
14780 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
14790 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
147a0 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
147b0 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
147c0 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
147d0 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
147e0 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
147f0 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
14800 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
14810 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
14820 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
14830 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
14840 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
14850 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
14860 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
14870 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
14880 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
14890 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
148a0 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
148b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
148c0 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
148d0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
148e0 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
148f0 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
14900 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
14910 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
14920 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
14930 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
14940 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
14950 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
14960 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
14970 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
14980 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
14990 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
149a0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
149b0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
149c0 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
149d0 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
149e0 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
149f0 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
14a00 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
14a10 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
14a20 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
14a30 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
14a40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
14a50 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
14a60 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e  TF-16BE..*/.#ifn
14a70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14a80 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69  UTF16.static voi
14a90 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
14aa0 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
14ab0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
14ac0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
14ad0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14ae0 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14af0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14b00 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14b10 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14b20 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14b30 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14b40 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14b50 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
14b60 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
14b70 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
14b80 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
14b90 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
14ba0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14bb0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14bc0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14bd0 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
14be0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
14bf0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14c00 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
14c10 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14c20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
14c30 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
14c40 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
14c50 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
14c60 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
14c70 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
14c80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14c90 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63  lt_text(pCtx, Tc
14ca0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
14cb0 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53  t(interp), -1, S
14cc0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14cd0 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
14ce0 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
14cf0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
14d00 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
14d10 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
14d20 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
14d30 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
14d40 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14d50 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14d60 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73  text16be(pCtx, s
14d70 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14d80 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16be(pVal),.   
14d90 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
14da0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
14db0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
14dc0 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
14dd0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
14de0 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74  utf16le(.  sqlit
14df0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
14e00 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
14e10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14e20 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
14e30 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
14e40 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
14e50 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
14e60 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
14e70 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
14e80 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
14e90 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
14ea0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
14eb0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
14ec0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
14ed0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
14ee0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
14ef0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
14f00 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
14f10 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
14f20 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
14f30 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14f40 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
14f50 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
14f60 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
14f70 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
14f80 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
14f90 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
14fa0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
14fb0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
14fc0 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
14fd0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14fe0 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
14ff0 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
15000 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
15010 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
15020 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
15030 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
15040 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
15050 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
15060 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
15070 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
15080 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
15090 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
150a0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
150b0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
150c0 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
150d0 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6be(.  sqlite3_c
150e0 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
150f0 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
15100 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
15110 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
15120 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
15130 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
15140 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
15150 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
15160 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
15170 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
15180 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
15190 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
151a0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
151b0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
151c0 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
151d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
151e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
151f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
15200 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29  ("UTF-16BE", -1)
15210 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
15220 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
15230 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
15240 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
15250 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
15260 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
15270 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
15280 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
15290 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
152a0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
152b0 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
152c0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
152d0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
152e0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
152f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
15300 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
15310 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
15320 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
15330 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
15340 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73  t_text16(pCtx, s
15350 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
15360 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
15370 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
15380 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
15390 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
153a0 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  6be(pCtx, sqlite
153b0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65  3_value_text16le
153c0 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
153d0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
153e0 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  NT);.  sqlite3_r
153f0 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70  esult_text16le(p
15400 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
15410 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
15420 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
15430 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
15440 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
15450 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64  ee(pVal);.}.#end
15460 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15470 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69  T_UTF16 */.stati
15480 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74  c int test_funct
15490 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
154a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
154b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
154c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
154d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
154e0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
154f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15500 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15510 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66    int val;..  if
15520 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
15530 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
15540 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15550 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15560 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
15570 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
15580 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
15590 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
155a0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
155b0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
155c0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
155d0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
155e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
155f0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
15600 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
15610 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
15620 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  TF8, .        in
15630 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
15640 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b  ion_utf8, 0, 0);
15650 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
15660 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
15670 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
15680 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
15690 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
156a0 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
156b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
156c0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
156d0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
156e0 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
156f0 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6LE, .        in
15700 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
15710 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20  ion_utf16le, 0, 
15720 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43  0);.  }.  if( TC
15730 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
15740 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
15750 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
15760 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
15770 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
15780 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15790 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
157a0 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
157b0 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
157c0 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
157d0 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
157e0 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20  nction_utf16be, 
157f0 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
15800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64  turn TCL_OK;.bad
15810 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
15820 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15830 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15840 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15850 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
15860 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
15870 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
15880 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
15890 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
158a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
158b0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
158c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
158d0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
158e0 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  e:         sqlit
158f0 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c  e3_test_errstr <
15900 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20  err code>.**.** 
15910 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65 6e  Test that the en
15920 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73  glish language s
15930 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74  tring equivalent
15940 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72  s for sqlite err
15950 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20  or codes.** are 
15960 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65  sane. The parame
15970 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ter is an intege
15980 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  r representing a
15990 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  n sqlite error c
159a0 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  ode..** The resu
159b0 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  lt is a list of 
159c0 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68  two elements, th
159d0 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
159e0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
159f0 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
15a00 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
15a10 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
15a20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
15a30 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20   test_errstr(.  
15a40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15a50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15a60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15a70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
15a80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
15a90 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
15aa0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62   int i;.  if( ob
15ab0 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
15ac0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15ad0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15ae0 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a  <error code>");.
15af0 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54    }..  zCode = T
15b00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15b10 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[1]);.  for(i=0
15b20 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<200; i++){. 
15b30 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
15b40 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c  (t1ErrorName(i),
15b50 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b   zCode) ) break;
15b60 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
15b70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
15b80 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53  ar *)sqlite3ErrS
15b90 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74  tr(i), 0);.  ret
15ba0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
15bb0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62  *.** Usage:    b
15bc0 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
15bd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69  This routine exi
15be0 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70  sts for one purp
15bf0 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65  ose - to provide
15c00 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20   a place to put 
15c10 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20  a.** breakpoint 
15c20 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61  with GDB that ca
15c30 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75  n be triggered u
15c40 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20  sing TCL code.  
15c50 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74  The use.** for t
15c60 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61  his is when a pa
15c70 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61  rticular test fa
15c80 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65  ils on (say) the
15c90 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f   1485th iteratio
15ca0 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c  n..** In the TCL
15cb0 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65   test script, we
15cc0 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69   can add code li
15cd0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
15ce0 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d     if {$i==1485}
15cf0 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
15d00 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66  * Then run testf
15d10 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65  ixture in the de
15d20 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20  bugger and wait 
15d30 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69  for the breakpoi
15d40 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20  nt to.** fire.  
15d50 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  Then additional 
15d60 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20  breakpoints can 
15d70 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20  be set to trace 
15d80 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f  down the bug..*/
15d90 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15da0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76  _breakpoint(.  v
15db0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
15dc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15dd0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
15de0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
15df0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
15e00 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
15e10 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
15e20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15e30 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
15e40 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
15e50 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
15e60 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
15e70 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  */.){.  return T
15e80 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  CL_OK;         /
15e90 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
15ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15eb0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a    sqlite3_bind_z
15ec0 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44  eroblob  STMT ID
15ed0 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  X N.**.** Test t
15ee0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
15ef0 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61  zeroblob interfa
15f00 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15f10 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15f20 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65  t..** IDX is the
15f30 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15f40 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15f50 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15f60 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15f70 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20   binds a N-byte 
15f80 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42  zero-filled BLOB
15f90 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
15fa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15fb0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
15fc0 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
15fd0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15fe0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
15ff0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16000 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16010 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
16020 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16030 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b  nt idx;.  int n;
16040 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
16050 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
16060 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
16070 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
16080 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29  v, "STMT IDX N")
16090 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
160a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
160b0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
160c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
160d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
160e0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
160f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16100 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16110 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16120 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16140 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16150 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16160 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20   objv[3], &n) ) 
16170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16180 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16190 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28  3_bind_zeroblob(
161a0 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a  pStmt, idx, n);.
161b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
161c0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
161d0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
161e0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
161f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16210 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16220 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
16230 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
16240 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
16250 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
16260 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
16270 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16280 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e  ite3_bind_int in
16290 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
162a0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
162b0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
162c0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
162d0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
162e0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
162f0 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
16300 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62  .** binds a 32-b
16310 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
16320 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
16330 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16340 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a   test_bind_int(.
16350 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
16360 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
16370 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
16380 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
16390 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
163a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
163b0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
163c0 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
163d0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
163e0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
163f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
16400 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
16410 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
16420 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
16430 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
16440 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
16450 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
16460 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16470 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16480 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
16490 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
164a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
164b0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
164c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
164d0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
164e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
164f0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
16500 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16510 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
16520 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16530 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
16540 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20  value) ) return 
16550 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
16560 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
16570 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  int(pStmt, idx, 
16580 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
16590 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
165a0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
165b0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
165c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
165d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
165e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
165f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16600 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16610 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
16620 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
16630 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54  bind_int64  STMT
16640 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
16650 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
16660 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72  bind_int64 inter
16670 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
16680 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16690 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
166a0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
166b0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
166c0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
166d0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
166e0 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
166f0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
16700 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
16710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
16720 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20  st_bind_int64(. 
16730 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16740 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16750 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16760 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16770 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16780 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16790 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
167a0 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  x;.  Tcl_WideInt
167b0 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
167c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
167d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
167e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
167f0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
16800 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
16810 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
16820 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
16830 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16840 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
16850 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16860 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
16870 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
16880 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
16890 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
168a0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
168b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
168c0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
168d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
168e0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
168f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16900 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
16910 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16920 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
16930 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16940 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
16950 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
16960 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
16970 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
16980 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
16990 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
169a0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
169b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
169c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
169d0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
169e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
169f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16a00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
16a10 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
16a20 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e  d_double  STMT N
16a30 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
16a40 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
16a50 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66  nd_double interf
16a60 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
16a70 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16a80 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
16a90 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
16aa0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
16ab0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
16ac0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
16ad0 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69  binds a 64-bit i
16ae0 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
16af0 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
16b00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16b10 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20  t_bind_double(. 
16b20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
16b30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
16b40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
16b50 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
16b60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
16b70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
16b80 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
16b90 78 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75  x;.  double valu
16ba0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  e;.  int rc;.  c
16bb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b  onst char *zVal;
16bc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
16bd0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
16be0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
16bf0 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
16c00 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63  Name of the spec
16c10 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ial floating poi
16c20 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
16c30 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70  unsigned int iUp
16c40 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20  per;   /* Upper 
16c50 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75  32 bits */.    u
16c60 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77  nsigned int iLow
16c70 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33  er;   /* Lower 3
16c80 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53  2 bits */.  } aS
16c90 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20  pecialFp[] = {. 
16ca0 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20     {  "NaN",    
16cb0 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78    0x7fffffff, 0x
16cc0 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
16cd0 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30  {  "SNaN",     0
16ce0 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  x7ff7ffff, 0xfff
16cf0 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
16d00 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66  "-NaN",     0xff
16d10 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
16d20 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53  ff },.    {  "-S
16d30 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66  NaN",    0xfff7f
16d40 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
16d50 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22  },.    {  "+Inf"
16d60 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30  ,     0x7ff00000
16d70 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
16d80 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20      {  "-Inf",  
16d90 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30     0xfff00000, 0
16da0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
16db0 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20   {  "Epsilon",  
16dc0 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x00000000, 0x00
16dd0 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
16de0 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38   "-Epsilon", 0x8
16df0 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  0000000, 0x00000
16e00 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e  001 },.    {  "N
16e10 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38  aN0",     0x7ff8
16e20 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
16e30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
16e40 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30  0",    0xfff8000
16e50 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
16e60 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
16e70 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
16e80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16e90 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16ea0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16eb0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
16ec0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16ed0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
16ee0 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
16ef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16f00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
16f10 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16f20 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16f30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16f40 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16f60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16f70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16f80 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16f90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16fa0 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74  ..  /* Intercept
16fb0 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e   the string "NaN
16fc0 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  " and generate a
16fd0 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69   NaN value for i
16fe0 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65  t..  ** All othe
16ff0 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61  r strings are pa
17000 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
17010 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
17020 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c  mObj()..  ** Tcl
17030 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
17040 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72  j() should under
17050 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20  stand "NaN" but 
17060 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20  some versions.  
17070 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  ** contain a bug
17080 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20  ..  */.  zVal = 
17090 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
170a0 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[3]);.  for(i=
170b0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65  0; i<sizeof(aSpe
170c0 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
170d0 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69  SpecialFp[0]); i
170e0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
170f0 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69  cmp(aSpecialFp[i
17100 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d  ].zName, zVal)==
17110 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
17120 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20  e3_uint64 x;.   
17130 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46     x = aSpecialF
17140 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20  p[i].iUpper;.   
17150 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20     x <<= 32;.   
17160 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c     x |= aSpecial
17170 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20  Fp[i].iLower;.  
17180 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
17190 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a  of(value)==8 );.
171a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
171b0 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20  zeof(x)==8 );.  
171c0 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75      memcpy(&valu
171d0 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20  e, &x, 8);.     
171e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
171f0 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
17200 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
17210 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
17220 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  0]) &&.         
17230 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
17240 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
17250 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b  v[3], &value) ){
17260 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17270 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
17280 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
17290 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
172a0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
172b0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
172c0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
172d0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
172e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
172f0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17300 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17310 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17320 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
17330 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17340 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
17350 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
17360 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
17370 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
17380 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
17390 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
173a0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
173b0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
173c0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
173d0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
173e0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
173f0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17400 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
17410 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
17420 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
17430 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
17440 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17450 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17460 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17470 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17480 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17490 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
174a0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
174b0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
174c0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
174d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
174e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
174f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17500 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
17510 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
17520 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
17530 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
17540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17550 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17560 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17570 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17580 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17590 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
175a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
175b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
175c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
175d0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
175e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
175f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
17600 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
17610 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
17620 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
17630 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
17640 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
17650 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
17660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17670 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
17680 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
17690 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
176a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
176b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
176c0 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
176d0 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
176e0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
176f0 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
17700 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17710 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17720 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17730 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17740 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
17750 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
17760 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
17770 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
17780 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
17790 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
177a0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
177b0 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
177c0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
177d0 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
177e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
177f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17800 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17810 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17820 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17830 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
17840 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
17850 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
17860 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
17870 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
17880 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
17890 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
178a0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
178b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
178c0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
178d0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
178e0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
178f0 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
17900 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
17910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17920 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
17930 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17940 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
17950 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
17960 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17970 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
17980 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17990 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
179a0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
179b0 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
179c0 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
179d0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
179e0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
179f0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
17a00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17a10 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
17a20 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
17a30 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17a40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17a50 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
17a60 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54  ue, bytes, SQLIT
17a70 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
17a80 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17a90 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
17aa0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
17ab0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
17ac0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
17ad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ae0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17af0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
17b00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
17b10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17b20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17b30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17b40 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17b50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
17b60 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20  ext16 ?-static? 
17b70 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
17b80 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
17b90 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
17ba0 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65  text16 interface
17bb0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17bc0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17bd0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17be0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17bf0 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
17c00 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
17c10 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
17c20 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69  ds a UTF-16 stri
17c30 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
17c40 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17c50 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
17c60 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
17c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17c80 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20  t_bind_text16(. 
17c90 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17ca0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17cb0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17cc0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17cd0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17cf0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
17d00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17d10 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
17d20 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
17d30 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
17d40 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  c;..  void (*xDe
17d50 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a  l)(void*) = (obj
17d60 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54  c==6?SQLITE_STAT
17d70 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  IC:SQLITE_TRANSI
17d80 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ENT);.  Tcl_Obj 
17d90 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76  *oStmt    = objv
17da0 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f  [objc-4];.  Tcl_
17db0 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20  Obj *oN       = 
17dc0 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20  objv[objc-3];.  
17dd0 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67  Tcl_Obj *oString
17de0 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d    = objv[objc-2]
17df0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79  ;.  Tcl_Obj *oBy
17e00 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  tes   = objv[obj
17e10 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  c-1];..  if( obj
17e20 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29  c!=5 && objc!=6)
17e30 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17e40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17e50 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17e60 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17e70 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17e80 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17e90 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17ea0 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
17eb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17ec0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17ed0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17ee0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17ef0 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20  tString(oStmt), 
17f00 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17f10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17f20 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17f30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20  Obj(interp, oN, 
17f40 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
17f50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75  CL_ERROR;.  valu
17f60 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  e = (char*)Tcl_G
17f70 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
17f80 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a  bj(oString, 0);.
17f90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17fa0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
17fb0 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29 20  oBytes, &bytes) 
17fc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17fd0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
17fe0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  te3_bind_text16(
17ff0 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69  pStmt, idx, (voi
18000 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73  d *)value, bytes
18010 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73  , xDel);.  if( s
18020 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
18030 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
18040 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
18050 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18060 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
18070 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
18080 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18090 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
180a0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
180b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
180c0 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
180d0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
180e0 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
180f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18100 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
18110 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
18120 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
18130 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
18140 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
18150 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
18160 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
18170 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18180 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
18190 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
181a0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
181b0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
181c0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
181d0 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
181e0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
181f0 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
18200 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
18210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18220 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
18230 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18240 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18250 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18260 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18270 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18280 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18290 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
182a0 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
182b0 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
182c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
182d0 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
182e0 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
182f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
18300 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
18310 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
18320 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18340 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18350 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
18360 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18370 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
18380 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
18390 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
183a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
183b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
183c0 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
183d0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
183e0 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
183f0 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
18400 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
18410 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18420 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18430 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18440 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18450 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
18460 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18470 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
18480 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18490 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
184a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
184b0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
184c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
184d0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
184e0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
184f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
18500 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
18510 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
18520 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
18530 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
18540 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
18550 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
18560 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
18570 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18580 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
18590 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
185a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
185b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
185c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
185d0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
185e0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
185f0 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
18600 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18610 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
18620 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
18630 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
18640 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
18650 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
18660 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18670 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18680 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18690 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
186a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
186b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
186c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
186d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
186e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
186f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
18700 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
18710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
18730 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18740 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18750 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
18760 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
18770 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
18780 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18790 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
187a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
187b0 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
187c0 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
187d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
187e0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
187f0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18800 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
18810 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18820 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
18830 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
18840 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
18850 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
18860 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
18870 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
18880 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
18890 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
188a0 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
188b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
188c0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
188d0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
188e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
188f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18900 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18910 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18920 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18930 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18940 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
18950 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
18960 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
18970 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
18980 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
18990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
189a0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
189b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
189c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
189d0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
189e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
189f0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18a00 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18a10 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
18a20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18a30 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
18a40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
18a50 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
18a60 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
18a70 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
18a80 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
18a90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
18aa0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18ab0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
18ac0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
18ad0 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
18ae0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18af0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
18b00 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
18b10 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
18b20 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
18b30 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
18b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
18b50 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
18b60 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
18b70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18b80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18b90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18ba0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18bb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18bc0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18bd0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
18be0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18bf0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18c00 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
18c10 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
18c20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18c30 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18c40 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18c50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18c60 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18c70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18c80 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
18c90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
18ca0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
18cb0 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
18cc0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
18cd0 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
18ce0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
18cf0 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
18d00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18d10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18d20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
18d30 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
18d40 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
18d50 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
18d60 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
18d70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18d80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18d90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18da0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18db0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18dc0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
18dd0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18de0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18df0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
18e00 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
18e10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18e20 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18e30 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
18e40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
18e50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
18e60 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
18e70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
18e80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18e90 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
18ea0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
18eb0 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
18ec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18ed0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18ee0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73  age:   sqlite3_s
18ef0 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44  leep MILLISECOND
18f00 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
18f10 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
18f20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
18f30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
18f40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
18f50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
18f60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
18f70 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
18f80 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18f90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
18fa0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
18fb0 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
18fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18fd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18fe0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
18ff0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
19000 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
19010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19020 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
19030 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19040 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
19050 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
19060 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
19070 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19080 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
19090 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42  ended_errcode DB
190a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
190b0 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
190c0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
190d0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
190e0 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
190f0 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
19100 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
19110 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19120 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f  ex_errcode(.  vo
19130 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19140 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19150 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19160 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19170 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19180 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
19190 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
191a0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
191b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
191c0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
191d0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
191e0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
191f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
19200 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
19210 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19220 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
19230 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
19240 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19250 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
19260 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19270 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
19280 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
19290 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  code(db);.  Tcl_
192a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
192b0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
192c0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
192d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
192e0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
192f0 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63  ge: sqlite3_errc
19300 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ode DB.**.** Ret
19310 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72  urn the string r
19320 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
19330 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
19340 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a   sqlite3_* API.*
19350 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e  * error code. e.
19360 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  g. "SQLITE_ERROR
19370 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
19380 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20   test_errcode(. 
19390 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
193a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
193b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
193c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
193d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
193e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
193f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19400 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
19410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19420 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19430 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19440 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19460 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
19470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
19480 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
19490 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
194a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
194b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
194c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
194d0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
194e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
194f0 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  b);.  Tcl_Append
19500 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
19510 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
19520 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
19530 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19540 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
19550 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44 42  qlite3_errmsg DB
19560 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
19570 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65  he UTF-8 represe
19580 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
19590 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
195a0 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
195b0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
195c0 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a  e3_* API call..*
195d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
195e0 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64  t_errmsg(.  void
195f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19600 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19610 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19620 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19630 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19640 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
19650 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a  st char *zErr;..
19660 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
19670 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19680 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19690 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
196a0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
196b0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
196c0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
196d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
196e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
196f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
19700 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19720 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
19730 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
19740 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
19750 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c  rrmsg(db);.  Tcl
19760 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
19770 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
19780 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29  ingObj(zErr, -1)
19790 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
197a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
197b0 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73  ge:   test_errms
197c0 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  g16 DB.**.** Ret
197d0 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20  urns the UTF-16 
197e0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
197f0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
19800 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
19810 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
19820 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
19830 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20  call. This is a 
19840 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63  byte array objec
19850 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a  t at the TCL .**
19860 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69   level, and it i
19870 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30  ncludes the 0x00
19880 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
19890 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
198a0 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d  d of the.** UTF-
198b0 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  16 string..*/.st
198c0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
198d0 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a  rmsg16(.  void *
198e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
198f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19900 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19910 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19920 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
19930 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
19940 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
19950 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
19960 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zErr;.  const c
19970 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79  har *z;.  int by
19980 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  tes = 0;..  if( 
19990 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
199a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
199b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
199c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
199d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
199e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
199f0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
19a00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19a10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19a20 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19a30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19a40 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19a50 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19a60 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
19a70 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
19a80 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72  6(db);.  if( zEr
19a90 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72  r ){.    z = zEr
19aa0 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73  r;.    for(bytes
19ab0 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20  =0; z[bytes] || 
19ac0 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65  z[bytes+1]; byte
19ad0 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63  s+=2){}.  }.  Tc
19ae0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
19af0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
19b00 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
19b10 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66   bytes));.#endif
19b20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
19b30 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
19b40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
19b50 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
19b60 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
19b70 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
19b80 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
19b90 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
19ba0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
19bb0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
19bc0 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
19bd0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
19be0 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
19bf0 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
19c00 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
19c10 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
19c20 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
19c30 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
19c40 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
19c50 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
19c60 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
19c70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19c80 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20  test_prepare(.  
19c90 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19ca0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19cb0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19cc0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19cd0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19ce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
19cf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
19d00 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  l;.  int bytes;.
19d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
19d20 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
19d30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19d40 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
19d50 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
19d60 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
19d70 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
19d80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19d90 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19da0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19db0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19dc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19dd0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
19de0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
19df0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
19e00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19e10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
19e20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19e30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19e40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
19e50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
19e60 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
19e70 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
19e80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19e90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
19ea0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
19eb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19ec0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
19ed0 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53  3_prepare(db, zS
19ee0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
19ef0 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
19f00 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f  ail : 0);.  Tcl_
19f10 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
19f20 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rp);.  if( sqlit
19f30 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
19f40 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
19f50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19f60 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26  ;.  if( zTail &&
19f70 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
19f80 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a  if( bytes>=0 ){.
19f90 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79        bytes = by
19fa0 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69  tes - (int)(zTai
19fb0 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  l-zSql);.    }. 
19fc0 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c     if( (int)strl
19fd0 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20  en(zTail)<bytes 
19fe0 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
19ff0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61   (int)strlen(zTa
1a000 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  il);.    }.    T
1a010 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1a020 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1a030 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1a040 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
1a050 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1a060 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a070 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
1a080 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 70 72  mt==0 );.    spr
1a090 69 6e 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29  intf(zBuf, "(%d)
1a0a0 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
1a0b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a0c0 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
1a0d0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
1a0e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a0f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a100 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1a110 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a120 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1a130 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1a140 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a150 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
1a160 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a170 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1a180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1a190 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a1a0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1a1b0 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62  pare_v2 DB sql b
1a1c0 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1a1d0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1a1e0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1a1f0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1a200 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1a210 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1a220 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1a230 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1a240 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1a250 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1a260 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1a270 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1a280 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1a290 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1a2a0 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1a2b0 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1a2c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a2d0 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20  st_prepare_v2(. 
1a2e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a2f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a300 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a310 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a320 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a330 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1a340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1a350 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
1a360 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a370 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
1a380 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a390 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1a3a0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
1a3b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1a3c0 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1a3d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a3e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a3f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a400 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a410 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a420 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1a430 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
1a440 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a450 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a460 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a470 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a480 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a490 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a4a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1a4b0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
1a4c0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
1a4d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a4e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a4f0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1a500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a510 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1a520 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1a530 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53  zSql, bytes, &pS
1a540 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26  tmt, objc>=5 ? &
1a550 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 61 73  zTail : 0);.  as
1a560 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
1a570 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
1a580 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
1a590 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
1a5a0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1a5b0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1a5c0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a5d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a  L_ERROR;.  if( z
1a5e0 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20  Tail && objc>=5 
1a5f0 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73  ){.    if( bytes
1a600 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74  >=0 ){.      byt
1a610 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e  es = bytes - (in
1a620 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a  t)(zTail-zSql);.
1a630 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62      }.    Tcl_Ob
1a640 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1a650 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c   objv[4], 0, Tcl
1a660 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
1a670 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b  ail, bytes), 0);
1a680 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
1a690 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a6a0 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
1a6b0 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   );.    sprintf(
1a6c0 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
1a6d0 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
1a6e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a6f0 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
1a700 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
1a710 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a720 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1a730 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1a740 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1a750 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1a760 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1a770 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a780 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
1a790 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a7a0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
1a7b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a7c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a7d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1a7e0 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a  tkt3134 DB.**.**
1a7f0 20 47 65 6e 65 72 61 74 65 20 61 20 70 72 65 70   Generate a prep
1a800 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66  ared statement f
1a810 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73  or a zero-byte s
1a820 74 72 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a  tring as a test.
1a830 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33  ** for ticket #3
1a840 31 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67  134.  The string
1a850 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65   should be prece
1a860 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79  ded by a zero by
1a870 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
1a880 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74  t test_prepare_t
1a890 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a  kt3134(.  void *
1a8a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1a8b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1a8c0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1a8d0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1a8e0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1a8f0 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69  te3 *db;.  stati
1a900 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71  c const char zSq
1a910 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43  l[] = "\000SELEC
1a920 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  T 1";.  sqlite3_
1a930 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1a940 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1a950 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1a960 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1a970 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a980 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1a990 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1a9a0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1a9b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a9c0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1a9d0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
1a9e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1a9f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1aa00 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1aa10 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1aa20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1aa30 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1aa40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1aa50 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1aa60 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b  re_v2(db, &zSql[
1aa70 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30  1], 0, &pStmt, 0
1aa80 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d  );.  assert(rc==
1aa90 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1aaa0 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71  mt==0);.  if( sq
1aab0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1aac0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1aad0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1aae0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1aaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ab00 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
1ab10 20 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   );.    sprintf(
1ab20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
1ab30 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
1ab40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ab50 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
1ab60 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
1ab70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ab80 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1ab90 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1aba0 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1abb0 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1abc0 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1abd0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1abe0 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
1abf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ac00 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
1ac10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1ac20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ac30 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1ac40 36 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  6 DB sql bytes t
1ac50 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ailvar.**.** Com
1ac60 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
1ac70 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
1ac80 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
1ac90 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
1aca0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1acb0 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
1acc0 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
1acd0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1ace0 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
1acf0 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
1ad00 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
1ad10 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
1ad20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
1ad30 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
1ad40 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1ad50 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
1ad60 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  re16(.  void * c
1ad70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ad80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ad90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ada0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1adb0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1adc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1add0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
1ade0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1adf0 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
1ae00 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
1ae10 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
1ae20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1ae30 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1ae40 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20   char zBuf[50]; 
1ae50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1ae60 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20   bytes;         
1ae70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ae80 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20  teger specified 
1ae90 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e  as arg 3 */.  in
1aea0 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20  t objlen;       
1aeb0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1aec0 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68  yte-array length
1aed0 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20   of arg 2 */..  
1aee0 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
1aef0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1af00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1af10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1af20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1af30 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1af40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1af50 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1af60 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20  tes ?tailvar?", 
1af70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1af80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1af90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1afa0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1afb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1afc0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1afd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1afe0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
1aff0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
1b000 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
1b010 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1b020 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1b030 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
1b040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b050 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
1b060 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c  e3_prepare16(db,
1b070 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1b080 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1b090 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69  &zTail : 0);.  i
1b0a0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1b0b0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1b0c0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1b0d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1b0e0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1b0f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1b100 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29  .  if( objc>=5 )
1b110 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20  {.    if( zTail 
1b120 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  ){.      objlen 
1b130 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29  = objlen - (int)
1b140 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
1b150 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
1b160 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
1b170 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
1b180 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
1b190 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
1b1a0 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
1b1b0 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
1b1c0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1b1d0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
1b1e0 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
1b1f0 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
1b200 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
1b210 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1b220 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1b230 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1b240 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1b250 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1b260 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1b270 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b280 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
1b290 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b2a0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
1b2b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b2c0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1b2d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b2e0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
1b2f0 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
1b300 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1b310 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1b320 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1b330 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1b340 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1b350 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1b360 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1b370 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1b380 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1b390 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1b3a0 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1b3b0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1b3c0 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1b3d0 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1b3e0 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1b3f0 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1b400 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1b410 74 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  t test_prepare16
1b420 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
1b430 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b440 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b450 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b460 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b470 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1b480 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b490 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1b4a0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
1b4b0 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
1b4c0 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
1b4d0 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
1b4e0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
1b4f0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1b500 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
1b510 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1b520 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
1b530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
1b540 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
1b550 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
1b560 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
1b570 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
1b580 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
1b590 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
1b5a0 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1b5b0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1b5c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1b5d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1b5e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1b5f0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1b600 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1b610 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1b620 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1b630 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b640 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1b650 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1b660 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b670 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b680 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1b690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1b6a0 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1b6b0 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
1b6c0 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
1b6d0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1b6e0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1b6f0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1b700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b710 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1b720 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64  3_prepare16_v2(d
1b730 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1b740 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1b750 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1b760 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1b770 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1b780 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1b790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1b7a0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1b7b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b7c0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1b7d0 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1b7e0 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1b7f0 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1b800 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1b810 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1b820 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1b830 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1b840 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1b850 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1b860 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1b870 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1b880 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1b890 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1b8a0 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1b8b0 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1b8c0 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1b8d0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1b8e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1b8f0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1b900 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1b910 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1b920 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1b930 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b940 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1b950 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b960 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1b970 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1b980 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1b990 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1b9a0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1b9b0 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f  _open filename ?
1b9c0 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f  options-list?.*/
1b9d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1b9e0 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20  _open(.  void * 
1b9f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ba00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ba10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1ba20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1ba30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
1ba40 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1ba50 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1ba60 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1ba70 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1ba80 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20  3 && objc!=2 && 
1ba90 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
1baa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bab0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1bac0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1bad0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1bae0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1baf0 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1bb00 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
1bb10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1bb20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1bb30 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a   zFilename = obj
1bb40 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72  c>1 ? Tcl_GetStr
1bb50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30  ing(objv[1]) : 0
1bb60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
1bb70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29  (zFilename, &db)
1bb80 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74  ;.  .  if( sqlit
1bb90 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1bba0 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1bbb0 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20  f, db) ) return 
1bbc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1bbd0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1bbe0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1bbf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1bc00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1bc10 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1bc20 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20   FILENAME FLAGS 
1bc30 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  VFS.*/.static in
1bc40 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 28 0a  t test_open_v2(.
1bc50 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bc60 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1bc70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1bc80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1bc90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1bca0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1bcb0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e  zFilename;.  con
1bcc0 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a 20  st char *zVfs;. 
1bcd0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
1bce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1bcf0 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
1bd00 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e  zBuf[100];..  in
1bd10 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f  t nFlag;.  Tcl_O
1bd20 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20 20 69  bj **apFlag;.  i
1bd30 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
1bd40 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1bd50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1bd60 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46  erp, 1, objv, "F
1bd70 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46  ILENAME FLAGS VF
1bd80 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  S");.    return 
1bd90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1bda0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
1bdb0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1bdc0 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20 54 63  1]);.  zVfs = Tc
1bdd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bde0 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56 66 73  [3]);.  if( zVfs
1bdf0 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56 66 73  [0]==0x00 ) zVfs
1be00 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 54 63   = 0;..  rc = Tc
1be10 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
1be20 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ents(interp, obj
1be30 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20 26 61  v[2], &nFlag, &a
1be40 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20 72 63  pFlag);.  if( rc
1be50 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
1be60 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n rc;.  for(i=0;
1be70 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a   i<nFlag; i++){.
1be80 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20      int iFlag;. 
1be90 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 46 6c     struct OpenFl
1bea0 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ag {.      const
1beb0 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a 20 20   char *zFlag;.  
1bec0 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20 20      int flag;.  
1bed0 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a    } aFlag[] = {.
1bee0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1bef0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c 20  OPEN_READONLY", 
1bf00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1bf10 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ONLY },.      { 
1bf20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  "SQLITE_OPEN_REA
1bf30 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54 45 5f  DWRITE", SQLITE_
1bf40 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d  OPEN_READWRITE }
1bf50 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1bf60 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22 2c 20  E_OPEN_CREATE", 
1bf70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1bf80 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  TE },.      { "S
1bf90 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1bfa0 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c 49 54  EONCLOSE", SQLIT
1bfb0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1bfc0 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20  LOSE },.      { 
1bfd0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43  "SQLITE_OPEN_EXC
1bfe0 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54 45 5f  LUSIVE", SQLITE_
1bff0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7d  OPEN_EXCLUSIVE }
1c000 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1c010 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
1c020 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41  ", SQLITE_OPEN_A
1c030 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20 20 20  UTOPROXY },.    
1c040 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c050 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c 49 54  _MAIN_DB", SQLIT
1c060 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d  E_OPEN_MAIN_DB }
1c070 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1c080 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 22 2c  E_OPEN_TEMP_DB",
1c090 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1c0a0 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20  P_DB },.      { 
1c0b0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  "SQLITE_OPEN_TRA
1c0c0 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51 4c 49  NSIENT_DB", SQLI
1c0d0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1c0e0 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20  T_DB },.      { 
1c0f0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  "SQLITE_OPEN_MAI
1c100 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  N_JOURNAL", SQLI
1c110 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1c120 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1c130 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  "SQLITE_OPEN_TEM
1c140 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49  P_JOURNAL", SQLI
1c150 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
1c160 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1c170 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  "SQLITE_OPEN_SUB
1c180 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45  JOURNAL", SQLITE
1c190 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1c1a0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1c1b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1c1c0 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45  JOURNAL", SQLITE
1c1d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1c1e0 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1c1f0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d  "SQLITE_OPEN_NOM
1c200 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50  UTEX", SQLITE_OP
1c210 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20 20  EN_NOMUTEX },.  
1c220 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1c230 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c 20 53  EN_FULLMUTEX", S
1c240 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
1c250 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20  UTEX },.      { 
1c260 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41  "SQLITE_OPEN_SHA
1c270 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c 49 54  REDCACHE", SQLIT
1c280 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
1c290 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  HE },.      { "S
1c2a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
1c2b0 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49 54 45  TECACHE", SQLITE
1c2c0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
1c2d0 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  HE },.      { "S
1c2e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c  QLITE_OPEN_WAL",
1c2f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
1c300 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1c310 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c 20 53  ITE_OPEN_URI", S
1c320 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 7d  QLITE_OPEN_URI }
1c330 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d  ,.      { 0, 0 }
1c340 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63 20 3d  .    };.    rc =
1c350 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
1c360 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72  mObjStruct(inter
1c370 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20 61 46  p, apFlag[i], aF
1c380 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c 61  lag, sizeof(aFla
1c390 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20  g[0]), .        
1c3a0 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46 6c 61  "flag", 0, &iFla
1c3b0 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
1c3c0 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
1c3d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66 6c 61  turn rc;.    fla
1c3e0 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46 6c 61  gs |= aFlag[iFla
1c3f0 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20  g].flag;.  }..  
1c400 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
1c410 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  n_v2(zFilename, 
1c420 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66 73  &db, flags, zVfs
1c430 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c440 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1c450 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1c460 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
1c470 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
1c480 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c490 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1c4a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c4b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c4c0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66 69  qlite3_open16 fi
1c4d0 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a  lename options.*
1c4e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1c4f0 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64  t_open16(.  void
1c500 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c510 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c520 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c530 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c540 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1c550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c560 55 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f  UTF16.  const vo
1c570 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  id *zFilename;. 
1c580 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1c590 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1c5a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1c5b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1c5c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c5d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1c5e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1c5f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1c600 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66  ng(objv[0]), " f
1c610 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d  ilename options-
1c620 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72  list", 0);.    r
1c630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c640 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d  .  }..  zFilenam
1c650 65 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  e = Tcl_GetByteA
1c660 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1c670 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  [1], 0);.  sqlit
1c680 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e  e3_open16(zFilen
1c690 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
1c6a0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1c6b0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1c6c0 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1c6d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c6e0 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1c6f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1c700 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1c710 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1c720 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1c730 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c740 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c750 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46  _complete16 <UTF
1c760 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a  -16 string>.**.*
1c770 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
1c780 65 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d  e supplied argum
1c790 65 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  ent is a complet
1c7a0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c  e SQL statement,
1c7b0 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65   or zero.** othe
1c7c0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
1c7d0 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d 70 6c 65   int test_comple
1c7e0 74 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  te16(.  void * c
1c7f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c800 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c810 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c820 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c830 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66  jv[].){.#if !def
1c840 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1c850 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26 20 21 64  _COMPLETE) && !d
1c860 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1c870 49 54 5f 55 54 46 31 36 29 0a 20 20 63 68 61 72  IT_UTF16).  char
1c880 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f   *zBuf;..  if( o
1c890 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c8a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1c8b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1c8c0 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b  "<utf-16 sql>");
1c8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c8e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42  ERROR;.  }..  zB
1c8f0 75 66 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  uf = (char*)Tcl_
1c900 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1c910 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
1c920 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c930 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c940 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
1c950 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75  3_complete16(zBu
1c960 66 29 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  f)));.#endif /* 
1c970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1c980 4c 45 54 45 20 26 26 20 53 51 4c 49 54 45 5f 4f  LETE && SQLITE_O
1c990 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1c9a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c9b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1c9c0 6c 69 74 65 33 5f 73 74 65 70 20 53 54 4d 54 0a  lite3_step STMT.
1c9d0 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  **.** Advance th
1c9e0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 74  e statement to t
1c9f0 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a  he next row..*/.
1ca00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ca10 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  step(.  void * c
1ca20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1ca30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1ca40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1ca50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1ca60 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1ca70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1ca80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1ca90 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1caa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1cab0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1cac0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1cad0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1cae0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1caf0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  [0]), " STMT", 0
1cb00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cb10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1cb20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1cb30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1cb40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1cb50 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1cb60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cb70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
1cb80 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f 2a  ep(pStmt);..  /*
1cb90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cba0 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c 49  DONE && rc!=SQLI
1cbb0 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e 20  TE_ROW ) return 
1cbc0 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20 20  TCL_ERROR; */.  
1cbd0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1cbe0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1cbf0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
1cc00 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1cc10 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1cc20 74 20 74 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f  t test_sql(.  vo
1cc30 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cc40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1cc50 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cc60 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cc70 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1cc80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1cc90 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1cca0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1ccb0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1ccc0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
1ccd0 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
1cce0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ccf0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1cd00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cd10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cd20 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1cd30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cd40 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1cd50 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1cd60 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53  *)sqlite3_sql(pS
1cd70 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  tmt), TCL_VOLATI
1cd80 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  LE);.  return TC
1cd90 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1cda0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1cdb0 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20  lumn_count STMT 
1cdc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1cdd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1cde0 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
1cdf0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
1ce00 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
1ce10 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1ce20 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  n_count(.  void 
1ce30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ce40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ce50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ce60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ce70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1ce80 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ce90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1cea0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ceb0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1cec0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ced0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1cee0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1cef0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1cf00 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1cf10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cf20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1cf30 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1cf40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1cf50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1cf60 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1cf70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1cf80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1cf90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1cfa0 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
1cfb0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
1cfc0 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
1cfd0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cfe0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1cff0 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d  _column_type STM
1d000 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1d010 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f  eturn the type o
1d020 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  f the data in co
1d030 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
1d040 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1d050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d060 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
1d070 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d080 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d090 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d0a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d0b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d0c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d0d0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d0e0 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a   col;.  int tp;.
1d0f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1d100 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1d110 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1d120 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1d130 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1d140 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1d150 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1d160 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1d170 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d180 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d190 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1d1a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1d1b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1d1c0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1d1d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1d1e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1d1f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1d200 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1d210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d220 0a 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f  .  tp = sqlite3_
1d230 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d  column_type(pStm
1d240 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63  t, col);.  switc
1d250 68 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73  h( tp ){.    cas
1d260 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52  e SQLITE_INTEGER
1d270 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  : .      Tcl_Set
1d280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1d290 49 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54  INTEGER", TCL_ST
1d2a0 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1d2b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1d2c0 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20  LITE_NULL:.     
1d2d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1d2e0 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54  nterp, "NULL", T
1d2f0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1d300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1d310 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a  se SQLITE_FLOAT:
1d320 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1d330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c  sult(interp, "FL
1d340 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  OAT", TCL_STATIC
1d350 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1d360 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1d370 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c  _TEXT:.      Tcl
1d380 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1d390 70 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53  p, "TEXT", TCL_S
1d3a0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1d3b0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d3c0 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20  QLITE_BLOB:.    
1d3d0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1d3e0 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20  interp, "BLOB", 
1d3f0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1d400 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
1d410 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
1d420 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20  sert(0);.  }..  
1d430 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d440 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1d450 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1d460 74 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  t64 STMT column.
1d470 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1d480 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
1d490 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
1d4a0 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74  current row cast
1d4b0 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28   as an.** wide (
1d4c0 36 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e  64-bit) integer.
1d4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d4e0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
1d4f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d500 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d510 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d520 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d530 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d540 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d550 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d560 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c   col;.  i64 iVal
1d570 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1d580 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1d590 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1d5a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1d5b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1d5c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1d5d0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1d5e0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1d5f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d600 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1d610 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1d620 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1d630 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1d640 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1d650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d660 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1d670 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1d680 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1d690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d6a0 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73 71 6c 69  ;..  iVal = sqli
1d6b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1d6c0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1d6d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1d6e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1d6f0 57 69 64 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29  WideIntObj(iVal)
1d700 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1d710 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1d720 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d730 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c  mn_blob STMT col
1d740 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
1d750 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c  t test_column_bl
1d760 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
1d770 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1d780 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1d790 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1d7a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1d7b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1d7c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1d7d0 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e 74 20 6c  nt col;..  int l
1d7e0 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  en;.  const void
1d7f0 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20   *pBlob;..  if( 
1d800 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1d810 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1d820 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1d830 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1d840 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1d850 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d860 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1d870 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1d880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d890 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1d8a0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1d8b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1d8c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1d8d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d8e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1d8f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1d900 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1d910 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1d920 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c 65 6e 20  L_ERROR;..  len 
1d930 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d940 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 63 6f  _bytes(pStmt, co
1d950 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20 73 71  l);.  pBlob = sq
1d960 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1d970 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  b(pStmt, col);. 
1d980 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1d990 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d9a0 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 70 42  wByteArrayObj(pB
1d9b0 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20 20 72 65  lob, len));.  re
1d9c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d9d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d9e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
1d9f0 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  le STMT column.*
1da00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1da10 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
1da20 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
1da30 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20  urrent row cast 
1da40 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a  as a double..*/.
1da50 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1da60 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 0a 20  column_double(. 
1da70 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1da80 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1da90 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1daa0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1dab0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1dac0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1dad0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1dae0 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56 61 6c  l;.  double rVal
1daf0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1db00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1db10 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1db20 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1db30 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1db40 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1db50 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1db60 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1db70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1db80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1db90 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1dba0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1dbb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1dbc0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1dbd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1dbe0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1dbf0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1dc00 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1dc10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dc20 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71 6c 69  ;..  rVal = sqli
1dc30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  te3_column_doubl
1dc40 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  e(pStmt, col);. 
1dc50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1dc60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1dc70 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61 6c 29  wDoubleObj(rVal)
1dc80 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1dc90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1dca0 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61 74 61  ge: sqlite3_data
1dcb0 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a  _count STMT .**.
1dcc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1dcd0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1dce0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
1dcf0 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54  sql statement ST
1dd00 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
1dd10 74 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e  t test_data_coun
1dd20 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1dd30 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1dd40 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dd50 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1dd60 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1dd70 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1dd80 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
1dd90 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1dda0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ddb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ddc0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ddd0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1dde0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ddf0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1de00 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1de10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1de20 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1de30 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1de40 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1de50 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1de60 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1de70 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
1de80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1de90 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1dea0 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  bj(sqlite3_data_
1deb0 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1dec0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ded0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1dee0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1def0 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  text STMT column
1df00 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1df10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
1df20 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ltype STMT colum
1df30 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1df40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
1df50 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  me STMT column.*
1df60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1df70 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76  t_stmt_utf8(.  v
1df80 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1df90 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
1dfa0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1dfb0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1dfc0 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c   invoke */.  Tcl
1dfd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1dfe0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1dff0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1e000 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1e010 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1e020 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73   int col;.  cons
1e030 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29  t char *(*xFunc)
1e040 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1e050 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  int);.  const ch
1e060 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75  ar *zRet;..  xFu
1e070 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  nc = (const char
1e080 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1e090 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1e0a0 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1e0b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1e0c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e0d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e0e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e0f0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e100 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e110 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1e120 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1e130 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e140 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1e150 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1e160 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e170 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1e180 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e190 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1e1a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1e1b0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1e1c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e1d0 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46  ROR;.  zRet = xF
1e1e0 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  unc(pStmt, col);
1e1f0 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
1e200 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1e210 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1e220 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  )zRet, 0);.  }. 
1e230 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e240 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
1e250 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  st_global_recove
1e260 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
1e270 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e280 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e290 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e2a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e2b0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1e2c0 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
1e2d0 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  TED.  int rc;.  
1e2e0 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
1e2f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1e300 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1e310 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65  bjv, "");.    re
1e320 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e330 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1e340 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65  e3_global_recove
1e350 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  r();.  Tcl_SetRe
1e360 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e370 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
1e380 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
1e390 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1e3a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e3b0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e3c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53  e3_column_text S
1e3d0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1e3e0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e3f0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20  column_decltype 
1e400 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1e410 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1e420 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d  _column_name STM
1e430 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
1e440 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1e450 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a  _utf16(.  void *
1e460 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
1e470 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
1e480 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
1e490 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
1e4a0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1e4b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e4c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e4d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e4e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1e4f0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
1e500 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1e510 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54  ;.  int col;.  T
1e520 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
1e530 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
1e540 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  e16;.  const voi
1e550 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  d *(*xFunc)(sqli
1e560 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
1e570 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e  ..  xFunc = (con
1e580 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c  st void *(*)(sql
1e590 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
1e5a0 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
1e5b0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1e5c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e5d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e5e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e5f0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1e600 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e610 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1e620 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1e630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e640 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1e650 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1e660 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1e670 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1e680 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1e690 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1e6a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1e6b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1e6c0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1e6d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
1e6e0 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70  Name16 = xFunc(p
1e6f0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
1e700 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20  ( zName16 ){.   
1e710 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73   int n;.    cons
1e720 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d  t char *z = zNam
1e730 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  e16;.    for(n=0
1e740 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d  ; z[n] || z[n+1]
1e750 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52  ; n+=2){}.    pR
1e760 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  et = Tcl_NewByte
1e770 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36  ArrayObj(zName16
1e780 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f  , n+2);.    Tcl_
1e790 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1e7a0 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a  erp, pRet);.  }.
1e7b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1e7c0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
1e7d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e7f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1e800 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  int STMT column.
1e810 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1e820 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1e830 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  s STMT column.**
1e840 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e850 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
1e860 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  6 STMT column.**
1e870 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e880 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20  est_stmt_int(.  
1e890 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e8a0 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  a,    /* Pointer
1e8b0 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
1e8c0 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
1e8d0 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  voked */.  Tcl_I
1e8e0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1e8f0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1e900 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1e910 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1e920 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1e930 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a  nt col;.  int (*
1e940 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
1e950 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78  tmt*, int);..  x
1e960 46 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28  Func = (int (*)(
1e970 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1e980 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1e990 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1e9a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1e9b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1e9c0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1e9d0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1e9e0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1e9f0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1ea00 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1ea10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ea20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1ea30 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1ea40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1ea50 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ea60 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1ea70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1ea80 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1ea90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1eaa0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1eab0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1eac0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1ead0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1eae0 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70  ewIntObj(xFunc(p
1eaf0 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20  Stmt, col)));.  
1eb00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1eb10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1eb20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1eb30 20 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42    DB  MAGIC-NUMB
1eb40 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  ER.**.** Set the
1eb50 20 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65   db->magic value
1eb60 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1eb70 74 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65  to test error re
1eb80 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f  covery logic..*/
1eb90 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
1eba0 74 65 5f 73 65 74 5f 6d 61 67 69 63 28 0a 20 20  te_set_magic(.  
1ebb0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ebc0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ebd0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1ebe0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1ebf0 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1ec00 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1ec10 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1ec20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ec30 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ec40 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ec50 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
1ec60 20 20 20 22 20 44 42 20 4d 41 47 49 43 22 2c 20     " DB MAGIC", 
1ec70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ec80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1ec90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1eca0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1ecb0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1ecc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1ecd0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1ece0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f   "SQLITE_MAGIC_O
1ecf0 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  PEN")==0 ){.    
1ed00 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1ed10 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
1ed20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1ed30 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1ed40 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22  TE_MAGIC_CLOSED"
1ed50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1ed60 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1ed70 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d  AGIC_CLOSED;.  }
1ed80 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1ed90 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1eda0 5f 4d 41 47 49 43 5f 42 55 53 59 22 29 3d 3d 30  _MAGIC_BUSY")==0
1edb0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1edc0 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1edd0 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69  _BUSY;.  }else i
1ede0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1edf0 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1ee00 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20  _ERROR")==0 ){. 
1ee10 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1ee20 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
1ee30 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54  R;.  }else if( T
1ee40 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
1ee50 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a  , argv[2], (int*
1ee60 29 26 64 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a  )&db->magic) ){.
1ee70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1ee80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
1ee90 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1eea0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1eeb0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 20 20 44  te3_interrupt  D
1eec0 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72  B .**.** Trigger
1eed0 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 6f 6e   an interrupt on
1eee0 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
1eef0 74 20 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74  t test_interrupt
1ef00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ef10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ef20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ef30 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1ef40 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1ef50 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1ef60 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  rgc!=2 ){.    Tc
1ef70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ef80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1ef90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1efa0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 22 20  \"", argv[0], " 
1efb0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1efc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1efd0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1efe0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1eff0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1f000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f010 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
1f020 75 70 74 28 64 62 29 3b 0a 20 20 72 65 74 75 72  upt(db);.  retur
1f030 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1f040 74 69 63 20 75 38 20 2a 73 71 6c 69 74 65 33 5f  tic u8 *sqlite3_
1f050 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1f060 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20   0;../*.** Fill 
1f070 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20 61  the stack with a
1f080 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74 74 65 72   known bitpatter
1f090 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f0a0 64 20 70 72 65 70 53 74 61 63 6b 28 76 6f 69 64  d prepStack(void
1f0b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 33  ){.  int i;.  u3
1f0c0 32 20 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  2 bigBuf[65536];
1f0d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1f0e0 7a 65 6f 66 28 62 69 67 42 75 66 29 2f 73 69 7a  zeof(bigBuf)/siz
1f0f0 65 6f 66 28 62 69 67 42 75 66 5b 30 5d 29 3b 20  eof(bigBuf[0]); 
1f100 69 2b 2b 29 20 62 69 67 42 75 66 5b 69 5d 20 3d  i++) bigBuf[i] =
1f110 20 30 78 64 65 61 64 62 65 65 66 3b 0a 20 20 73   0xdeadbeef;.  s
1f120 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
1f130 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29 26 62 69  eline = (u8*)&bi
1f140 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a 7d 0a 0a  gBuf[65536];.}..
1f150 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 63 75  /*.** Get the cu
1f160 72 72 65 6e 74 20 73 74 61 63 6b 20 64 65 70 74  rrent stack dept
1f170 68 2e 20 20 55 73 65 64 20 66 6f 72 20 64 65 62  h.  Used for deb
1f180 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
1f190 75 36 34 20 73 71 6c 69 74 65 33 53 74 61 63 6b  u64 sqlite3Stack
1f1a0 44 65 70 74 68 28 76 6f 69 64 29 7b 0a 20 20 75  Depth(void){.  u
1f1b0 38 20 78 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  8 x;.  return (u
1f1c0 36 34 29 28 73 71 6c 69 74 65 33 5f 73 74 61 63  64)(sqlite3_stac
1f1d0 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20 26 78 29  k_baseline - &x)
1f1e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f1f0 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  :  sqlite3_stack
1f200 5f 75 73 65 64 20 44 42 20 53 51 4c 0a 2a 2a 0a  _used DB SQL.**.
1f210 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61 73 75 72  ** Try to measur
1f220 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
1f230 73 74 61 63 6b 20 73 70 61 63 65 20 75 73 65 64  stack space used
1f240 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
1f250 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f 0a 73 74  lite3_exec.*/.st
1f260 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
1f270 61 63 6b 5f 75 73 65 64 28 0a 20 20 76 6f 69 64  ack_used(.  void
1f280 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f290 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f2a0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1f2b0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1f2c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f2d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1f2e0 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1f2f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f300 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1f310 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1f320 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1f330 20 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c          " DB SQL
1f340 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f360 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1f370 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1f380 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1f390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f3a0 70 72 65 70 53 74 61 63 6b 28 29 3b 0a 20 20 28  prepStack();.  (
1f3b0 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78 65  void)sqlite3_exe
1f3c0 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30  c(db, argv[2], 0
1f3d0 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  , 0, 0);.  for(i
1f3e0 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20 26 26 20  =65535; i>=0 && 
1f3f0 28 28 75 33 32 2a 29 73 71 6c 69 74 65 33 5f 73  ((u32*)sqlite3_s
1f400 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 29 5b 2d  tack_baseline)[-
1f410 69 5d 3d 3d 30 78 64 65 61 64 62 65 65 66 3b 20  i]==0xdeadbeef; 
1f420 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f 53 65 74  i--){}.  Tcl_Set
1f430 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f440 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1f450 69 2a 34 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  i*4));.  return 
1f460 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f470 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64   Usage: sqlite_d
1f480 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44  elete_function D
1f490 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a  B function-name.
1f4a0 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
1f4b0 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 27   user function '
1f4c0 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  function-name' f
1f4d0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1f4e0 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73  dle DB. It.** is
1f4f0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1f500 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  e user function 
1f510 77 61 73 20 63 72 65 61 74 65 64 20 61 73 20 55  was created as U
1f520 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20  TF8, any number 
1f530 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  of.** arguments 
1f540 28 74 68 65 20 77 61 79 20 74 68 65 20 54 43 4c  (the way the TCL
1f550 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20   interface does 
1f560 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  it)..*/.static i
1f570 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  nt delete_functi
1f580 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
1f590 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1f5a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1f5b0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1f5c0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
1f5d0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1f5e0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1f5f0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1f600 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f610 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1f620 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1f630 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1f640 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e     " DB function
1f650 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  -name", 0);.    
1f660 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f680 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f690 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f6a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6b0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f6c0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
1f6d0 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d  n(db, argv[2], -
1f6e0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
1f6f0 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 54  0, 0, 0, 0);.  T
1f700 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1f710 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1f720 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1f730 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
1f740 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f750 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f760 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
1f770 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69 6f 6e  ion DB collation
1f780 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
1f790 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  te the collation
1f7a0 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c 6c 61   sequence 'colla
1f7b0 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
1f7c0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1f7d0 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20 61 73  .** DB. It is as
1f7e0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1f7f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1f800 65 20 77 61 73 20 63 72 65 61 74 65 64 20 61 73  e was created as
1f810 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a 20 77   UTF8 (the .** w
1f820 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  ay the TCL inter
1f830 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a  face does it)..*
1f840 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c  /.static int del
1f850 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ete_collation(. 
1f860 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f870 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1f880 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1f890 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1f8a0 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
1f8b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1f8c0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1f8d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f8e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1f8f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1f900 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1f910 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1f920 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1f930 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f950 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1f960 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1f970 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1f980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f990 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1f9a0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
1f9b0 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54  , argv[2], SQLIT
1f9c0 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20  E_UTF8, 0, 0);. 
1f9d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1f9e0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
1f9f0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
1fa00 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
1fa10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fa20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1fa30 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
1fa40 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  mmit DB.**.** Re
1fa50 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
1fa60 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73 20   database DB is 
1fa70 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74  currently in aut
1fa80 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a  o-commit mode..*
1fa90 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
1faa0 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1fab0 20 69 6e 74 20 67 65 74 5f 61 75 74 6f 63 6f 6d   int get_autocom
1fac0 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
1fad0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1fae0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1faf0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1fb00 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ar **argv.){.  c
1fb10 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
1fb20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1fb30 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1fb40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1fb50 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1fb60 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1fb70 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1fb80 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22  , .        " DB"
1fb90 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1fba0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fbb0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1fbc0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
1fbd0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
1fbe0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
1fbf0 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64  printf(zBuf, "%d
1fc00 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  ", sqlite3_get_a
1fc10 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a  utocommit(db));.
1fc20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1fc30 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1fc40 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1fc50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1fc60 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75  sage: sqlite3_bu
1fc70 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53  sy_timeout DB MS
1fc80 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  .**.** Set the b
1fc90 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68  usy timeout.  Th
1fca0 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c  is is more easil
1fcb0 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65  y done using the
1fcc0 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68   timeout.** meth
1fcd0 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e  od of the TCL in
1fce0 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65  terface.  But we
1fcf0 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74   need a way to t
1fd00 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  est the case.** 
1fd10 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73  where it returns
1fd20 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a   SQLITE_MISUSE..
1fd30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1fd40 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  st_busy_timeout(
1fd50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fd60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fd70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fd80 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1fd90 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1fda0 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33  c, ms;.  sqlite3
1fdb0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1fdc0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1fdd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1fde0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1fdf0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1fe00 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1fe10 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1fe20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1fe30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1fe40 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1fe50 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1fe60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1fe70 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1fe80 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1fe90 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
1fea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1feb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1fec0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
1fed0 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   ms);.  Tcl_Appe
1fee0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1fef0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1ff00 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1ff10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ff20 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
1ff30 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
1ff40 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
1ff50 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1ff60 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
1ff70 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
1ff80 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
1ff90 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
1ffa0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1ffb0 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
1ffc0 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
1ffd0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ffe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1fff0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
20000 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20010 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
20020 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
20030 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20040 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20050 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20060 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
20070 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20080 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
20090 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
200a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
200b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
200c0 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
200d0 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
200e0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
200f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
20100 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
20110 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
20120 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
20130 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
20140 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
20150 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
20160 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20170 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20180 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
20190 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  emory ?N?.**.** 
201a0 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
201b0 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
201c0 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74  tly held but not
201d0 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
201e0 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  ed..** The integ
201f0 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
20200 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61  er of bytes we a
20210 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c  re trying to rel
20220 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72  ease.  The .** r
20230 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
20240 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
20250 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  ory actually rel
20260 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eased..*/.static
20270 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73   int test_releas
20280 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
20290 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
202a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
202b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
202c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
202d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
202e0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
202f0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
20300 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
20310 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
20320 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e  _DISKIO).  int N
20330 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
20340 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
20350 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20360 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20370 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20380 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
20390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
203a0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
203b0 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
203c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
203d0 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
203e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
203f0 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
20400 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20    N = -1;.  }.  
20410 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  amt = sqlite3_re
20420 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b  lease_memory(N);
20430 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
20440 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
20450 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  NewIntObj(amt));
20460 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
20470 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
20480 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
20490 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
204a0 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  mory DB.**.** At
204b0 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
204c0 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
204d0 79 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61  y held by databa
204e0 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74  se DB.  Return t
204f0 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64  he.** result cod
20500 65 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20  e (which in the 
20510 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
20520 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  tation is always
20530 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69   zero)..*/.stati
20540 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65  c int test_db_re
20550 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
20560 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20570 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20580 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20590 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
205a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
205b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
205c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
205d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
205e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
205f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
20600 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
20610 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20620 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
20630 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
20640 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
20650 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
20660 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
20670 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  c = sqlite3_db_r
20680 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62  elease_memory(db
20690 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
206a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
206b0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
206c0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
206d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
206e0 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e:  sqlite3_db_f
206f0 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d  ilename DB DBNAM
20700 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
20710 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
20720 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
20730 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  h a database..*/
20740 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
20750 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20  _db_filename(.  
20760 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20770 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20780 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20790 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
207a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
207b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
207c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
207d0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Name;.  if( objc
207e0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
207f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
20800 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
20810 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
20820 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20830 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
20840 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20850 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20860 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
20870 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20880 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c  .  zDbName = Tcl
20890 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
208a0 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
208b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
208c0 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
208d0 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
208e0 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72  , (void*)0);.  r
208f0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20900 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20910 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
20920 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a  ly DB DBNAME.**.
20930 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  ** Return 1 or 0
20940 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65   if DBNAME is re
20950 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20  adonly or not.  
20960 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e  Return -1 if DBN
20970 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  AME does.** not 
20980 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  exist..*/.static
20990 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61   int test_db_rea
209a0 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
209b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
209c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
209d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
209e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
209f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20a00 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
20a10 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
20a20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
20a30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
20a40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
20a50 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
20a60 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
20a70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20a80 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20a90 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20aa0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20ab0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20ac0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
20ad0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
20ae0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
20af0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
20b00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
20b10 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
20b20 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a  b_readonly(db, z
20b30 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74  DbName)));.  ret
20b40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20b50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
20b60 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
20b70 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51  imit ?N?.**.** Q
20b80 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
20b90 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20  soft heap limit 
20ba0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20bb0 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20  thread.  The.** 
20bc0 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68  limit is only ch
20bd0 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69  anged if the N i
20be0 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  s present.  The 
20bf0 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a  previous limit.*
20c00 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
20c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20c20 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
20c30 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
20c40 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20c50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20c60 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20c70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20c80 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ].){.  sqlite3_i
20c90 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f  nt64 amt;.  Tcl_
20ca0 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a  WideInt N = -1;.
20cb0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
20cc0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20cd0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20ce0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20cf0 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
20d00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20d10 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
20d20 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
20d30 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
20d40 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
20d50 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
20d60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
20d70 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
20d80 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
20d90 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  4(N);.  Tcl_SetO
20da0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20db0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
20dc0 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75  bj(amt));.  retu
20dd0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20de0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
20df0 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
20e00 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
20e10 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
20e20 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
20e30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20e40 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
20e50 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
20e60 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
20e70 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
20e80 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
20e90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20ea0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
20eb0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
20ec0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
20ed0 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
20ee0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
20ef0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20f00 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
20f10 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
20f20 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
20f30 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
20f40 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
20f50 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
20f60 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
20f70 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
20f80 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
20f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20fa0 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
20fb0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
20fc0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20fd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20fe0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20ff0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21000 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
21010 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
21020 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f  nt v, *a;.  Tcl_
21030 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20  Obj *pResult;.. 
21040 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
21050 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
21060 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
21070 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
21080 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
21090 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
210a0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
210b0 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
210c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
210d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
210e0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
210f0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
21100 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
21110 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
21120 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20  RROR;.  pResult 
21130 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
21140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
21150 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
21160 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
21170 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  Bt==0 ){.      v
21180 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
21190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
211a0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
211b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20  mutex);.      a 
211c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
211d0 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
211e0 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
211f0 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
21200 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71  = a[0];.      sq
21210 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
21220 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
21230 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
21240 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
21250 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
21260 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
21270 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
21280 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
21290 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
212a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
212b0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f  .** tclcmd:   wo
212c0 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a  rking_64bit_int.
212d0 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62  **.** Some TCL b
212e0 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69  uilds (ex: cygwi
212f0 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  n) do not suppor
21300 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  t 64-bit integer
21310 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64  s.  This.** lead
21320 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66  s to a number of
21330 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20   test failures. 
21340 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d   The present com
21350 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a  mand checks the.
21360 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20  ** TCL build to 
21370 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
21380 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36  ot it supports 6
21390 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
213a0 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54   It.** returns T
213b0 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61  RUE if it does a
213c0 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
213d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
213e0 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77  and is used to w
213f0 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74  arn users that t
21400 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69  heir TCL build i
21410 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61  s defective.** a
21420 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  nd that the erro
21430 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69  rs they are seei
21440 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ng in the test s
21450 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a  cripts might be.
21460 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  ** a result of t
21470 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54  heir defective T
21480 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  CL rather than p
21490 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74  roblems in SQLit
214a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
214b0 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
214c0 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
214d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
214e0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
214f0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
21500 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
21510 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
21520 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
21530 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
21540 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
21550 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
21560 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
21570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
21580 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
21590 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
215a0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
215b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
215c0 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62  Tcl_Obj *pTestOb
215d0 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67  j;.  int working
215e0 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62   = 0;..  pTestOb
215f0 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
21600 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69  ntObj(1000000*(i
21610 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a  64)1234567890);.
21620 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63    working = strc
21630 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
21640 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33  (pTestObj), "123
21650 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d  4567890000000")=
21660 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  =0;.  Tcl_DecrRe
21670 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29  fCount(pTestObj)
21680 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
21690 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
216a0 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77  _NewBooleanObj(w
216b0 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75  orking));.  retu
216c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
216d0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
216e0 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a  fs_unlink_test.*
216f0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
21700 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72  mmand unregister
21710 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46  s the primary VF
21720 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73  S and then regis
21730 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20  ters.** it back 
21740 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  again.  This is 
21750 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
21760 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69   ability to regi
21770 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68  ster a.** VFS wh
21780 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76  en none are prev
21790 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
217a0 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69  d, and the abili
217b0 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69  ty to .** unregi
217c0 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76  ster the only av
217d0 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69  ailable VFS.  Ti
217e0 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74  cket #2738.*/.st
217f0 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c  atic int vfs_unl
21800 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ink_test(.  Clie
21810 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
21820 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
21830 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
21840 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
21850 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
21860 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
21870 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
21880 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
21890 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
218a0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
218b0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
218c0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
218d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
218e0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
218f0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
21900 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
21910 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69  qlite3_vfs *pMai
21920 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n;.  sqlite3_vfs
21930 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73   *apVfs[20];.  s
21940 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20  qlite3_vfs one, 
21950 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  two;..  sqlite3_
21960 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30  vfs_unregister(0
21970 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  );   /* Unregist
21980 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61  er of NULL is ha
21990 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e  rmless */.  one.
219a0 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
219b0 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22  .  two.zName = "
219c0 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61  __two";..  /* Ca
219d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  lling sqlite3_vf
219e0 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
219f0 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  2nd argument of 
21a00 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  0 does not.  ** 
21a10 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  change the defau
21a20 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d  lt VFS.  */.  pM
21a30 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ain = sqlite3_vf
21a40 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c  s_find(0);.  sql
21a50 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21a60 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73  r(&one, 0);.  as
21a70 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
21a80 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
21a90 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21aa0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21ab0 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b  gister(&two, 0);
21ac0 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
21ad0 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
21ae0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21af0 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61  ) );..  /* We ca
21b00 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20  n find a VFS by 
21b10 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73  its name */.  as
21b20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21b30 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
21b40 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
21b50 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21b60 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21b70 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  wo );..  /* Call
21b80 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72  ing sqlite_vfs_r
21b90 65 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e  egister with non
21ba0 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72  -zero second par
21bb0 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74  ameter changes t
21bc0 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
21bd0 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65  VFS, even if the
21be0 20 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69   1st parameter i
21bf0 73 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53  s an existig VFS
21c00 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72   that is.  ** pr
21c10 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
21c20 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64  red as the non-d
21c30 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73  efault..  */.  s
21c40 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21c50 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
21c60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21c70 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
21c80 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
21c90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21ca0 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21cb0 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
21cc0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21cd0 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  nd(0)==&one );. 
21ce0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21cf0 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a  ister(&two, 1);.
21d00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21d10 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
21d20 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
21d30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21d40 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
21d50 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
21d60 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21d70 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b  find(0)==&two );
21d80 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a  .  if( pMain ){.
21d90 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
21da0 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
21db0 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
21dc0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21dd0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
21de0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
21df0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21e00 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
21e10 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21e20 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21e30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a  )==pMain );.  }.
21e40 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74    .  /* Unlink t
21e50 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20  he default VFS. 
21e60 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
21e70 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
21e80 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73  VFSes.  ** regis
21e90 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tered..  */.  fo
21ea0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
21eb0 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
21ec0 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Vfs[0]); i++){. 
21ed0 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
21ee0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21ef0 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
21f00 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  [i] ){.      ass
21f10 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
21f20 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21f30 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
21f40 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
21f50 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21f60 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20  (apVfs[i]);.    
21f70 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
21f80 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
21f90 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
21fa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21fb0 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
21fc0 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21fd0 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72    .  /* Register
21fe0 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73   the main VFS as
21ff0 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69   non-default (wi
22000 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75  ll be made defau
22010 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69  lt, since.  ** i
22020 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79  t'll be the only
22030 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63   one in existenc
22040 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e)..  */.  sqlit
22050 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
22060 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73  pMain, 0);.  ass
22070 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
22080 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
22090 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65  );.  .  /* Un-re
220a0 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
220b0 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73  VFS again to res
220c0 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46  tore an empty VF
220d0 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  S list */.  sqli
220e0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
220f0 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73  er(pMain);.  ass
22100 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
22110 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
22120 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20    /* Relink all 
22130 56 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65  VFSes in reverse
22140 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66   order. */  .  f
22150 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
22160 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
22170 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
22180 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
22190 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
221a0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
221b0 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
221c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
221d0 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
221e0 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
221f0 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
22200 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
22210 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
22220 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
22230 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65  }.  }..  /* Unre
22240 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c  gister out sampl
22250 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71  e VFSes. */.  sq
22260 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
22270 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
22280 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
22290 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f  ster(&two);..  /
222a0 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  * Unregistering 
222b0 61 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f  a VFS that is no
222c0 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69  t currently regi
222d0 73 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65  stered is harmle
222e0 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ss */.  sqlite3_
222f0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
22300 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
22310 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
22320 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  two);.  assert( 
22330 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22340 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a  ("__one")==0 );.
22350 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22360 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
22370 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  o")==0 );..  /* 
22380 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66  We should be lef
22390 74 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69  t with the origi
223a0 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20  nal default VFS 
223b0 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a  back as the.  **
223c0 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61   original */.  a
223d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
223e0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
223f0 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  n );..  return T
22400 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22410 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e  tclcmd:   vfs_in
22420 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a  itfail_test.**.*
22430 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
22440 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  nd attempts to v
22450 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f  fs_find and vfs_
22460 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68  register when th
22470 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69  e.** sqlite3_ini
22480 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66  tialize() interf
22490 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20  ace is failing. 
224a0 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c   All calls shoul
224b0 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69  d fail..*/.stati
224c0 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61  c int vfs_initfa
224d0 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
224e0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
224f0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
22500 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
22510 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
22520 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22530 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
22540 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
22550 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
22560 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
22570 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
22580 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22590 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
225a0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
225b0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
225c0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
225d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
225e0 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
225f0 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
22600 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
22610 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
22620 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
22630 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
22640 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
22650 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
22660 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
22670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
22680 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
22690 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
226a0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
226b0 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
226c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
226d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
226e0 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
226f0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
22700 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
22710 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
22720 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
22730 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
22740 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
22750 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
22760 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
22770 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73   int vfs_unregis
22780 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
22790 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
227a0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
227b0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
227c0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
227d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
227e0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
227f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
22800 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
22810 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
22820 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
22830 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
22840 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
22850 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22860 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
22870 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
22880 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
22890 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
228a0 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
228b0 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
228c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
228d0 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
228e0 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
228f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
22900 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
22910 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
22920 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
22930 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
22940 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
22950 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
22960 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
22970 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
22980 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
22990 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
229a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
229b0 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
229c0 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
229d0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
229e0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
229f0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
22a00 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
22a10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
22a20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
22a30 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
22a40 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
22a50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
22a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22a70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
22a80 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22a90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22aa0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22ab0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22ac0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22ad0 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20   i<nVfs; i++){. 
22ae0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
22af0 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
22b00 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
22b10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22b20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22b30 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
22b40 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
22b50 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
22b60 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
22b70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
22b80 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
22b90 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
22ba0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
22bb0 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
22bc0 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22bd0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22be0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22bf0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22c00 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22c10 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22c20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22c30 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
22c40 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22c50 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22c60 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22c70 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c90 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22ca0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22cb0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22cc0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22cd0 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
22ce0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22cf0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
22d00 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
22d10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22d20 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
22d30 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
22d40 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
22d50 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
22d60 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
22d70 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
22d80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22d90 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22da0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22db0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22dc0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
22dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22de0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22df0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22e00 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
22e10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22e20 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
22e30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22e40 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
22e50 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
22e60 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
22e70 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
22e80 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
22e90 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
22ea0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22eb0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
22ec0 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
22ed0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22ee0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
22ef0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22f00 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22f10 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
22f20 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
22f30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
22f40 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OUND || rc==SQLI
22f50 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72  TE_ERROR );..  r
22f60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22f70 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
22f80 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
22f90 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42  asterrno_test DB
22fa0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
22fb0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
22fc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22fd0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
22fe0 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
22ff0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
23000 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
23010 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e  LAST_ERRNO verb.
23020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23030 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
23040 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c  errno_test(.  Cl
23050 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
23060 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
23070 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
23080 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
23090 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
230a0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
230b0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
230c0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
230d0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
230e0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
230f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23100 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23110 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
23120 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
23130 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
23140 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67  */.){.  int iArg
23150 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
23160 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
23170 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
23180 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
23190 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
231a0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
231b0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
231c0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
231d0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
231e0 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  , 0), " DB", 0);
231f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23200 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23210 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23220 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23230 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23240 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
23250 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23260 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
23270 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
23280 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53  NULL, SQLITE_LAS
23290 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b  T_ERRNO, &iArg);
232a0 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20  .  if( rc ){ .  
232b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
232c0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
232d0 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a  ewIntObj(rc)); .
232e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
232f0 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28  RROR; .  }.  if(
23300 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20   iArg!=0 ) {.   
23310 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
23320 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70  t(interp, "Unexp
23330 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65  ected non-zero e
23340 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20  rrno: ",.       
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
23360 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
23370 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  bj(Tcl_NewIntObj
23380 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c  (iArg), 0), " ",
23390 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
233a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
233b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
233c0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
233d0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
233e0 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
233f0 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a   DB DBNAME SIZE.
23400 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23410 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
23420 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23430 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
23440 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
23450 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
23460 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47   of the SQLITE_G
23470 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
23480 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   and.** SQLITE_S
23490 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
234a0 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69   verbs..*/.stati
234b0 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
234c0 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
234d0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
234e0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
234f0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23500 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23510 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23520 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23530 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23540 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23550 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23560 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23580 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23590 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
235a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
235b0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
235c0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
235d0 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
235f0 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65  * New chunk size
23600 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65        /* Db name
23630 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
23640 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69   etc.) */.  sqli
23650 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
23660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
23670 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
23680 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
23690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236a0 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74      /* file_cont
236b0 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64  rol() return cod
236c0 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  e */..  if( objc
236d0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
236e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
236f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
23700 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a   DBNAME SIZE");.
23710 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23720 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23730 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23740 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
23750 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
23760 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74  ) .   || Tcl_Get
23770 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
23780 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69  p, objv[3], &nSi
23790 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75  ze).  ){.   retu
237a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
237b0 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
237c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
237d0 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d  ;.  if( zDb[0]==
237e0 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c  '\0' ) zDb = NUL
237f0 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  L;..  rc = sqlit
23800 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
23810 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
23820 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
23830 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65  , (void *)&nSize
23840 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23850 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
23860 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23870 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
23880 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
23890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
238a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
238b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
238c0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
238d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
238e0 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44 42  ehint_test DB DB
238f0 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20  NAME SIZE.**.** 
23900 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
23910 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
23920 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
23930 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69 74  nterface .** wit
23940 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  h SQLITE_FCNTL_S
23950 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74  IZE_HINT.*/.stat
23960 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
23970 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
23980 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23990 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
239a0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
239b0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
239c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
239d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
239e0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
239f0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23a00 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23a10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23a20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23a30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23a40 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23a50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23a60 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23a70 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
23a80 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65  cl_WideInt nSize
23a90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23aa0 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f  * Hinted size */
23ab0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
23ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ad0 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22     /* Db name ("
23ae0 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
23af0 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  c.) */.  sqlite3
23b00 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
23b10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23b20 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
23b30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
23b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b50 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   /* file_control
23b60 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
23b70 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  /..  if( objc!=4
23b80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23b90 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23ba0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
23bb0 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20  NAME SIZE");.   
23bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23bd0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23be0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23bf0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23c00 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a  objv[1]), &db) .
23c10 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64     || Tcl_GetWid
23c20 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
23c30 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  rp, objv[3], &nS
23c40 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74  ize).  ){.   ret
23c50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23c60 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47   }.  zDb = Tcl_G
23c70 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
23c80 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d  );.  if( zDb[0]=
23c90 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55  ='\0' ) zDb = NU
23ca0 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  LL;..  rc = sqli
23cb0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23cc0 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
23cd0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
23ce0 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65  , (void *)&nSize
23cf0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23d00 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
23d10 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23d20 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
23d30 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
23d40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23d50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
23d60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
23d70 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23d80 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
23d90 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50  kproxy_test DB P
23da0 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  WD.**.** This TC
23db0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23dc0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23dd0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23de0 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
23df0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
23e00 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
23e10 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
23e20 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ILE and.** SQLIT
23e30 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
23e40 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74  ILE verbs..*/.st
23e50 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
23e60 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
23e70 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
23e80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
23e90 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
23ea0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
23eb0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
23ec0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
23ed0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
23ee0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
23ef0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
23f00 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
23f10 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
23f20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
23f30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
23f40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
23f50 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
23f60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
23f70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
23f80 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
23f90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23fa0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23fb0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23fc0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
23fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fe0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
23ff0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
24000 20 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20   0), " DB PWD", 
24010 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
24020 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24030 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
24040 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
24050 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
24060 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
24070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24080 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
24090 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
240a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
240b0 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
240c0 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
240d0 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
240e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
240f0 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
24100 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
24110 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24120 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
24130 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
24140 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
24150 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
24160 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
24170 20 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68    char *testPath
24180 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
24190 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20    int nPwd;.    
241a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64  const char *zPwd
241b0 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79  ;.    char proxy
241c0 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a  Path[400];.    .
241d0 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47      zPwd = Tcl_G
241e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
241f0 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b  objv[2], &nPwd);
24200 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28  .    if( sizeof(
24210 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b  proxyPath)<nPwd+
24220 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  20 ){.      Tcl_
24230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
24240 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69  erp, "PWD too bi
24250 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  g", (void*)0);. 
24260 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
24270 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
24280 20 73 70 72 69 6e 74 66 28 70 72 6f 78 79 50 61   sprintf(proxyPa
24290 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
242a0 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
242b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
242c0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
242d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
242e0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
242f0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
24300 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
24310 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24320 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
24330 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
24340 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24350 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
24360 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
24370 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
24380 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
24390 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
243a0 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
243b0 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
243c0 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
243d0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
243e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
243f0 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
24400 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
24410 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
24440 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
24450 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
24460 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24470 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
24480 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
24490 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
244a0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
244b0 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
244c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
244d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
244e0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
244f0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24500 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
24510 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
24520 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24530 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
24540 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
24550 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
24560 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
24570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
24580 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
24590 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
245a0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
245b0 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
245c0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
245d0 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
245e0 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
245f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
24600 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
24610 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24620 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
24630 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
24640 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
24650 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
24660 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
24670 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
24680 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
24690 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
246a0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
246b0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
246c0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
246d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
246e0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
246f0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24700 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24710 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24720 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24730 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24740 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24750 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24760 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
24770 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
24780 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
24790 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
247a0 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
247b0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
247c0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
247d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
247e0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
247f0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24800 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24810 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24820 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24830 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
24840 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
24850 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24860 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24870 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24880 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24890 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
248a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
248b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
248c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
248d0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
248e0 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
248f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
24900 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
24910 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
24920 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
24930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
24950 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
24960 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
24970 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
24980 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
24990 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
249a0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
249b0 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
249c0 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
249d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
249e0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
249f0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
24a00 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
24a10 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24a20 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
24a30 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c  _handle DB HANDL
24a40 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
24a50 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
24a60 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
24a70 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
24a80 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
24a90 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
24aa0 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64  SET_HANDLE opcod
24ab0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24ac0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
24ad0 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
24ae0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24af0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24b00 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24b10 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24b20 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24b30 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24b40 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24b50 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
24b60 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
24b70 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
24b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24b90 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
24ba0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
24bb0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
24bc0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
24bd0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
24be0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
24bf0 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
24c00 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
24c10 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
24c20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
24c30 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24c40 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
24c50 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24c60 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24c70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24c80 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24c90 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
24ca0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
24cb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
24cc0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24cd0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24ce0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24cf0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
24d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24d10 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
24d20 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
24d30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24d40 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
24d50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24d60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
24d70 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
24d80 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
24d90 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
24da0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
24db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
24dd0 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
24de0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
24df0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
24e00 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
24e10 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
24e20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24e30 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
24e40 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24e50 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
24e60 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
24e70 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
24e80 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
24e90 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
24ea0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
24eb0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
24ec0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
24ed0 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
24ee0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
24ef0 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
24f00 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
24f10 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
24f20 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c  ersist_wal(.  Cl
24f30 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
24f40 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
24f50 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
24f60 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
24f70 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
24f80 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
24f90 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
24fa0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
24fb0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
24fc0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
24fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24fe0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
24ff0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
25000 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
25010 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
25020 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
25030 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
25040 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20   int bPersist;. 
25050 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20   char z[100];.. 
25060 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
25070 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25080 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25090 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
250a0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
250b0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
250c0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
250d0 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c   0), " DB FLAG",
250e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
250f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25100 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
25110 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
25120 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
25130 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
25140 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25150 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
25160 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
25170 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50  rp, objv[2], &bP
25180 65 72 73 69 73 74 29 20 29 20 72 65 74 75 72 6e  ersist) ) return
25190 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
251a0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
251b0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
251c0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
251d0 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69  ERSIST_WAL, (voi
251e0 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20  d*)&bPersist);. 
251f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25200 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
25210 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65  "%d %d", rc, bPe
25220 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70  rsist);.  Tcl_Ap
25230 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
25240 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
25250 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25260 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
25270 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
25280 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
25290 65 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d  erwrite DB PSOW-
252a0 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  FLAG.**.** This 
252b0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
252c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
252d0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
252e0 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
252f0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
25300 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
25310 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
25320 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
25330 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
25340 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  erwrite(.  Clien
25350 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25360 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
25370 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
25380 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
25390 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
253a0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
253b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
253c0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
253d0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
253e0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
253f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25400 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25410 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25420 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25430 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25440 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25450 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
25460 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  t b;.  char z[10
25470 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
25480 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
25490 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
254a0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
254b0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
254c0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
254d0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
254e0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
254f0 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  FLAG", 0);.    r
25500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25510 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25520 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25530 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
25540 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
25550 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25560 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25570 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
25580 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
25590 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
255a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
255b0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
255c0 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53  ontrol(db,NULL,S
255d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
255e0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
255f0 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71  (void*)&b);.  sq
25600 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
25610 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
25620 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20   %d", rc, b);.  
25630 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25640 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
25650 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
25660 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a  TCL_OK;  .}.../*
25670 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
25680 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
25690 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a  me DB ?AUXDB?.**
256a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
256b0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
256c0 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20  es the stack of 
256d0 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
256e0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
256f0 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69  l_vfsname(.  Cli
25700 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
25710 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
25720 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
25730 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
25740 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25750 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
25760 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
25770 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
25780 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
25790 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
257a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
257b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
257c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
257d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
257e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
257f0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
25800 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
25810 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69   *zDbName = "mai
25820 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73  n";.  char *zVfs
25830 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Name = 0;..  if(
25840 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
25850 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
25860 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
25870 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
25880 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
25890 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
258a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
258b0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
258c0 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20   ?AUXDB?", 0);. 
258d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
258e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
258f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
25900 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
25910 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
25920 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
25930 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25940 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
25950 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
25960 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25970 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  2]);.  }.  sqlit
25980 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
25990 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c  db, zDbName, SQL
259a0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
259b0 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61  E,(void*)&zVfsNa
259c0 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  me);.  Tcl_Appen
259d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
259e0 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zVfsName, (char*
259f0 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  )0);.  sqlite3_f
25a00 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  ree(zVfsName);. 
25a10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25a20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
25a30 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
25a40 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44  l_tempfilename D
25a50 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
25a60 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
25a70 74 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72  that is a tempor
25a80 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a  ary filename.*/.
25a90 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
25aa0 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
25ab0 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
25ac0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25ad0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25ae0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25af0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25b00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25b10 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25b20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25b30 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25b40 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
25b50 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
25b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
25b70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
25b80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
25b90 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
25ba0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
25bb0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
25bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
25bd0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
25be0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
25bf0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
25c00 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
25c10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25c30 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
25c40 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
25c50 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
25c60 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
25c70 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
25c80 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
25c90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25ca0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
25cb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
25cc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25cd0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
25ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25cf0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
25d00 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
25d10 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
25d20 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
25d30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
25d40 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
25d50 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
25d60 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
25d70 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29   (void*)&zTName)
25d80 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
25d90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e  sult(interp, zTN
25da0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
25db0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25dc0 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  TName);.  return
25dd0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
25de0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
25df0 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a  qlite3_vfs_list.
25e00 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  **.**   Return a
25e10 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69   tcl list contai
25e20 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ning the names o
25e30 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64  f all registered
25e40 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69   vfs's..*/.stati
25e50 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a  c int vfs_list(.
25e60 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25e70 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25e80 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25e90 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25ea0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25eb0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25ec0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25ed0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25ee0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25ef0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25f10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25f20 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25f30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25f40 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25f50 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25f60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
25f70 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
25f80 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
25f90 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
25fa0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
25fb0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
25fc0 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
25fd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25fe0 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d  .  }.  for(pVfs=
25ff0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26000 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d  (0); pVfs; pVfs=
26010 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pVfs->pNext){.  
26020 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26030 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
26040 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
26050 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e  StringObj(pVfs->
26060 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  zName, -1));.  }
26070 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
26080 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
26090 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
260a0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
260b0 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
260c0 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c  _limit DB ID VAL
260d0 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  UE.**.** This TC
260e0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
260f0 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  he sqlite3_limit
26100 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
26110 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
26120 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
26130 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
26140 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d  tic int test_lim
26150 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  it(.  ClientData
26160 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26170 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26180 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26190 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
261a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
261b0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
261c0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
261d0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
261e0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
261f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26200 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26210 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26220 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26230 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26240 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26250 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
26260 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20  nt rc;.  static 
26270 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
26280 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
26290 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20  .     int id;.  
262a0 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aId[] = {.    
262b0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
262c0 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
262d0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
262e0 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
262f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
26300 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53   "SQLITE_LIMIT_S
26310 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20  QL_LENGTH",     
26320 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
26330 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20  T_SQL_LENGTH    
26340 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
26350 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
26360 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20  LUMN",          
26370 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
26380 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
26390 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
263a0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
263b0 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
263c0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
263d0 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
263e0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
263f0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
26400 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20  OUND_SELECT",   
26410 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
26420 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
26430 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
26440 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
26450 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OP",            
26460 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44   SQLITE_LIMIT_VD
26470 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20  BE_OP           
26480 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
26490 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
264a0 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20  ON_ARG",        
264b0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
264c0 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
264d0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
264e0 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
264f0 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  D",            S
26500 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
26510 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
26520 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
26530 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
26540 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51  TERN_LENGTH", SQ
26550 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
26560 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
26570 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
26580 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
26590 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c  NUMBER",     SQL
265a0 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
265b0 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d  LE_NUMBER      }
265c0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
265d0 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
265e0 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49  PTH",       SQLI
265f0 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
26600 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c  _DEPTH        },
26610 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
26620 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
26630 41 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54  ADS",      SQLIT
26640 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
26650 48 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a  HREADS       },.
26660 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20      .    /* Out 
26670 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63 61  of range test ca
26680 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51  ses */.    { "SQ
26690 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d  LITE_LIMIT_TOOSM
266a0 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ALL",           
266b0 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   -1,            
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
266e0 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47  ITE_LIMIT_TOOBIG
266f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
26700 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
26710 4b 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20  KER_THREADS+1   
26720 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
26730 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20 76 61 6c  i, id;.  int val
26740 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
26750 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  zId;..  if( objc
26760 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
26770 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
26780 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
26790 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
267a0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
267b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
267c0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
267d0 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a   ID VALUE", 0);.
267e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
267f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
26800 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
26810 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
26820 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
26830 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
26840 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63  RROR;.  zId = Tc
26850 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
26860 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
26870 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73   i<sizeof(aId)/s
26880 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69  izeof(aId[0]); i
26890 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
268a0 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e  cmp(zId, aId[i].
268b0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
268c0 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69     id = aId[i].i
268d0 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  d;.      break;.
268e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
268f0 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73  i>=sizeof(aId)/s
26900 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b  izeof(aId[0]) ){
26910 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
26920 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
26930 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70  nknown limit typ
26940 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72  e: ", zId, (char
26950 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
26960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
26970 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
26980 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
26990 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
269a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
269b0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
269c0 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20  3_limit(db, id, 
269d0 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  val);.  Tcl_SetO
269e0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
269f0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
26a00 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
26a10 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
26a20 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70   tclcmd:  save_p
26a30 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20  rng_state.**.** 
26a40 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  Save the state o
26a50 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e  f the pseudo-ran
26a60 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
26a70 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20  ator..** At the 
26a80 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66  same time, verif
26a90 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74  y that sqlite3_t
26aa0 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b  est_control work
26ab0 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63  s even when.** c
26ac0 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75  alled with an ou
26ad0 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64  t-of-range opcod
26ae0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26af0 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65   save_prng_state
26b00 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26b10 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26b20 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26b30 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26b40 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
26b50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26b60 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26b70 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26b80 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26b90 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26bb0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26bc0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26bd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26be0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26bf0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
26c00 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74  t rc = sqlite3_t
26c10 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39  est_control(9999
26c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
26c30 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
26c40 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
26c50 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28  l(-1);.  assert(
26c60 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69   rc==0 );.  sqli
26c70 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
26c80 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
26c90 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72  _PRNG_SAVE);.  r
26ca0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26cb0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72  /*.** tclcmd:  r
26cc0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
26cd0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
26ce0 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
26cf0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
26d00 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26d10 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26d20 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26d30 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26d40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26d50 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26d60 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26d70 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26d80 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26d90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26da0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26db0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26dc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26dd0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26de0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26df0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
26e00 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
26e10 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
26e20 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
26e30 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
26e40 63 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67  cmd:  reset_prng
26e50 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
26e60 20 69 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f   int reset_prng_
26e70 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
26e80 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
26e90 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
26ea0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
26eb0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
26ec0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26ed0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
26ee0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
26ef0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
26f00 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26f10 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
26f20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26f30 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
26f40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
26f50 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
26f60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
26f70 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
26f80 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
26f90 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
26fa0 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ET);.  return TC
26fb0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
26fc0 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65  clcmd:  database
26fd0 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a  _may_be_corrupt.
26fe0 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  **.** Indicate t
26ff0 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
27000 65 73 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72  es might be corr
27010 75 70 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  upt.  In other w
27020 6f 72 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f  ords, set the no
27030 72 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66  rmal.** state of
27040 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
27050 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
27060 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  se_may_be_corrup
27070 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
27080 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
27090 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
270a0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
270b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
270c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
270d0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
270e0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
270f0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
27100 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
27110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27120 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
27130 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
27140 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
27150 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
27160 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
27170 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
27180 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
27190 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
271a0 54 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  T, 0);.  return 
271b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
271c0 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73  tclcmd:  databas
271d0 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a  e_never_corrupt.
271e0 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  **.** Indicate t
271f0 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
27200 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65  es are always we
27210 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73  ll-formed.  This
27220 20 65 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61   enables extra a
27230 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
27240 6d 65 6e 74 73 20 74 68 61 74 20 74 65 73 74 20  ments that test 
27250 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
27260 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20  are always true 
27270 66 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  for well-formed 
27280 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74  databases..*/.st
27290 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
272a0 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28  e_never_corrupt(
272b0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
272c0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
272d0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
272e0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
272f0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
27300 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
27310 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
27320 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
27330 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
27340 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
27350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27360 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
27370 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
27380 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
27390 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
273a0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
273b0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
273c0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
273d0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
273e0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   1);.  return TC
273f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
27400 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73  clcmd:  pcache_s
27410 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tats.*/.static i
27420 6e 74 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73  nt test_pcache_s
27430 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  tats(.  ClientDa
27440 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27450 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27460 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27470 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27480 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27490 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
274a0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
274b0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
274c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
274d0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
274e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
274f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27500 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27510 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27520 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27530 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e    int nMin;.  in
27540 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43  t nMax;.  int nC
27550 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52  urrent;.  int nR
27560 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c  ecyclable;.  Tcl
27570 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73  _Obj *pRet;..  s
27580 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61 74  qlite3PcacheStat
27590 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d  s(&nCurrent, &nM
275a0 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63  ax, &nMin, &nRec
275b0 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65  yclable);..  pRe
275c0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
275d0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
275e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
275f0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27600 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72  ewStringObj("cur
27610 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54  rent", -1));.  T
27620 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27630 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27640 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
27650 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a  Obj(nCurrent));.
27660 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27670 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27680 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27690 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c  StringObj("max",
276a0 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
276b0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
276c0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
276d0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
276e0 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ax));.  Tcl_List
276f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
27700 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
27710 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
27720 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "min", -1));.  T
27730 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27740 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27750 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
27760 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63  Obj(nMin));.  Tc
27770 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
27780 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
27790 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
277a0 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c  ngObj("recyclabl
277b0 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  e", -1));.  Tcl_
277c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
277d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
277e0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
277f0 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a  (nRecyclable));.
27800 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
27810 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
27820 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
27830 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
27840 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
27850 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
27860 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f  c void test_unlo
27870 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69  ck_notify_cb(voi
27880 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41  d **aArg, int nA
27890 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  rg){.  int ii;. 
278a0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41   for(ii=0; ii<nA
278b0 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54  rg; ii++){.    T
278c0 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49  cl_EvalEx((Tcl_I
278d0 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d  nterp *)aArg[ii]
278e0 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
278f0 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
27900 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  GLOBAL);.  }.}.#
27910 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
27920 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
27930 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74  TIFY */../*.** t
27940 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
27950 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62  unlock_notify db
27960 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
27970 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
27980 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e  NOTIFY.static in
27990 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  t test_unlock_no
279a0 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61  tify(.  ClientDa
279b0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
279c0 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
279d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
279e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
279f0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27a00 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27a10 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27a20 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27a30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27a40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27a50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27a60 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27a70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27a80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
27a90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
27aa0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
27ab0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
27ac0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
27ad0 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
27ae0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27af0 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
27b00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
27b10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27b20 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
27b30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27b40 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
27b50 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f  qlite3_unlock_no
27b60 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e  tify(db, test_un
27b70 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20  lock_notify_cb, 
27b80 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b  (void *)interp);
27b90 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
27ba0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
27bb0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
27bc0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
27bd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27be0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27bf0 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
27c00 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
27c10 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61  db ?NAME?.*/.sta
27c20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c  tic int test_wal
27c30 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  _checkpoint(.  C
27c40 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27c50 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
27c60 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27c70 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27c80 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27c90 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27ca0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27cb0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27cd0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27ce0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27cf0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27d00 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27d10 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
27d20 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
27d30 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
27d40 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
27d50 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
27d60 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
27d70 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
27d80 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29  jv, "DB ?NAME?")
27d90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
27da0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
27db0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
27dc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27dd0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27de0 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
27df0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27e00 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
27e10 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
27e20 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27e30 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  2]);.  }.  rc = 
27e40 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
27e50 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
27e60 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
27e70 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
27e80 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
27e90 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
27ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
27ec0 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
27ed0 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d  eckpoint_v2 db M
27ee0 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a  ODE ?NAME?.**.**
27ef0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61   This command ca
27f00 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63  lls the wal_chec
27f10 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63  kpoint_v2() func
27f20 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70  tion with the sp
27f30 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20  ecified.** mode 
27f40 61 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76  argument (passiv
27f50 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61  e, full or resta
27f60 72 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c  rt). If present,
27f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
27f80 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61  me.** NAME is pa
27f90 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
27fa0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77  nd argument to w
27fb0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
27fc0 28 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a  (). If it the.**
27fd0 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69   NAME argument i
27fe0 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61  s not present, a
27ff0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73   NULL pointer is
28000 20 70 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e   passed instead.
28010 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68  .**.** If wal_ch
28020 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65  eckpoint_v2() re
28030 74 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20  turns any value 
28040 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
28050 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c  E_BUSY or.** SQL
28060 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69  ITE_OK, then thi
28070 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  s command return
28080 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65  s TCL_ERROR. The
28090 20 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73   Tcl result is s
280a0 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72  et.** to the err
280b0 6f 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69  or message obtai
280c0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
280d0 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a  _errmsg()..**.**
280e0 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
280f0 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
28100 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65   a list of three
28110 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
28120 69 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  irst integer.** 
28130 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42  is 1 if SQLITE_B
28140 55 53 59 20 77 61 73 20 72 65 74 75 72 6e 65 64  USY was returned
28150 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
28160 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
28170 74 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  two integers.** 
28180 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 72  are the values r
28190 65 74 75 72 6e 65 64 20 76 69 61 20 74 68 65 20  eturned via the 
281a0 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
281b0 73 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f  s by wal_checkpo
281c0 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68  int_v2() -.** th
281d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
281e0 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e  es in the log an
281f0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
28200 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
28210 67 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62  g.** that have b
28220 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  een checkpointed
28230 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28240 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  test_wal_checkpo
28250 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  int_v2(.  Client
28260 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
28270 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
28280 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28290 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
282a0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
282b0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
282c0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
282d0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
282e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
282f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
28300 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
28310 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
28320 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
28330 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  {.  char *zDb = 
28340 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
28350 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
28360 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20  nt eMode;.  int 
28370 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69  nLog = -555;.  i
28380 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b  nt nCkpt = -555;
28390 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
283a0 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
283b0 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70  * aMode[] = { "p
283c0 61 73 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c  assive", "full",
283d0 20 22 72 65 73 74 61 72 74 22 2c 20 30 20 7d 3b   "restart", 0 };
283e0 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
283f0 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
28400 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73  SIVE==0 );.  ass
28410 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
28420 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29  KPOINT_FULL==1 )
28430 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
28440 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
28450 53 54 41 52 54 3d 3d 32 20 29 3b 0a 0a 20 20 69  START==2 );..  i
28460 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
28470 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
28480 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
28490 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
284a0 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29  DB MODE ?NAME?")
284b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
284c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
284d0 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20  f( objc==4 ){.  
284e0 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
284f0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
28500 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
28510 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
28520 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
28530 76 5b 31 5d 29 2c 20 26 64 62 29 0a 20 20 20 7c  v[1]), &db).   |
28540 7c 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  | Tcl_GetIndexFr
28550 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
28560 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d  jv[2], aMode, "m
28570 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29  ode", 0, &eMode)
28580 20 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72   .  ){.    retur
28590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
285a0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
285b0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
285c0 76 32 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64  v2(db, zDb, eMod
285d0 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74  e, &nLog, &nCkpt
285e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
285f0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
28600 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
28610 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
28620 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
28630 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
28640 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
28650 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
28660 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
28670 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
28680 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
28690 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
286a0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
286b0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53  _NewIntObj(rc==S
286c0 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a 30 29 29  QLITE_BUSY?1:0))
286d0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
286e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
286f0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
28700 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b  ewIntObj(nLog));
28710 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
28720 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
28730 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
28740 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b  wIntObj(nCkpt));
28750 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
28760 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
28770 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
28780 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
28790 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69  lcmd:  test_sqli
287a0 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f  te3_log ?SCRIPT?
287b0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
287c0 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a  t LogCallback {.
287d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49    Tcl_Interp *pI
287e0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
287f0 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c   *pObj;.} logcal
28800 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a  lback = {0, 0};.
28810 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67  static void xLog
28820 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75  callback(void *u
28830 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20  nused, int err, 
28840 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54  char *zMsg){.  T
28850 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54  cl_Obj *pNew = T
28860 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
28870 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
28880 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
28890 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54  Count(pNew);.  T
288a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
288b0 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30  Element(.      0
288c0 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
288d0 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
288e0 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31  ErrName(err), -1
288f0 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ).  );.  Tcl_Lis
28900 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
28910 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e  t(0, pNew, Tcl_N
28920 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67  ewStringObj(zMsg
28930 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
28940 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62  alObjEx(logcallb
28950 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65  ack.pInterp, pNe
28960 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  w, TCL_EVAL_GLOB
28970 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  AL|TCL_EVAL_DIRE
28980 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
28990 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d  efCount(pNew);.}
289a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
289b0 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20  _sqlite3_log(.  
289c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
289d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
289e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
289f0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
28a00 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
28a10 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
28a20 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
28a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a40 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
28a50 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
28a60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
28a70 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
28a80 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ents */.){.  if(
28a90 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54   objc>2 ){.    T
28aa0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
28ab0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
28ac0 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20   "SCRIPT");.    
28ad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28ae0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63  ;.  }.  if( logc
28af0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a  allback.pObj ){.
28b00 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
28b10 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  ount(logcallback
28b20 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63  .pObj);.    logc
28b30 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30  allback.pObj = 0
28b40 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
28b50 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20  k.pInterp = 0;. 
28b60 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
28b70 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
28b80 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  LOG, 0, 0);.  }.
28b90 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a    if( objc>1 ){.
28ba0 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
28bb0 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a  pObj = objv[1];.
28bc0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
28bd0 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  ount(logcallback
28be0 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63  .pObj);.    logc
28bf0 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20  allback.pInterp 
28c00 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71  = interp;.    sq
28c10 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
28c20 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
28c30 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 30 29  xLogcallback, 0)
28c40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
28c50 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
28c60 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63 20      tcl_objproc 
28c70 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47 53  COMMANDNAME ARGS
28c80 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61 20  ....**.** Run a 
28c90 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69 6e  TCL command usin
28ca0 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69 6e  g its objProc in
28cb0 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77 20  terface.  Throw 
28cc0 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20 74  an error if.** t
28cd0 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e  he command has n
28ce0 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66  o objProc interf
28cf0 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
28d00 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28  nt runAsObjProc(
28d10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
28d20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
28d30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
28d40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
28d50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
28d60 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  ){.  Tcl_CmdInfo
28d70 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20   cmdInfo;.  if( 
28d80 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63  objc<2 ){.    Tc
28d90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28da0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28db0 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a  "COMMAND ...");.
28dc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28dd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28de0 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
28df0 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nfo(interp, Tcl_
28e00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28e10 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  ]), &cmdInfo) ){
28e20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28e30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
28e40 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64  ommand not found
28e50 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
28e60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
28e70 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
28e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28ea0 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72  f( cmdInfo.objPr
28eb0 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  oc==0 ){.    Tcl
28ec0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28ed0 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68  terp, "command h
28ee0 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22  as no objProc: "
28ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c  ,.           Tcl
28f00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28f10 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  1]), (char*)0);.
28f20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28f30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
28f40 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72  rn cmdInfo.objPr
28f50 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  oc(cmdInfo.objCl
28f60 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70  ientData, interp
28f70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31  , objc-1, objv+1
28f80 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
28f90 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
28fa0 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  N./*.** WARNING:
28fb0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
28fc0 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78  unction, printEx
28fd0 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29  plainQueryPlan()
28fe0 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20   is an exact.** 
28ff0 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65 20  copy of example 
29000 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e  code from eqp.in
29010 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20   (eqp.html). If 
29020 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64  this code is mod
29030 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74  ified,.** then t
29040 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  he documentation
29050 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20 62   copy needs to b
29060 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77 65  e modified as we
29070 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67  ll..*/./*.** Arg
29080 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 61  ument pStmt is a
29090 20 70 72 65 70 61 72 65 64 20 53 51 4c 20 73 74   prepared SQL st
290a0 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75  atement. This fu
290b0 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a  nction compiles.
290c0 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55  ** an EXPLAIN QU
290d0 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64  ERY PLAN command
290e0 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74 68   to report on th
290f0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
29100 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69  ment,.** and pri
29110 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74 20 74  nts the report t
29120 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20 70  o stdout using p
29130 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20  rintf()..*/.int 
29140 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72  printExplainQuer
29150 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73 74  yPlan(sqlite3_st
29160 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f  mt *pStmt){.  co
29170 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29190 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20   Input SQL */.  
291a0 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20  char *zExplain; 
291b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291c0 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c  /* SQL with EXPL
291d0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70  AIN QUERY PLAN p
291e0 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71  repended */.  sq
291f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
29200 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  lain;         /*
29210 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41 49   Compiled EXPLAI
29220 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
29230 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  mand */.  int rc
29240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29260 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71  urn code from sq
29270 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
29280 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20  () */..  zSql = 
29290 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d  sqlite3_sql(pStm
292a0 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  t);.  if( zSql==
292b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
292c0 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70  E_ERROR;..  zExp
292d0 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d  lain = sqlite3_m
292e0 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20  printf("EXPLAIN 
292f0 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20  QUERY PLAN %s", 
29300 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78  zSql);.  if( zEx
29310 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  plain==0 ) retur
29320 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
29330 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
29340 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69 74  prepare_v2(sqlit
29350 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74  e3_db_handle(pSt
29360 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d  mt), zExplain, -
29370 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
29380 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
29390 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66  (zExplain);.  if
293a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
293b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
293c0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
293d0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
293e0 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20  pExplain) ){.   
293f0 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20 3d   int iSelectid =
29400 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
29410 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29  int(pExplain, 0)
29420 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72  ;.    int iOrder
29430 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
29440 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
29450 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72 6f  1);.    int iFro
29460 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  m = sqlite3_colu
29470 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
29480 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   2);.    const c
29490 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28  har *zDetail = (
294a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
294b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
294c0 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a  (pExplain, 3);..
294d0 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20 25      printf("%d %
294e0 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c  d %d %s\n", iSel
294f0 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20 69  ectid, iOrder, i
29500 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a  From, zDetail);.
29510 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
29520 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
29530 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61  Explain);.}..sta
29540 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69  tic int test_pri
29550 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a  nt_eqp(.  void *
29560 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
29570 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29580 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
29590 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
295a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
295b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
295c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
295d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
295e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
295f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29600 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
29610 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29620 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
29630 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
29640 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
29650 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
29660 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
29670 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72  ERROR;.  rc = pr
29680 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
29690 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a  lan(pStmt);.  /*
296a0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
296b0 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68  on Windows so th
296c0 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20 75  at a test case u
296d0 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20  sing this .  ** 
296e0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65  function can ope
296f0 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61 6e  n a read pipe an
29700 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74  d get the output
29710 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78   of.  ** printEx
29720 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29  plainQueryPlan()
29730 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
29740 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f  */.  fflush(stdo
29750 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ut);.  Tcl_SetRe
29760 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
29770 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
29780 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
29790 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
297a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
297b0 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f  IT_EXPLAIN */../
297c0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73  *.** sqlite3_tes
297d0 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41  t_control VERB A
297e0 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63  RGS....*/.static
297f0 20 69 6e 74 20 74 65 73 74 5f 74 65 73 74 5f 63   int test_test_c
29800 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a  ontrol(.  void *
29810 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
29820 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29830 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
29840 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29850 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75  objv[].){.  stru
29860 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f  ct Verb {.    co
29870 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
29880 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20  .    int i;.  } 
29890 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20  aVerb[] = {.    
298a0 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  { "SQLITE_TESTCT
298b0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
298c0 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45 53 54  LT", SQLITE_TEST
298d0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
298e0 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22  AULT }, .    { "
298f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29900 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20 53 51  SORTER_MMAP", SQ
29910 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
29920 52 54 45 52 5f 4d 4d 41 50 20 7d 2c 20 0a 20 20  RTER_MMAP }, .  
29930 7d 3b 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a  };.  int iVerb;.
29940 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69    int iFlag;.  i
29950 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
29960 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<2 ){.    Tcl_
29970 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
29980 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56  erp, 1, objv, "V
29990 45 52 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20  ERB ARGS...");. 
299a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
299b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
299c0 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f   Tcl_GetIndexFro
299d0 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20  mObjStruct(.    
299e0 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31    interp, objv[1
299f0 5d 2c 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66  ], aVerb, sizeof
29a00 28 61 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52  (aVerb[0]), "VER
29a10 42 22 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20  B", 0, &iVerb.  
29a20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
29a30 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29a40 0a 0a 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72  ..  iFlag = aVer
29a50 62 5b 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77  b[iVerb].i;.  sw
29a60 69 74 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20  itch( iFlag ){. 
29a70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
29a80 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
29a90 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
29aa0 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20   int val;.      
29ab0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
29ac0 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
29ad0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
29ae0 32 2c 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22  2, objv, "ONOFF"
29af0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
29b00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29b10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54     }.      if( T
29b20 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
29b30 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
29b40 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
29b50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29b60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
29b70 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
29b80 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
29b90 54 49 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29  TIME_FAULT, val)
29ba0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29bb0 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
29bc0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
29bd0 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
29be0 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20      int val;.   
29bf0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a     sqlite3 *db;.
29c00 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
29c10 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
29c20 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
29c30 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
29c40 44 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20  DB LIMIT");.    
29c50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29c60 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
29c70 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
29c80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
29c90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
29ca0 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  2]), &db) ) retu
29cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29cc0 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
29cd0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
29ce0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
29cf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
29d00 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
29d10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
29d20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29d30 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c  SORTER_MMAP, db,
29d40 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
29d50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
29d60 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
29d70 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
29d80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
29d90 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
29da0 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
29db0 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
29dc0 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e  <sys/resource.h>
29dd0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
29de0 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76  t_getrusage(.  v
29df0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
29e00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
29e10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
29e20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
29e30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
29e40 20 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b   char buf[1024];
29e50 0a 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65  .  struct rusage
29e60 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c   r;.  memset(&r,
29e70 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a   0, sizeof(r));.
29e80 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
29e90 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20  GE_SELF, &r);.. 
29ea0 20 73 70 72 69 6e 74 66 28 62 75 66 2c 20 22 72   sprintf(buf, "r
29eb0 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20  u_utime=%d.%06d 
29ec0 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64  ru_stime=%d.%06d
29ed0 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75   ru_minflt=%d ru
29ee0 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20  _majflt=%d", .  
29ef0 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d    (int)r.ru_utim
29f00 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72  e.tv_sec, (int)r
29f10 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_utime.tv_use
29f20 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72  c, .    (int)r.r
29f30 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20  u_stime.tv_sec, 
29f40 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e  (int)r.ru_stime.
29f50 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69  tv_usec, .    (i
29f60 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20  nt)r.ru_minflt, 
29f70 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74  (int)r.ru_majflt
29f80 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  .  );.  Tcl_SetO
29f90 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
29fa0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
29fb0 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72  j(buf, -1));.  r
29fc0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
29fd0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
29fe0 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
29ff0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  Information pass
2a000 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
2a010 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65   thread into the
2a020 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f   windows file lo
2a030 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75  cker.** backgrou
2a040 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74  nd thread..*/.st
2a050 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2a060 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65  cker {.  char *e
2a070 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  vName;       /* 
2a080 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f  Name of event to
2a090 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73   signal thread s
2a0a0 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44  tartup */.  HAND
2a0b0 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  LE h;           
2a0c0 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65  /* Handle of the
2a0d0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
2a0e0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61  ed */.  int dela
2a0f0 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  y1;         /* D
2a100 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b  elay before lock
2a110 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ing */.  int del
2a120 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ay2;         /* 
2a130 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c  Delay before unl
2a140 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
2a150 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ok;             
2a160 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a  /* Finished ok *
2a170 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20  /.  int err;    
2a180 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a190 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2a1a0 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a  rs */.};.#endif.
2a1b0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2a1c0 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72  WIN.#include <pr
2a1d0 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54  ocess.h>./*.** T
2a1e0 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  he background th
2a1f0 72 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 66  read that does f
2a200 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ile locking..*/.
2a210 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33  static void win3
2a220 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f  2_file_locker(vo
2a230 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
2a240 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
2a250 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74  eLocker *p = (st
2a260 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2a270 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a  cker*)pAppData;.
2a280 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20    if( p->evName 
2a290 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76  ){.    HANDLE ev
2a2a0 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45   = OpenEvent(EVE
2a2b0 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c  NT_MODIFY_STATE,
2a2c0 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d   FALSE, p->evNam
2a2d0 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20  e);.    if ( ev 
2a2e0 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e  ){.      SetEven
2a2f0 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f  t(ev);.      Clo
2a300 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2a310 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
2a320 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28  >delay1 ) Sleep(
2a330 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66  p->delay1);.  if
2a340 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  ( LockFile(p->h,
2a350 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
2a360 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65  , 0) ){.    Slee
2a370 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20  p(p->delay2);.  
2a380 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e    UnlockFile(p->
2a390 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
2a3a0 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f  00, 0);.    p->o
2a3b0 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 1;.  }else{.
2a3c0 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a      p->err = 1;.
2a3d0 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2a3e0 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20  e(p->h);.  p->h 
2a3f0 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31  = 0;.  p->delay1
2a400 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
2a410 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  2 = 0;.}.#endif.
2a420 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a430 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f  IN./*.**      lo
2a440 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49  ck_win32_file FI
2a450 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2a460 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61  LAY2.**.** Get a
2a470 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64  n exclusive mand
2a480 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69  itory lock on fi
2a490 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69  le for DELAY2 mi
2a4a0 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57  lliseconds..** W
2a4b0 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69  ait DELAY1 milli
2a4c0 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61  seconds before a
2a4d0 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63  cquiring the loc
2a4e0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
2a4f0 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2a500 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2a510 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a520 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2a530 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2a540 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2a550 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
2a560 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2a570 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
2a580 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
2a590 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
2a5a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2a5b0 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
2a5c0 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
2a5d0 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
2a5e0 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
2a5f0 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
2a600 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
2a610 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2a620 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2a630 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2a640 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2a650 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
2a660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a670 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
2a680 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2a690 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2a6a0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
2a6b0 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
2a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6d0 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
2a6e0 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
2a6f0 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
2a700 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2a710 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
2a720 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2a730 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
2a740 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
2a750 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
2a760 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
2a770 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
2a780 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
2a790 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a7a0 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
2a7b0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2a7c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a7d0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2a7e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2a7f0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
2a800 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
2a810 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
2a820 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2a830 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2a840 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
2a850 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a860 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
2a870 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2a880 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
2a890 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2a8a0 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
2a8b0 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
2a8c0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2a8d0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
2a8e0 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
2a8f0 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
2a900 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
2a910 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2a920 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
2a930 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
2a940 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2a950 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
2a960 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
2a970 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
2a980 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a990 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
2a9a0 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
2a9b0 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
2a9c0 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
2a9d0 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
2a9e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a9f0 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
2aa00 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
2aa10 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
2aa20 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2aa30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2aa40 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
2aa50 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2aa60 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
2aa70 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
2aa80 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
2aa90 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
2aaa0 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
2aab0 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
2aac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2aad0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2aae0 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
2aaf0 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
2ab00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ab10 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
2ab20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
2ab30 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2ab40 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2ab50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ab60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
2ab70 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2ab80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ab90 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69  ../*.**      exi
2aba0 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50  sts_win32_path P
2abb0 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ATH.**.** Return
2abc0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2abd0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2abe0 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66   exists, whose f
2abf0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2ac00 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65  ame.** may excee
2ac10 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73  d 260 characters
2ac20 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2ac30 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2ac40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2ac50 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28  n32_exists_path(
2ac60 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2ac70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2ac80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2ac90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2aca0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2acb0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2acc0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2acd0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2ace0 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29  1, objv, "PATH")
2acf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2ad00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2ad10 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2ad20 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
2ad30 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20  oleanObj(.      
2ad40 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2ad50 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f  sW( Tcl_GetUnico
2ad60 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e  de(objv[1]))!=IN
2ad70 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2ad80 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75  BUTES ));.  retu
2ad90 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2ada0 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69  .**      find_wi
2adb0 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e  n32_file PATTERN
2adc0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61  .**.** Returns a
2add0 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73   list of entries
2ade0 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20   in a directory 
2adf0 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 73  that match the s
2ae00 70 65 63 69 66 69 65 64 20 70 61 74 74 65 72 6e  pecified pattern
2ae10 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79  ,.** whose fully
2ae20 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2ae30 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 20 63  may exceed 248 c
2ae40 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2ae50 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2ae60 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  .** "\\?\"..*/.s
2ae70 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2ae80 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69  find_file(.  voi
2ae90 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
2aea0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2aeb0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2aec0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2aed0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41  T objv[].){.  HA
2aee0 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d  NDLE hFindFile =
2aef0 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
2af00 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46  VALUE;.  WIN32_F
2af10 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61  IND_DATAW findDa
2af20 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ta;.  Tcl_Obj *l
2af30 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20  istObj;.  DWORD 
2af40 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28  lastErrno;.  if(
2af50 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2af60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2af70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2af80 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20  , "PATTERN");.  
2af90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2afa0 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46  OR;.  }.  hFindF
2afb0 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46  ile = FindFirstF
2afc0 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
2afd0 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66  ode(objv[1]), &f
2afe0 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20  indData);.  if( 
2aff0 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c  hFindFile==INVAL
2b000 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
2b010 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2b020 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2b030 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2b040 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2b050 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2b060 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b070 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  listObj = Tcl_Ne
2b080 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e  wObj();.  Tcl_In
2b090 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f  crRefCount(listO
2b0a0 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  bj);.  do {.    
2b0b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b0c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b0d0 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
2b0e0 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20  wUnicodeObj(.   
2b0f0 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46       findData.cF
2b100 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ileName, -1));. 
2b110 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2b120 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2b130 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c  rp, listObj, Tcl
2b140 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a  _NewWideIntObj(.
2b150 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61          findData
2b160 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
2b170 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20  s));.  } while( 
2b180 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46  FindNextFileW(hF
2b190 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61  indFile, &findDa
2b1a0 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72  ta) );.  lastErr
2b1b0 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
2b1c0 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45  r();.  if( lastE
2b1d0 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26  rrno!=NO_ERROR &
2b1e0 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
2b1f0 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53  OR_NO_MORE_FILES
2b200 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73   ){.    FindClos
2b210 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
2b220 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2b230 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20  nt(listObj);.   
2b240 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2b250 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2b260 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
2b270 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
2b280 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b290 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c  OR;.  }.  FindCl
2b2a0 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
2b2b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2b2c0 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  lt(interp, listO
2b2d0 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  bj);.  return TC
2b2e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2b2f0 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32      delete_win32
2b300 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a  _file FILENAME.*
2b310 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65  *.** Deletes the
2b320 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
2b330 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2b340 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2b350 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68  exceed 260.** ch
2b360 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2b370 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2b380 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2b390 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65  c int win32_dele
2b3a0 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  te_file(.  void 
2b3b0 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2b3c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b3d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2b3e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b3f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2b400 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2b410 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2b420 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2b430 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20   "FILENAME");.  
2b440 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b450 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44  OR;.  }.  if( !D
2b460 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47  eleteFileW(Tcl_G
2b470 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2b480 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2b490 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2b4a0 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2b4b0 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2b4c0 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2b4d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b4e0 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2b4f0 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2b500 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b510 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65  ./*.**      make
2b520 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2b530 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  TORY.**.** Creat
2b540 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2b550 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2b560 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2b570 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2b580 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2b590 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2b5a0 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2b5b0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2b5c0 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20   win32_mkdir(.  
2b5d0 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2b5e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b5f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2b600 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2b610 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2b620 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2b630 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2b640 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2b650 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59  objv, "DIRECTORY
2b660 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2b670 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b680 69 66 28 20 21 43 72 65 61 74 65 44 69 72 65 63  if( !CreateDirec
2b690 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69  toryW(Tcl_GetUni
2b6a0 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  code(objv[1]), N
2b6b0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ULL) ){.    Tcl_
2b6c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2b6d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2b6e0 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2b6f0 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2b700 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b710 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
2b720 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2b730 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2b740 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d  ../*.**      rem
2b750 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49  ove_win32_dir DI
2b760 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65  RECTORY.**.** Re
2b770 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66  moves the specif
2b780 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77  ied directory, w
2b790 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2b7a0 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2b7b0 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72  ceed 248.** char
2b7c0 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2b7d0 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2b7e0 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2b7f0 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69 72 28  int win32_rmdir(
2b800 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2b810 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2b820 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2b830 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2b840 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2b850 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2b860 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2b870 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2b880 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54  1, objv, "DIRECT
2b890 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORY");.    retur
2b8a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2b8b0 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69  .  if( !RemoveDi
2b8c0 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74  rectoryW(Tcl_Get
2b8d0 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2b8e0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2b8f0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2b900 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2b910 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2b920 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2b930 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b940 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2b950 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2b960 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2b970 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  ndif.../*.**    
2b980 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
2b990 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f  ontrol DB OPT BO
2b9a0 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62  OLEAN.**.** Enab
2b9b0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75  le or disable qu
2b9c0 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ery optimization
2b9d0 73 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  s using the sqli
2b9e0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2b9f0 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2ba00 20 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f    Disable if BOO
2ba10 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e  LEAN is false an
2ba20 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c  d enable if BOOL
2ba30 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20  EAN is true..** 
2ba40 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20  OPT is the name 
2ba50 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  of the optimizat
2ba60 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ion to be disabl
2ba70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2ba80 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63  t optimization_c
2ba90 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a  ontrol(.  void *
2baa0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2bab0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bac0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2bad0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bae0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2baf0 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2bb00 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2bb10 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66  zOpt;.  int onof
2bb20 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  f;.  int mask = 
2bb30 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
2bb40 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
2bb50 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
2bb60 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ame;.    int mas
2bb70 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20  k;.  } aOpt[] = 
2bb80 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20  {.    { "all",  
2bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2bba0 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20  QLITE_AllOpts   
2bbb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e       },.    { "n
2bbc0 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  one",           
2bbd0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
2bbe0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bbf0 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74    { "query-flatt
2bc00 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54  ener",     SQLIT
2bc10 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
2bc20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d   },.    { "colum
2bc30 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20 20 20  n-cache",       
2bc40 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
2bc50 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  che    },.    { 
2bc60 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c  "groupby-order",
2bc70 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72         SQLITE_Gr
2bc80 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a  oupByOrder   },.
2bc90 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f      { "factor-co
2bca0 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c  nstants",    SQL
2bcb0 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
2bcc0 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73  st },.    { "dis
2bcd0 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20  tinct-opt",     
2bce0 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e     SQLITE_Distin
2bcf0 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20  ctOpt    },.    
2bd00 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61  { "cover-idx-sca
2bd10 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  n",      SQLITE_
2bd20 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d  CoverIdxScan   }
2bd30 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62  ,.    { "order-b
2bd40 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53  y-idx-join",   S
2bd50 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2bd60 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74  Join },.    { "t
2bd70 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20  ransitive",     
2bd80 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e       SQLITE_Tran
2bd90 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20  sitive     },.  
2bda0 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f    { "subquery-co
2bdb0 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54  routine",  SQLIT
2bdc0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20  E_SubqCoroutine 
2bdd0 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d   },.    { "omit-
2bde0 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20  noop-join",     
2bdf0 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
2be00 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Join   },.    { 
2be10 22 73 74 61 74 33 22 2c 20 20 20 20 20 20 20 20  "stat3",        
2be20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74         SQLITE_St
2be30 61 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a  at34         },.
2be40 20 20 20 20 7b 20 22 73 74 61 74 34 22 2c 20 20      { "stat4",  
2be50 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2be60 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20 20  ITE_Stat34      
2be70 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66     },.  };..  if
2be80 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2be90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2bea0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2beb0 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45  v, "DB OPT BOOLE
2bec0 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
2bed0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bee0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2bef0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2bf00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2bf10 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2bf20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2bf30 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
2bf40 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2bf50 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29  objv[3], &onoff)
2bf60 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2bf70 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63  ROR;.  zOpt = Tc
2bf80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2bf90 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
2bfa0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2bfb0 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2bfc0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2bfd0 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74  trcmp(zOpt, aOpt
2bfe0 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30  [i].zOptName)==0
2bff0 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d   ){.      mask =
2c000 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20   aOpt[i].mask;. 
2c010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c020 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66  }.  }.  if( onof
2c030 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b  f ) mask = ~mask
2c040 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  ;.  if( i>=sizeo
2c050 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2c060 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  Opt[0]) ){.    T
2c070 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2c080 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
2c090 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2c0a0 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
2c0b0 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  :",.            
2c0c0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2c0d0 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0);.    for(i=0;
2c0e0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2c0f0 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2c100 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
2c110 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c120 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b  terp, " ", aOpt[
2c130 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68  i].zOptName, (ch
2c140 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ar*)0);.    }.  
2c150 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c160 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
2c170 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2c180 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2c190 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62  PTIMIZATIONS, db
2c1a0 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72  , mask);.  retur
2c1b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70  n TCL_OK;.}..typ
2c1c0 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69  edef struct sqli
2c1d0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2c1e0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2c1f0 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20  tines;./*.**    
2c200 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74   load_static_ext
2c210 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d 45 20 2e  ension DB NAME .
2c220 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e  ...**.** Load on
2c230 65 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 69 63  e or more static
2c240 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65 78 74 65  ally linked exte
2c250 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  nsions..*/.stati
2c260 63 20 69 6e 74 20 74 63 6c 4c 6f 61 64 53 74 61  c int tclLoadSta
2c270 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 28  ticExtensionCmd(
2c280 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2c290 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2c2a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2c2b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2c2c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2c2d0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
2c2e0 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
2c2f0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c300 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c310 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c320 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c330 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69  qlite3_closure_i
2c340 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c350 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c360 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c370 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c380 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2c390 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c3a0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c3b0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c3c0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c3d0 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2c3e0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2c3f0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2c400 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2c410 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c420 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73  ite3_ieee_init(s
2c430 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2c440 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2c450 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2c460 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c470 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28  3_nextchar_init(
2c480 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2c490 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2c4a0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2c4b0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2c4c0 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e  e3_percentile_in
2c4d0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c4e0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c4f0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c500 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c510 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2c520 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2c530 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2c540 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2c550 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c560 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
2c570 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c580 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c590 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c5a0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c5b0 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69  lite3_totype_ini
2c5c0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2c5d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2c5e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2c5f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c600 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72  ite3_wholenumber
2c610 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2c620 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2c630 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2c640 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  *);.  static con
2c650 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
2c660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74  const char *zExt
2c670 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a  Name;.    int (*
2c680 70 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c  pInit)(sqlite3*,
2c690 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2c6a0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2c6b0 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73  s*);.  } aExtens
2c6c0 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ion[] = {.    { 
2c6d0 22 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20  "amatch",       
2c6e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c6f0 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20  _amatch_init    
2c700 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c710 20 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20    { "closure",  
2c720 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c730 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69  ite3_closure_ini
2c740 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  t              }
2c750 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65 69 6f 22  ,.    { "fileio"
2c760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c770 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2c780 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2c790 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 7a     },.    { "fuz
2c7a0 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  zer",           
2c7b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 7a       sqlite3_fuz
2c7c0 7a 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20  zer_init        
2c7d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2c7e0 22 69 65 65 65 37 35 34 22 2c 20 20 20 20 20 20  "ieee754",      
2c7f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c800 5f 69 65 65 65 5f 69 6e 69 74 20 20 20 20 20 20  _ieee_init      
2c810 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c820 20 20 7b 20 22 6e 65 78 74 63 68 61 72 22 2c 20    { "nextchar", 
2c830 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c840 69 74 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e  ite3_nextchar_in
2c850 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
2c860 2c 0a 20 20 20 20 7b 20 22 70 65 72 63 65 6e 74  ,.    { "percent
2c870 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
2c880 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74   sqlite3_percent
2c890 69 6c 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ile_init        
2c8a0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67     },.    { "reg
2c8b0 65 78 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  exp",           
2c8c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67       sqlite3_reg
2c8d0 65 78 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20  exp_init        
2c8e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2c8f0 22 73 70 65 6c 6c 66 69 78 22 2c 20 20 20 20 20  "spellfix",     
2c900 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c910 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20  _spellfix_init  
2c920 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c930 20 20 7b 20 22 74 6f 74 79 70 65 22 2c 20 20 20    { "totype",   
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c950 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74  ite3_totype_init
2c960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2c970 2c 0a 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75  ,.    { "wholenu
2c980 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  mber",          
2c990 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75   sqlite3_wholenu
2c9a0 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20  mber_init       
2c9b0 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c     },.  };.  sql
2c9c0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
2c9d0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
2c9e0 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20   int i, j, rc;. 
2c9f0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
2ca00 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33   0;.  if( objc<3
2ca10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2ca20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2ca30 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41   1, objv, "DB NA
2ca40 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ME ...");.    re
2ca50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ca60 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2ca70 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2ca80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2ca90 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
2caa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2cab0 20 20 66 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a    for(j=2; j<obj
2cac0 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61  c; j++){.    zNa
2cad0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
2cae0 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20  ng(objv[j]);.   
2caf0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
2cb00 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e  ySize(aExtension
2cb10 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
2cb20 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
2cb30 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a   aExtension[i].z
2cb40 45 78 74 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ExtName)==0 ) br
2cb50 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
2cb60 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28  f( i>=ArraySize(
2cb70 61 45 78 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20  aExtension) ){. 
2cb80 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
2cb90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
2cba0 6f 20 73 75 63 68 20 65 78 74 65 6e 73 69 6f 6e  o such extension
2cbb0 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61  : ", zName, (cha
2cbc0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  r*)0);.      ret
2cbd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2cbe0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 45     }.    rc = aE
2cbf0 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69  xtension[i].pIni
2cc00 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20  t(db, &zErrMsg, 
2cc10 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
2cc20 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72  SQLITE_OK || zEr
2cc30 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63  rMsg ){.      Tc
2cc40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2cc50 6e 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69  nterp, "initiali
2cc60 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61  zation of ", zNa
2cc70 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c  me, " failed: ",
2cc80 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20   zErrMsg,.      
2cc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cca0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2ccb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ccc0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
2ccd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2cce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ccf0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2cd00 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f  *.**     sorter_
2cd10 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f  test_fakeheap BO
2cd20 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  OL.**.*/.static 
2cd30 69 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f  int sorter_test_
2cd40 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64  fakeheap(.  void
2cd50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2cd60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2cd70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2cd80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2cd90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
2cda0 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62  t bArg;.  if( ob
2cdb0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2cdc0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2cdd0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2cde0 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  BOOL");.    retu
2cdf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2ce00 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  }..  if( Tcl_Get
2ce10 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
2ce20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
2ce30 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65  &bArg) ){.    re
2ce40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ce50 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20    }..  if( bArg 
2ce60 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
2ce70 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2ce80 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
2ce90 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cea0 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c  nfig.pHeap = SQL
2ceb0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d  ITE_INT_TO_PTR(-
2cec0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
2ced0 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e{.    if( sqlit
2cee0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
2cef0 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Heap==SQLITE_INT
2cf00 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20  _TO_PTR(-1) ){. 
2cf10 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2cf20 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
2cf30 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2cf40 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2cf50 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
2cf60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2cf70 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74  .**     sorter_t
2cf80 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72  est_sort4_helper
2cf90 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53   DB SQL1 NSTEP S
2cfa0 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  QL2.**.** Compil
2cfb0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
2cfc0 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69  $SQL1 and step i
2cfd0 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20  t $NSTEP times. 
2cfe0 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a  For each row, .*
2cff0 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  * check that the
2d000 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69   leftmost and ri
2d010 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ghtmost columns 
2d020 72 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74  returned are bot
2d030 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61  h integers,.** a
2d040 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e  nd that both con
2d050 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61  tain the same va
2d060 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  lue..**.** Then 
2d070 65 78 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e  execute statemen
2d080 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74  t $SQL2. Check t
2d090 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
2d0a0 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  t returns the sa
2d0b0 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74  me.** set of int
2d0c0 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d  egers in the sam
2d0d0 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68  e order as in th
2d0e0 65 20 70 72 65 76 69 6f 75 73 20 73 74 65 70 20  e previous step 
2d0f0 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a  (using $SQL1)..*
2d100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
2d110 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
2d120 65 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  elper(.  void * 
2d130 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2d140 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d150 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2d160 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2d170 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
2d180 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20   char *zSql1;.  
2d190 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2d1a0 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20  2;.  int nStep; 
2d1b0 0a 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20  .  int iStep; . 
2d1c0 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30   int iCksum1 = 0
2d1d0 3b 20 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d 32  ; .  int iCksum2
2d1e0 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b   = 0; .  int rc;
2d1f0 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c  .  int iB;.  sql
2d200 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69  ite3 *db;.  sqli
2d210 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
2d220 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
2d230 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
2d240 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2d250 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53  , 1, objv, "DB S
2d260 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29  QL1 NSTEP SQL2")
2d270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d280 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
2d290 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2d2a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2d2b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2d2c0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2d2d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31  L_ERROR;.  zSql1
2d2e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2d2f0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
2d300 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2d310 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2d320 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65  3], &nStep) ) re
2d330 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d340 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65    zSql2 = Tcl_Ge
2d350 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
2d360 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2d370 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
2d380 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74   zSql1, -1, &pSt
2d390 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
2d3a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2d3b0 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20  to sql_error;.. 
2d3c0 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   iB = sqlite3_co
2d3d0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
2d3e0 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70  )-1;.  for(iStep
2d3f0 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20  =0; iStep<nStep 
2d400 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
2d410 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2d420 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20  t); iStep++){.  
2d430 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65    int a = sqlite
2d440 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2d450 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
2d460 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  a!=sqlite3_colum
2d470 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29  n_int(pStmt, iB)
2d480 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
2d490 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2d4a0 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20  p, "data error: 
2d4b0 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20  (a!=b)", 0);.   
2d4c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2d4d0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
2d4e0 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73  iCksum1 += (iCks
2d4f0 75 6d 31 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20  um1 << 3) + a;. 
2d500 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2d510 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2d520 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2d530 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71  ITE_OK ) goto sq
2d540 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d  l_error;..  rc =
2d550 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2d560 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d  _v2(db, zSql2, -
2d570 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2d580 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d590 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
2d5a0 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70  ror;.  for(iStep
2d5b0 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  =0; SQLITE_ROW==
2d5c0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2d5d0 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
2d5e0 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
2d5f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2d600 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b  tmt, 0);.    iCk
2d610 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32  sum2 += (iCksum2
2d620 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a   << 3) + a;.  }.
2d630 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
2d640 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2d650 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d660 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65  _OK ) goto sql_e
2d670 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b  rror;..  if( iCk
2d680 73 75 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b  sum1!=iCksum2 ){
2d690 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2d6a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
2d6b0 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68  hecksum mismatch
2d6c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2d6d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d6e0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
2d6f0 4b 3b 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20  K;. sql_error:. 
2d700 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2d710 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65  t(interp, "sql e
2d720 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33  rror: ", sqlite3
2d730 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
2d740 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
2d750 52 4f 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ROR;.}...#ifdef 
2d760 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2d770 45 4e 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c  ENTICATION.#incl
2d780 75 64 65 20 22 73 71 6c 69 74 65 33 75 73 65 72  ude "sqlite3user
2d790 61 75 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63  auth.h"./*.** tc
2d7a0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
2d7b0 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65  ser_authenticate
2d7c0 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
2d7d0 53 57 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20  SWORD.*/.static 
2d7e0 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61 75  int test_user_au
2d7f0 74 68 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c  thenticate(.  Cl
2d800 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2d810 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
2d820 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2d830 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2d840 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2d850 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2d860 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2d870 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2d880 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d890 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2d8a0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2d8b0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2d8c0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2d8d0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55  */.){.  char *zU
2d8e0 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ser = 0;.  char 
2d8f0 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20  *zPasswd = 0;.  
2d900 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b  int nPasswd = 0;
2d910 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2d920 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2d930 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
2d940 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d950 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d960 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50  , "DB USERNAME P
2d970 41 53 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72  ASSWORD");.    r
2d980 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d990 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2d9a0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2d9b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2d9c0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
2d9d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d9e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65  RROR;.  }.  zUse
2d9f0 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
2da00 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50  g(objv[2]);.  zP
2da10 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53  asswd = Tcl_GetS
2da20 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
2da30 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b  v[3], &nPasswd);
2da40 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2da50 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
2da60 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  e(db, zUser, zPa
2da70 73 73 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a  sswd, nPasswd);.
2da80 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2da90 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2daa0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
2dab0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2dac0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2dad0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2dae0 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2daf0 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  ATION */..#ifdef
2db00 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2db10 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a  HENTICATION./*.*
2db20 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
2db30 65 33 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55  e3_user_add DB U
2db40 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
2db50 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74   ISADMIN.*/.stat
2db60 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72  ic int test_user
2db70 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61  _add(.  ClientDa
2db80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2db90 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2dba0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2dbb0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2dbc0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2dbd0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2dbe0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2dbf0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2dc00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2dc10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2dc20 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2dc30 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2dc40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2dc50 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
2dc60 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  0;.  char *zPass
2dc70 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  wd = 0;.  int nP
2dc80 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
2dc90 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20   isAdmin = 0;.  
2dca0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2dcb0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
2dcc0 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
2dcd0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2dce0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2dcf0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
2dd00 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a  WORD ISADMIN");.
2dd10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2dd20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2dd30 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2dd40 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2dd50 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2dd60 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2dd70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2dd80 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
2dd90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2dda0 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
2ddb0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2ddc0 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
2ddd0 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42  swd);.  Tcl_GetB
2dde0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2ddf0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
2de00 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d  isAdmin);.  rc =
2de10 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64   sqlite3_user_ad
2de20 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61  d(db, zUser, zPa
2de30 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69  sswd, nPasswd, i
2de40 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53  sAdmin);.  Tcl_S
2de50 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2de60 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2de70 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
2de80 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
2de90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2dea0 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
2deb0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
2dec0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2ded0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2dee0 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
2def0 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
2df00 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e  _change DB USERN
2df10 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
2df20 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  DMIN.*/.static i
2df30 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61  nt test_user_cha
2df40 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  nge(.  ClientDat
2df50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2df60 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2df70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2df80 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2df90 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2dfa0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2dfb0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2dfc0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2dfd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2dfe0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2dff0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2e000 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2e010 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2e020 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
2e030 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
2e040 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
2e050 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
2e060 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73  isAdmin = 0;.  s
2e070 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2e080 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
2e090 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
2e0a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2e0b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2e0c0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
2e0d0 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20  ORD ISADMIN");. 
2e0e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e0f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2e100 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2e110 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2e120 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2e130 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2e140 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2e150 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
2e160 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2e170 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
2e180 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2e190 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
2e1a0 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f  wd);.  Tcl_GetBo
2e1b0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2e1c0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69  erp, objv[4], &i
2e1d0 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20  sAdmin);.  rc = 
2e1e0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
2e1f0 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  nge(db, zUser, z
2e200 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
2e210 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
2e220 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2e230 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
2e240 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
2e250 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
2e260 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2e270 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
2e280 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2e290 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2e2a0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2e2b0 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
2e2c0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
2e2d0 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45  er_delete DB USE
2e2e0 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20  RNAME.*/.static 
2e2f0 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 64 65  int test_user_de
2e300 6c 65 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  lete(.  ClientDa
2e310 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2e320 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2e330 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e340 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2e350 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2e360 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2e370 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2e380 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2e390 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2e3a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2e3b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e3c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2e3d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2e3e0 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
2e3f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
2e400 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2e410 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
2e420 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2e430 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2e440 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45  jv, "DB USERNAME
2e450 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2e460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2e470 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2e480 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2e490 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2e4a0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2e4b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e4c0 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c   }.  zUser = Tcl
2e4d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2e4e0 32 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  2]);.  rc = sqli
2e4f0 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28  te3_user_delete(
2e500 64 62 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63  db, zUser);.  Tc
2e510 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2e520 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
2e530 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
2e540 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
2e550 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2e560 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
2e570 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2e580 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  N */../*.** Regi
2e590 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
2e5a0 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
2e5b0 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
2e5c0 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
2e5d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2e5e0 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  rp){.  extern in
2e5f0 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
2e600 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2e610 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75   int sqlite3_fou
2e620 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  nd_count;.  exte
2e630 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
2e640 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
2e650 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2e660 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
2e670 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2e680 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
2e690 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2e6a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2e6b0 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51  ent_time;.#if SQ
2e6c0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
2e6d0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2e6e0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2e6f0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e700 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  E.  extern int s
2e710 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2e720 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65  m;.#endif.  exte
2e730 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
2e740 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
2e750 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e760 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
2e770 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
2e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e7a0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
2e7b0 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
2e7c0 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
2e7d0 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
2e7e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
2e7f0 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
2e800 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
2e810 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
2e820 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
2e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2e840 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
2e850 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
2e860 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
2e870 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
2e880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2e890 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
2e8a0 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
2e8b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e8c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2e8d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
2e8e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e8f0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
2e900 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e910 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2e920 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
2e930 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e940 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
2e950 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
2e960 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
2e970 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ng",          (T
2e980 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e990 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
2e9a0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2e9b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2e9c0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
2e9d0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2e9e0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
2e9f0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2ea00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
2ea10 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
2ea20 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2ea30 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
2ea40 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2ea50 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2ea60 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
2ea70 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2ea80 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
2ea90 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
2eaa0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
2eab0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
2eac0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2ead0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
2eae0 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
2eaf0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
2eb00 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
2eb10 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2eb20 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
2eb30 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
2eb40 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
2eb50 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
2eb60 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2eb70 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
2eb80 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
2eb90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
2eba0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
2ebb0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2ebc0 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
2ebd0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2ebe0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
2ebf0 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
2ec00 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2ec10 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
2ec20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ec30 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
2ec40 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2ec50 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
2ec60 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
2ec70 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ec80 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2ec90 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
2eca0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
2ecb0 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
2ecc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ecd0 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
2ece0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2ecf0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2ed00 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
2ed10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ed20 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20  _exec_hex",     
2ed30 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2ed40 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
2ed50 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a  _hex         },.
2ed60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ed70 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20  exec",          
2ed80 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2ed90 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20  Proc*)test_exec 
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2edb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2edc0 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20  xec_nr",        
2edd0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ede0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e  roc*)test_exec_n
2edf0 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  r          },.#i
2ee00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2ee10 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20  T_GET_TABLE.    
2ee20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
2ee30 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
2ee40 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2ee50 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
2ee60 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69  _printf },.#endi
2ee70 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2ee80 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  3_close",       
2ee90 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2eea0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
2eeb0 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c  est_close     },
2eec0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2eed0 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20  _close_v2",     
2eee0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2eef0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
2ef00 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a  st_close_v2  },.
2ef10 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ef20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
2ef30 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2ef40 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
2ef50 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
2ef60 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2ef70 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
2ef80 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2ef90 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
2efa0 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
2efb0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
2efc0 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
2efd0 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
2efe0 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
2eff0 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
2f000 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
2f010 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2f020 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f030 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
2f040 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f050 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
2f060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f070 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2f080 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
2f090 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2f0a0 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f0c0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f0d0 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
2f0e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2f0f0 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f110 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2f120 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
2f130 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2f140 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
2f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f160 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2f170 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
2f180 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f190 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
2f1a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2f1b0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f1c0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
2f1d0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2f1e0 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
2f1f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2f200 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2f210 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
2f220 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2f230 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
2f240 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54  tion",        (T
2f250 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
2f260 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20  te_function     
2f270 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2f280 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
2f290 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63  tion",       (Tc
2f2a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
2f2b0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20  e_collation     
2f2c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f2d0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
2f2e0 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  it",        (Tcl
2f2f0 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75  _CmdProc*)get_au
2f300 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  tocommit        
2f310 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f320 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20  e3_stack_used", 
2f330 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f340 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74  CmdProc*)test_st
2f350 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d  ack_used       }
2f360 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f370 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c  3_busy_timeout",
2f380 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f390 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73  mdProc*)test_bus
2f3a0 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c  y_timeout     },
2f3b0 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22  .     { "printf"
2f3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f3d0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2f3e0 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e  dProc*)test_prin
2f3f0 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf           },.
2f400 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49       { "sqlite3I
2f410 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  oTrace",        
2f420 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2f430 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
2f440 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  e         },.   
2f450 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74    { "clang_sanit
2f460 69 7a 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20  ize_address",   
2f470 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f480 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a  c*)clang_sanitiz
2f490 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d  e_address },.  }
2f4a0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
2f4b0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
2f4c0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
2f4d0 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
2f4e0 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
2f4f0 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
2f500 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
2f510 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
2f520 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
2f530 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
2f540 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
2f550 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2f560 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2f570 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
2f580 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
2f590 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2f5a0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
2f5b0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
2f5c0 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
2f5d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2f5e0 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
2f5f0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2f600 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
2f610 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2f620 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
2f630 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2f640 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
2f650 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2f660 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
2f670 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2f680 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
2f690 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2f6a0 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
2f6b0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2f6c0 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
2f6d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f6e0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
2f6f0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2f700 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
2f710 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f720 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
2f730 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2f740 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
2f750 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f760 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2f770 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
2f780 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2f790 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
2f7a0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2f7b0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
2f7c0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
2f7d0 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
2f7e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f7f0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2f800 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
2f810 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2f820 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
2f830 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
2f840 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
2f850 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
2f860 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
2f870 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
2f880 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f890 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
2f8a0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2f8b0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
2f8c0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
2f8d0 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
2f8e0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2f8f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
2f900 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20  nded_errcode",  
2f910 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63      test_ex_errc
2f920 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ode    ,0 },.   
2f930 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
2f940 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
2f950 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
2f960 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2f970 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2f980 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
2f990 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
2f9a0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
2f9b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2f9c0 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
2f9d0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2f9e0 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2f9f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2fa00 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
2fa10 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2fa20 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
2fa30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2fa40 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20  _open_v2",      
2fa50 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
2fa60 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d  en_v2       ,0 }
2fa70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2fa80 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
2fa90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2faa0 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
2fab0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2fac0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2fae0 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
2faf0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2fb00 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2fb20 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
2fb30 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2fb40 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2fb50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
2fb60 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
2fb70 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2fb80 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
2fb90 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
2fba0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
2fbb0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
2fbc0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2fbd0 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
2fbe0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
2fbf0 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
2fc00 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
2fc10 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
2fc20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
2fc30 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2fc40 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
2fc50 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
2fc60 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
2fc70 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
2fc80 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
2fc90 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2fca0 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
2fcb0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2fcc0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
2fcd0 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
2fce0 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
2fcf0 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
2fd00 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
2fd10 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
2fd20 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
2fd30 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
2fd40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2fd50 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
2fd60 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
2fd70 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
2fd80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2fd90 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
2fda0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
2fdb0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
2fdc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2fdd0 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
2fde0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
2fdf0 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
2fe00 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2fe10 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
2fe20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
2fe30 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
2fe40 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2fe50 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
2fe60 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
2fe70 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30  stmt_readonly ,0
2fe80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2fe90 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20  te3_stmt_busy", 
2fea0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2feb0 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c  _stmt_busy     ,
2fec0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65  0 },.     { "use
2fed0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c  s_stmt_journal",
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
2fef0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c  s_stmt_journal ,
2ff00 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
2ff10 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
2ff20 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65  mory",        te
2ff30 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
2ff40 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  y,     0},.     
2ff50 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  { "sqlite3_db_re
2ff60 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
2ff70 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61     test_db_relea
2ff80 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a  se_memory,  0},.
2ff90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ffa0 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  db_filename",   
2ffb0 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
2ffc0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  filename,       
2ffd0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2ffe0 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
2fff0 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
30000 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20  t_db_readonly,  
30010 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
30020 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   "sqlite3_soft_h
30030 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  eap_limit",     
30040 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70    test_soft_heap
30050 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20  _limit,    0},. 
30060 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
30070 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20  hread_cleanup", 
30080 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65         test_thre
30090 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20  ad_cleanup,     
300a0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
300b0 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
300c0 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  nts",       test
300d0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
300e0 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b  ,    0},..     {
300f0 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65   "sqlite3_load_e
30100 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20  xtension",      
30110 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65    test_load_exte
30120 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20  nsion,     0},. 
30130 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30140 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
30150 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62  sion", test_enab
30160 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  le_load,        
30170 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
30180 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
30190 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74  ult_codes", test
301a0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
301b0 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20  _codes, 0},.    
301c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69   { "sqlite3_limi
301d0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
301e0 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20      test_limit, 
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30200 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76  0},..     { "sav
30210 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
30220 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
30230 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  e_prng_state,   
30240 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
30250 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
30260 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ",            re
30270 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
30280 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  , 0 },.     { "r
30290 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22  eset_prng_state"
302a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  ,              r
302b0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c  eset_prng_state,
302c0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
302d0 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63  database_never_c
302e0 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20  orrupt",        
302f0 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63  database_never_c
30300 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20  orrupt, 0},.    
30310 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79   { "database_may
30320 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20  _be_corrupt",   
30330 20 20 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79      database_may
30340 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c  _be_corrupt, 0},
30350 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a  .     { "optimiz
30360 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20  ation_control", 
30370 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a           optimiz
30380 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d  ation_control,0}
30390 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ,.#if SQLITE_OS_
303a0 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b  WIN.     { "lock
303b0 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
303c0 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
303d0 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20  2_file_lock,    
303e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69  0 },.     { "exi
303f0 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c  sts_win32_path",
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
30410 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20  32_exists_path, 
30420 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69   0 },.     { "fi
30430 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  nd_win32_file", 
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
30450 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20  n32_find_file,  
30460 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64    0 },.     { "d
30470 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65  elete_win32_file
30480 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ",             w
30490 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
304a0 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ,  0 },.     { "
304b0 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c  make_win32_dir",
304c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
304d0 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20  win32_mkdir,    
304e0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
304f0 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69  "remove_win32_di
30500 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
30510 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20   win32_rmdir,   
30520 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
30530 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a  .     { "tcl_obj
30540 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  proc",          
30550 20 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62           runAsOb
30560 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d  jProc,       0 }
30570 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ,..     /* sqlit
30580 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50  e3_column_*() AP
30590 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c  I */.     { "sql
305a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
305b0 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  t",          tes
305c0 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20  t_column_count  
305d0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
305e0 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
305f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
30600 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20  st_data_count   
30610 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30620 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
30630 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  pe",           t
30640 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  est_column_type 
30650 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30660 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
30670 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20  lob",           
30680 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  test_column_blob
30690 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
306a0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
306b0 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
306c0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75   test_column_dou
306d0 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  ble ,0 },.     {
306e0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
306f0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
30700 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e    test_column_in
30710 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t64  ,0 },.     
30720 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
30730 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f  n_text",   test_
30740 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69  stmt_utf8,  (voi
30750 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
30760 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b  n_text },.     {
30770 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
30780 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73  _name",   test_s
30790 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64  tmt_utf8,  (void
307a0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
307b0 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20  _name },.     { 
307c0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
307d0 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74  int",    test_st
307e0 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a  mt_int,   (void*
307f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30800 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  int  },.     { "
30810 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
30820 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d  ytes",  test_stm
30830 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29  t_int,   (void*)
30840 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
30850 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53  ytes},.#ifndef S
30860 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
30870 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  YPE.     { "sqli
30880 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
30890 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ype",test_stmt_u
308a0 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
308b0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
308c0 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64  pe},.#endif.#ifd
308d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
308e0 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
308f0 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
30900 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
30910 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
30920 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
30930 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
30940 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65  name},.{ "sqlite
30950 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
30960 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
30970 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
30980 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
30990 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65  name},.{ "sqlite
309a0 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
309b0 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  name",test_stmt_
309c0 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
309d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
309e0 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a  n_name},.#endif.
309f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
30a00 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20  OMIT_UTF16.     
30a10 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
30a20 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73 74  n_bytes16", test
30a30 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64  _stmt_int, (void
30a40 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
30a50 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20  _bytes16 },.    
30a60 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
30a70 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73  mn_text16",  tes
30a80 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
30a90 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
30aa0 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20  umn_text16},.   
30ab0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
30ac0 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65  umn_name16",  te
30ad0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
30ae0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
30af0 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20  lumn_name16},.  
30b00 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d     { "add_alignm
30b10 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
30b20 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d  ons", add_alignm
30b30 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
30b40 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23  ons, 0      },.#
30b50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30b60 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20  IT_DECLTYPE.    
30b70 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
30b80 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74  mn_decltype16",t
30b90 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28  est_stmt_utf16,(
30ba0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
30bb0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d  lumn_decltype16}
30bc0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
30bd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
30be0 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22  LUMN_METADATA.{"
30bf0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
30c00 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c  atabase_name16",
30c10 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  .  test_stmt_utf
30c20 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
30c30 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
30c40 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  se_name16},.{"sq
30c50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
30c60 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74  le_name16", test
30c70 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
30c80 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
30c90 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d  mn_table_name16}
30ca0 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,.{"sqlite3_colu
30cb0 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36  mn_origin_name16
30cc0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
30cd0 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
30ce0 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
30cf0 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66  _name16},.#endif
30d00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
30d10 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
30d20 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65  ollation_v2", te
30d30 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  st_create_collat
30d40 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20  ion_v2, 0 },.   
30d50 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f    { "sqlite3_glo
30d60 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20  bal_recover",   
30d70 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65    test_global_re
30d80 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20  cover, 0   },.  
30d90 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34     { "working_64
30da0 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  bit_int",       
30db0 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74     working_64bit
30dc0 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20  _int,   0   },. 
30dd0 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e      { "vfs_unlin
30de0 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  k_test",        
30df0 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74      vfs_unlink_t
30e00 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  est,     0   },.
30e10 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74       { "vfs_init
30e20 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  fail_test",     
30e30 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69       vfs_initfai
30e40 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
30e50 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72  .     { "vfs_unr
30e60 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
30e70 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69        vfs_unregi
30e80 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
30e90 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65  ,.     { "vfs_re
30ea0 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20  register_all",  
30eb0 20 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67         vfs_rereg
30ec0 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20  ister_all,  0   
30ed0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
30ee0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20  control_test",  
30ef0 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
30f00 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20  trol_test,   0  
30f10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
30f20 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
30f30 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  no_test", file_c
30f40 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
30f50 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
30f60 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
30f70 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
30f80 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
30f90 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
30fa0 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
30fb0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63   "file_control_c
30fc0 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20  hunksize_test", 
30fd0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
30fe0 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20  nksize_test,  0 
30ff0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
31000 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
31010 6e 74 5f 74 65 73 74 22 2c 20 20 66 69 6c 65 5f  nt_test",  file_
31020 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
31030 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
31040 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
31050 4e 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  N.     { "file_c
31060 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
31070 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e  retry", file_con
31080 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
31090 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  try,  0   },.   
310a0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
310b0 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64  l_win32_set_hand
310c0 6c 65 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  le", file_contro
310d0 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64  l_win32_set_hand
310e0 6c 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  le, 0  },.#endif
310f0 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
31100 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
31110 6c 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74  l",    file_cont
31120 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c  rol_persist_wal,
31130 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
31140 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
31150 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
31160 72 69 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72  rite",file_contr
31170 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
31180 72 77 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20  rwrite,0},.     
31190 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
311a0 76 66 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20  vfsname",       
311b0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66   file_control_vf
311c0 73 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30  sname,         0
311d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
311e0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
311f0 69 6c 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65  ilename",   file
31200 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
31210 65 6e 61 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c  ename,    0   },
31220 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31230 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20  _vfs_list",     
31240 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20        vfs_list, 
31250 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
31260 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
31270 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20  e_function_v2", 
31280 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
31290 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20  tion_v2, 0 },.. 
312a0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
312b0 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69   from os.h */.#i
312c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
312d0 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
312e0 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
312f0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
31300 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20  ollate, 0       
31310 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
31320 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
31330 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63  _needed", test_c
31340 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30  ollate_needed, 0
31350 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
31360 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
31370 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66  n",       test_f
31380 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20  unction, 0      
31390 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
313a0 61 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69  add_test_utf16bi
313b0 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74  n_collate",    t
313c0 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
313d0 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d  late, 0        }
313e0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
313f0 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72  "sqlite3_test_er
31400 72 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f  rstr",     test_
31410 65 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20  errstr, 0       
31420 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
31430 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79  "tcl_variable_ty
31440 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76  pe",       tcl_v
31450 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20  ariable_type, 0 
31460 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
31470 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
31480 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b  RED_CACHE.     {
31490 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
314a0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20  _shared_cache", 
314b0 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72  test_enable_shar
314c0 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ed, 0  },.     {
314d0 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64   "sqlite3_shared
314e0 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20  _cache_report", 
314f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
31500 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30  edCacheReport, 0
31510 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
31520 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   "sqlite3_libver
31530 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65  sion_number", te
31540 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
31550 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66 64  mber, 0  },.#ifd
31560 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
31570 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41  _COLUMN_METADATA
31580 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31590 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
315a0 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61  tadata", test_ta
315b0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
315c0 61 74 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ata, 0  },.#endi
315d0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
315e0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
315f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
31600 6c 6f 62 5f 72 65 61 64 22 2c 20 20 20 74 65 73  lob_read",   tes
31610 74 5f 62 6c 6f 62 5f 72 65 61 64 2c 20 30 20 20  t_blob_read, 0  
31620 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31630 65 33 5f 62 6c 6f 62 5f 77 72 69 74 65 22 2c 20  e3_blob_write", 
31640 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72 69 74 65   test_blob_write
31650 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
31660 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
31670 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f  pen", test_blob_
31680 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a 20 20  reopen, 0  },.  
31690 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c     { "sqlite3_bl
316a0 6f 62 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74  ob_bytes",  test
316b0 5f 62 6c 6f 62 5f 62 79 74 65 73 2c 20 30 20 20  _blob_bytes, 0  
316c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
316d0 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 22 2c 20  e3_blob_close", 
316e0 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65   test_blob_close
316f0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
31700 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74      { "pcache_st
31710 61 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  ats",       test
31720 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30  _pcache_stats, 0
31730 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49    },.#ifdef SQLI
31740 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
31750 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22  _NOTIFY.     { "
31760 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
31770 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c  otify", test_unl
31780 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d  ock_notify, 0  }
31790 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
317a0 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  "sqlite3_wal_che
317b0 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65 73 74  ckpoint",   test
317c0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c  _wal_checkpoint,
317d0 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   0  },.     { "s
317e0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
317f0 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77  point_v2",test_w
31800 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
31810 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
31820 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67  test_sqlite3_log
31830 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
31840 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30 20 20  sqlite3_log, 0  
31850 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
31860 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20  E_OMIT_EXPLAIN. 
31870 20 20 20 20 7b 20 22 70 72 69 6e 74 5f 65 78 70      { "print_exp
31880 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e 22  lain_query_plan"
31890 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70  , test_print_eqp
318a0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
318b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
318c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20 74 65  est_control", te
318d0 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20  st_test_control 
318e0 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  },.#if SQLITE_OS
318f0 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20 22 67 65  _UNIX.     { "ge
31900 74 72 75 73 61 67 65 22 2c 20 74 65 73 74 5f 67  trusage", test_g
31910 65 74 72 75 73 61 67 65 20 7d 2c 0a 23 65 6e 64  etrusage },.#end
31920 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f 61 64 5f  if.     { "load_
31930 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  static_extension
31940 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61 74 69 63  ", tclLoadStatic
31950 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a  ExtensionCmd },.
31960 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74       { "sorter_t
31970 65 73 74 5f 66 61 6b 65 68 65 61 70 22 2c 20 73  est_fakeheap", s
31980 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68  orter_test_fakeh
31990 65 61 70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  eap },.     { "s
319a0 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34  orter_test_sort4
319b0 5f 68 65 6c 70 65 72 22 2c 20 73 6f 72 74 65 72  _helper", sorter
319c0 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
319d0 65 72 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  er },.#ifdef SQL
319e0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
319f0 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 7b 20 22  ICATION.     { "
31a00 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
31a10 68 65 6e 74 69 63 61 74 65 22 2c 20 74 65 73 74  henticate", test
31a20 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
31a30 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
31a40 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64  "sqlite3_user_ad
31a50 64 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  d",          tes
31a60 74 5f 75 73 65 72 5f 61 64 64 2c 20 20 20 20 20  t_user_add,     
31a70 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b       0 },.     {
31a80 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63   "sqlite3_user_c
31a90 68 61 6e 67 65 22 2c 20 20 20 20 20 20 20 74 65  hange",       te
31aa0 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 2c 20  st_user_change, 
31ab0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
31ac0 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  { "sqlite3_user_
31ad0 64 65 6c 65 74 65 22 2c 20 20 20 20 20 20 20 74  delete",       t
31ae0 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65 2c  est_user_delete,
31af0 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
31b00 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
31b10 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
31b20 4e 53 54 41 54 55 53 0a 20 20 20 20 20 7b 20 22  NSTATUS.     { "
31b30 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
31b40 6e 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20  nstatus",       
31b50 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
31b60 61 74 75 73 2c 20 20 20 30 20 7d 2c 0a 20 20 20  atus,   0 },.   
31b70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d    { "sqlite3_stm
31b80 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
31b90 65 74 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 73  et", test_stmt_s
31ba0 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 2c  canstatus_reset,
31bb0 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
31bc0 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e    };.  static in
31bd0 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d  t bitmask_size =
31be0 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29   sizeof(Bitmask)
31bf0 2a 38 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65  *8;.  int i;.  e
31c00 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
31c10 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71  3_sync_count, sq
31c20 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
31c30 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
31c40 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
31c50 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  emp_count;.  ext
31c60 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31c70 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  like_count;.  ex
31c80 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
31c90 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a  _xferopt_count;.
31ca0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31cb0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
31cc0 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  b_count;.  exter
31cd0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
31ce0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
31cf0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
31d00 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
31d10 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20  itej_count;.#if 
31d20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
31d30 65 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61  extern LONG vola
31d40 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f  tile sqlite3_os_
31d50 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  type;.#endif.#if
31d60 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
31d70 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
31d80 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
31d90 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
31da0 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20  lite3OSTrace;.  
31db0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31dc0 65 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64  e3WalTrace;.#end
31dd0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
31de0 5f 54 45 53 54 0a 23 69 66 64 65 66 20 53 51 4c  _TEST.#ifdef SQL
31df0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a  ITE_ENABLE_FTS3.
31e00 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31e10 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
31e20 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23 65  _parentheses;.#e
31e30 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66  ndif.#endif..  f
31e40 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
31e50 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43  (aCmd)/sizeof(aC
31e60 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
31e70 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
31e80 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
31e90 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
31ea0 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
31eb0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
31ec0 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
31ed0 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
31ee0 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
31ef0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
31f00 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
31f10 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
31f20 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
31f30 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
31f40 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
31f50 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
31f60 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
31f70 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
31f80 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
31f90 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61  ar*)&sqlite3_sea
31fa0 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  rch_count, TCL_L
31fb0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
31fc0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
31fd0 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f  "sqlite_found_co
31fe0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
31ff0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f 75  ar*)&sqlite3_fou
32000 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nd_count, TCL_LI
32010 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
32020 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32030 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
32040 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
32050 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  *)&sqlite3_sort_
32060 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
32070 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
32080 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
32090 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
320a0 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  e", .      (char
320b0 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  *)&sqlite3_max_b
320c0 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e  lobsize, TCL_LIN
320d0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
320e0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
320f0 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
32100 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
32110 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  )&sqlite3_like_c
32120 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
32130 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
32140 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
32150 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  te_interrupt_cou
32160 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
32170 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65  r*)&sqlite3_inte
32180 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  rrupt_count, TCL
32190 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
321a0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
321b0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  , "sqlite_open_f
321c0 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ile_count", .   
321d0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
321e0 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
321f0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
32200 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
32210 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
32220 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20  _current_time", 
32230 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
32240 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
32250 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ime, TCL_LINK_IN
32260 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  T);.#if SQLITE_O
32270 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
32280 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
32290 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
322a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63  CKING_STYLE.  Tc
322b0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
322c0 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69 64  , "sqlite_hostid
322d0 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28 63  _num", .      (c
322e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f  har*)&sqlite3_ho
322f0 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49  stid_num, TCL_LI
32300 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
32310 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32320 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78  terp, "sqlite3_x
32330 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20  feropt_count",. 
32340 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
32350 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite3_xferopt_cou
32360 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
32370 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
32380 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
32390 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
323a0 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
323b0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67  ar*)&sqlite3_pag
323c0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c  er_readdb_count,
323d0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
323e0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
323f0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
32400 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
32410 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
32420 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72  *)&sqlite3_pager
32430 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20  _writedb_count, 
32440 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
32450 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
32460 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
32470 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
32480 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
32490 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  &sqlite3_pager_w
324a0 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c  ritej_count, TCL
324b0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e  _LINK_INT);.#ifn
324c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
324d0 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b  UTF16.  Tcl_Link
324e0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  Var(interp, "una
324f0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
32500 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63  unter",.      (c
32510 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f  har*)&unaligned_
32520 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20  string_counter, 
32530 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
32540 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
32550 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
32560 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32570 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61  terp, "sqlite_la
32580 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74  st_needed_collat
32590 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ion",.      (cha
325a0 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c  r*)&pzNeededColl
325b0 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ation, TCL_LINK_
325c0 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f  STRING|TCL_LINK_
325d0 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  READ_ONLY);.#end
325e0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  if.#if SQLITE_OS
325f0 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  _WIN.  Tcl_LinkV
32600 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
32610 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20  te_os_type",.   
32620 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
32630 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f  e3_os_type, TCL_
32640 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64  LINK_LONG);.#end
32650 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
32660 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73 74  _TEST.  {.    st
32670 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
32680 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22 2a  *query_plan = "*
32690 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52 49  ** OBSOLETE VARI
326a0 41 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20 54  ABLE ***";.    T
326b0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
326c0 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
326d0 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20 28  _plan",.       (
326e0 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61  char*)&query_pla
326f0 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
32700 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
32710 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e 64  _ONLY);.  }.#end
32720 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
32730 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e  _DEBUG.  Tcl_Lin
32740 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
32750 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65  lite_where_trace
32760 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
32770 26 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  &sqlite3WhereTra
32780 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
32790 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
327a0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
327b0 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20  _os_trace",.    
327c0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
327d0 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  3OSTrace, TCL_LI
327e0 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66  NK_INT);.#ifndef
327f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
32800 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
32810 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77  nterp, "sqlite_w
32820 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  al_trace",.     
32830 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
32840 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  WalTrace, TCL_LI
32850 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
32860 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
32870 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
32880 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  O.  Tcl_LinkVar(
32890 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
328a0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c  opentemp_count",
328b0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
328c0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
328d0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
328e0 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  INT);.#endif.  T
328f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
32900 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  p, "sqlite_stati
32910 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20  c_bind_value",. 
32920 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
32930 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
32940 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  value, TCL_LINK_
32950 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
32960 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32970 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
32980 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20  nd_nbyte",.     
32990 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
329a0 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
329b0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
329c0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
329d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
329e0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c  temp_directory",
329f0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
32a00 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
32a10 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ctory, TCL_LINK_
32a20 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
32a30 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32a40 73 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72 65  sqlite_data_dire
32a50 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63  ctory",.      (c
32a60 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64 61  har*)&sqlite3_da
32a70 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43  ta_directory, TC
32a80 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
32a90 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32aa0 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73  terp, "bitmask_s
32ab0 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ize",.      (cha
32ac0 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65  r*)&bitmask_size
32ad0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54  , TCL_LINK_INT|T
32ae0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
32af0 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  Y);.  Tcl_LinkVa
32b00 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
32b10 65 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  e_sync_count",. 
32b20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
32b30 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c  ite3_sync_count,
32b40 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
32b50 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32b60 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75  terp, "sqlite_fu
32b70 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20  llsync_count",. 
32b80 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
32b90 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
32ba0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
32bb0 54 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  T);.#if defined(
32bc0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
32bd0 53 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  S3) && defined(S
32be0 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63  QLITE_TEST).  Tc
32bf0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
32c00 2c 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65  , "sqlite_fts3_e
32c10 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
32c20 73 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  s",.      (char*
32c30 29 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  )&sqlite3_fts3_e
32c40 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
32c50 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  s, TCL_LINK_INT)
32c60 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
32c70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a              n TCL_OK;.}.