/ Hex Artifact Content
Login

Artifact 52965bd684ddcd7f22328ebd7d50fd0b6e51f0d4:


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 71 6c 69 74 65 33 5f 73  ata;.  sqlite3_s
0910: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
0920: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22  Buf), zBuf, "%p"
0930: 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f  , p->db);.  Tcl_
0940: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0950: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0970: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
0990: 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a  sqlite3 object..
09a0: 2a 2f 0a 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  */.int getDbPoin
09b0: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
09c0: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
09d0: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20  ar *zA, sqlite3 
09e0: 2a 2a 70 70 44 62 29 7b 0a 20 20 73 74 72 75 63  **ppDb){.  struc
09f0: 74 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20  t SqliteDb *p;. 
0a00: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
0a10: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f  Info;.  if( Tcl_
0a20: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
0a30: 6e 74 65 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49  nterp, zA, &cmdI
0a40: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  nfo) ){.    p = 
0a50: 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
0a60: 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
0a70: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 70 70  entData;.    *pp
0a80: 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65  Db = p->db;.  }e
0a90: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d  lse{.    *ppDb =
0aa0: 20 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74   (sqlite3*)sqlit
0ab0: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
0ac0: 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  zA);.  }.  retur
0ad0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
0ae0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
0af0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 57 69  *.** Decode a Wi
0b00: 6e 33 32 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63  n32 HANDLE objec
0b10: 74 2e 0a 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e  t..*/.int getWin
0b20: 33 32 48 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74  32Handle(Tcl_Int
0b30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
0b40: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48  st char *zA, LPH
0b50: 41 4e 44 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20  ANDLE phFile){. 
0b60: 20 2a 70 68 46 69 6c 65 20 3d 20 28 48 41 4e 44   *phFile = (HAND
0b70: 4c 45 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  LE)sqlite3TestTe
0b80: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72  xtToPtr(zA);.  r
0b90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0ba0: 23 65 6e 64 69 66 0a 0a 65 78 74 65 72 6e 20 63  #endif..extern c
0bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0bc0: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a  e3ErrName(int);.
0bd0: 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f 72 4e  #define t1ErrorN
0be0: 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ame sqlite3ErrNa
0bf0: 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  me../*.** Conver
0c00: 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  t an sqlite3_stm
0c10: 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  t* into an sqlit
0c20: 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e  e3*.  This depen
0c30: 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63  ds on the.** fac
0c40: 74 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  t that the sqlit
0c50: 65 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74  e3* is the first
0c60: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64   field in the Vd
0c70: 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  be structure..*/
0c80: 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44  .#define StmtToD
0c90: 62 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64  b(X)   sqlite3_d
0ca0: 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a  b_handle(X)../*.
0cb0: 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72  ** Check a retur
0cc0: 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20  n value to make 
0cd0: 73 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77  sure it agrees w
0ce0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ith the results.
0cf0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
0d00: 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  errcode..*/.int 
0d10: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
0d20: 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  de(Tcl_Interp *i
0d30: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a  nterp, sqlite3 *
0d40: 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  db, int rc){.  i
0d50: 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  f( sqlite3_threa
0d60: 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63  dsafe()==0 && rc
0d70: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
0d80: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
0d90: 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65  .   && sqlite3_e
0da0: 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29  rrcode(db)!=rc )
0db0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
0dc0: 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32  200];.    int r2
0dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
0de0: 64 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  de(db);.    sqli
0df0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
0e00: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
0e10: 0a 20 20 20 20 20 20 20 22 65 72 72 6f 72 20 63  .       "error c
0e20: 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73  ode %s (%d) does
0e30: 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74   not match sqlit
0e40: 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25  e3_errcode %s (%
0e50: 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72  d)",.       t1Er
0e60: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c  rorName(rc), rc,
0e70: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29   t1ErrorName(r2)
0e80: 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52  , r2);.    Tcl_R
0e90: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
0ea0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  p);.    Tcl_Appe
0eb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0ec0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72   zBuf, 0);.    r
0ed0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
0ee0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
0ef0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
0f00: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
0f10: 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  _stmt object..*/
0f20: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
0f30: 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63  tmtPointer(.  Tc
0f40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0f50: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0f60: 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74  *zArg,  .  sqlit
0f70: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
0f80: 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
0f90: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73  (sqlite3_stmt*)s
0fa0: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0fb0: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0fc0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0fd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
0fe0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
0ff0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1000: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1010: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1020: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1030: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1040: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1050: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1060: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1070: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1080: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1090: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
10a0: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
10b0: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
10c0: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
10d0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
10e0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
10f0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1100: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1110: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1120: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1130: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1140: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1150: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1160: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1170: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1180: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1190: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
11a0: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
11b0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
11c0: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
11d0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
11e0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
11f0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1200: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1210: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1220: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
1230: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
1240: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
1250: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
1260: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
1270: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
1280: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1290: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
12a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
12b0: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
12c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
12d0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
12e0: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
12f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1300: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
1310: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
1320: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1330: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
1340: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
1350: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
1360: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1370: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
1380: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
1390: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
13a0: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
13b0: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
13c0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
13d0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
13e0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
13f0: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
1400: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1410: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
1420: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
1430: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
1440: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1450: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
1460: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1470: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
1480: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
1490: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
14a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14b0: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
14c0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  callback..*/.#if
14d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14e0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
14f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1500: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73  NABLE_IOTRACE).s
1510: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
1520: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
1530: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
1540: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
1550: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1560: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1570: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1580: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1590: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
15a0: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
15b0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
15c0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
15d0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e  ace_file);.}.#en
15e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
15f0: 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45  :  io_trace FILE
1600: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  NAME.**.** Turn 
1610: 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  I/O tracing on o
1620: 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e  r off.  If FILEN
1630: 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  AME is not an em
1640: 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49  pty string,.** I
1650: 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e  /O tracing begin
1660: 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c  s going into FIL
1670: 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41  ENAME. If FILENA
1680: 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a  ME is an empty.*
1690: 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72  * string, I/O tr
16a0: 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  acing is turned 
16b0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
16c0: 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  nt test_io_trace
16d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
16e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
16f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1700: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1710: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1720: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1730: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1750: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1760: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1780: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1790: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ment */.){.#if !
17a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
17c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69  BLE_IOTRACE).  i
17e0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
17f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1800: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1810: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1820: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1830: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49  ,.          " FI
1840: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
1850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1860: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ROR;.  }.  if( i
1870: 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20  otrace_file ){. 
1880: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66     if( iotrace_f
1890: 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69  ile!=stdout && i
18a0: 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64  otrace_file!=std
18b0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  err ){.      fcl
18c0: 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ose(iotrace_file
18d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74  );.    }.    iot
18e0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20  race_file = 0;. 
18f0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1900: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1910: 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20   argv[1][0] ){. 
1920: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
1930: 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d  gv[1],"stdout")=
1940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72  =0 ){.      iotr
1950: 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75  ace_file = stdou
1960: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
1970: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
1980: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
1990: 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69        iotrace_fi
19a0: 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20  le = stderr;.   
19b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
19c0: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70  trace_file = fop
19d0: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29  en(argv[1], "w")
19e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19f0: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f  te3IoTrace = io_
1a00: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a  trace_callback;.
1a10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1a20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61  *.** Usage:  cla
1a40: 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
1a50: 65 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ess .**.** Retur
1a60: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70  ns true if the p
1a70: 72 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69  rogram was compi
1a80: 6c 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20  led using clang 
1a90: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73  with the .** -fs
1aa0: 61 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20  anitize=address 
1ab0: 73 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f  switch on the co
1ac0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73  mmand line. Fals
1ad0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
1ae0: 2a 2a 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  ** Also return t
1af0: 72 75 65 20 69 66 20 74 68 65 20 4f 4d 49 54 5f  rue if the OMIT_
1b00: 4d 49 53 55 53 45 20 65 6e 76 69 72 6f 6e 6d 65  MISUSE environme
1b10: 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73  nt variable exis
1b20: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
1b30: 74 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65  t clang_sanitize
1b40: 5f 61 64 64 72 65 73 73 28 0a 20 20 76 6f 69 64  _address(.  void
1b50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1b80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1b90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ba0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1bb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1bc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1bd0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1be0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1bf0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1c00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1c10: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
1c20: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
1c30: 68 61 73 5f 66 65 61 74 75 72 65 29 0a 23 20 69  has_feature).# i
1c40: 66 20 5f 5f 68 61 73 5f 66 65 61 74 75 72 65 28  f __has_feature(
1c50: 61 64 64 72 65 73 73 5f 73 61 6e 69 74 69 7a 65  address_sanitize
1c60: 72 29 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 20  r).  res = 1;.# 
1c70: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
1c80: 64 65 66 20 5f 5f 53 41 4e 49 54 49 5a 45 5f 41  def __SANITIZE_A
1c90: 44 44 52 45 53 53 5f 5f 0a 20 20 72 65 73 20 3d  DDRESS__.  res =
1ca0: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
1cb0: 20 72 65 73 3d 3d 30 20 26 26 20 67 65 74 65 6e   res==0 && geten
1cc0: 76 28 22 4f 4d 49 54 5f 4d 49 53 55 53 45 22 29  v("OMIT_MISUSE")
1cd0: 21 3d 30 20 29 20 72 65 73 20 3d 20 31 3b 0a 20  !=0 ) res = 1;. 
1ce0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1cf0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d00: 77 49 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20  wIntObj(res));. 
1d10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d20: 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  }.  ./*.** Usage
1d30: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
1d40: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1d50: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1d60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1d70: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
1d80: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
1d90: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
1da0: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
1db0: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
1dc0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
1dd0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
1de0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
1df0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
1e00: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
1e10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
1e20: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
1e30: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
1e40: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
1e50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1e60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1e80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1e90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ea0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1eb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1ec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ed0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1ee0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1ef0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1f00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1f10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f20: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1f30: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
1f40: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
1f50: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1f60: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1f70: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
1f80: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1fa0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1fb0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1fc0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
1fd0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
1fe0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2000: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2010: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2020: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2040: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2050: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2070: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2080: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2090: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
20a0: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
20b0: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
20c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
20d0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  l);.  sqlite3_sn
20e0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
20f0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
2100: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2120: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2140: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2150: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2160: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2170: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2180: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2190: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
21a0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
21b0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
21c0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
21d0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
21e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
21f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2200: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2210: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20  lite3_exec_hex  
2220: 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e  DB  HEX.**.** In
2230: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
2240: 5f 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72  _exec() on a str
2250: 69 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61  ing that is obta
2260: 69 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74  ined by translat
2270: 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20  ing.** HEX into 
2280: 41 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61  ASCII.  Most cha
2290: 72 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e  racters are tran
22a0: 73 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25  slated as is.  %
22b0: 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  HH becomes.** a 
22c0: 68 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  hex character..*
22d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
22e0: 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f  t_exec_hex(.  vo
22f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2310: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2320: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2330: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2340: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2350: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2370: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2380: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2390: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
23a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
23b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23c0: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
23d0: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c  g str;.  int rc,
23e0: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a   i, j;.  char *z
23f0: 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Err = 0;.  char 
2400: 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53  *zHex;.  char zS
2410: 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72 20  ql[501];.  char 
2420: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20  zBuf[30];.  if( 
2430: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
2440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2450: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2460: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2470: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2480: 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22         " DB HEX"
2490: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24b0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24c0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
24d0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
24e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
24f0: 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Hex = argv[2];. 
2500: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28 73   for(i=j=0; i<(s
2510: 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20 26  izeof(zSql)-1) &
2520: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2530: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
2540: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
2550: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
2560: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
2570: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
2580: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
2590: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
25a0: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
25b0: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
25c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
25d0: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
25e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
25f0: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
2600: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2610: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
2620: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2630: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
2640: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
2650: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2660: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
2670: 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29   zBuf, "%d", rc)
2680: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2690: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
26a0: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
26b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
26d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
26e0: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
26f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2700: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
2710: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
2720: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
2730: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2740: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2750: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2760: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2770: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2780: 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74  * Usage:  db_ent
2790: 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20  er DB.**        
27a0: 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a   db_leave DB.**.
27b0: 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76  ** Enter or leav
27c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61  e the mutex on a
27d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
27e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27f0: 69 6e 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20  int db_enter(.  
2800: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
2810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2820: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2830: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2840: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2850: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2860: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
2870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2880: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2890: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
28b0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
28c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28d0: 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
28e0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
28f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2900: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2910: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2920: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2930: 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
2940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2950: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2960: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2970: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2980: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2990: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ROR;.  sqlite3_m
29a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
29b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
29c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  TCL_OK;.}.static
29d0: 20 69 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20   int db_leave(. 
29e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
29f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a00: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2a10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a20: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a30: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a40: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2a50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2a70: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2a90: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2aa0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2ab0: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
2ac0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2ad0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ae0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2af0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2b00: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
2b10: 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
2b20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2b40: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2b50: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2b60: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2b70: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
2b80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
2b90: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
2ba0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2bb0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2bc0: 33 5f 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a  3_exec  DB  SQL.
2bd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
2be0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e   sqlite3_exec in
2bf0: 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68  terface using th
2c00: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
2c10: 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
2c20: 20 74 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f   test_exec(.  vo
2c30: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2c40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c50: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2c60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2c70: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2c80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cb0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2cc0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2cd0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2ce0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2cf0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2d00: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
2d10: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
2d20: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2d30: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
2d40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
2d50: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2d60: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2d70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2d90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2da0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2db0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2dc0: 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  SQL", 0);.    re
2dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2de0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2df0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2e00: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e20: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
2e30: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
2e40: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e50: 74 66 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d  tf("%s", argv[2]
2e60: 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
2e70: 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69  zSql[i];){.    i
2e80: 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20  f( zSql[i]=='%' 
2e90: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
2ea0: 2b 5d 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49  +] = (testHexToI
2eb0: 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34  nt(zSql[i+1])<<4
2ec0: 29 20 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74  ) + testHexToInt
2ed0: 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20  (zSql[i+2]);.   
2ee0: 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d     i += 3;.    }
2ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
2f00: 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b  [j++] = zSql[i++
2f10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2f20: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63  Sql[j] = 0;.  rc
2f30: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f40: 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70  db, zSql, exec_p
2f50: 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20  rintf_cb, &str, 
2f60: 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &zErr);.  sqlite
2f70: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2f80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f90: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2fa0: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
2fb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2fc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
2fd0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2fe0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2ff0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3000: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3010: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
3020: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3030: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
3040: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
3050: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
3060: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
3070: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3080: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3090: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
30a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
30c0: 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53 51 4c  exec_nr  DB  SQL
30d0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
30e0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69  e sqlite3_exec i
30f0: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
3100: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
3110: 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a   DB.  Discard.**
3120: 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a   all results.*/.
3130: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3140: 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20  exec_nr(.  void 
3150: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3160: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3170: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3180: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3190: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
31a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
31b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
31d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
31e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
31f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3200: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3210: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
3220: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3230: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
3240: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
3250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3260: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3270: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3280: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3290: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53  , .       " DB S
32a0: 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
32b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
32d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
32e0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
32f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
3310: 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
3320: 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20   0, 0, &zErr);. 
3330: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
3340: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
3350: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
3360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
3370: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
33a0: 74 65 73 74 20 20 53 45 50 41 52 41 54 4f 52 20  test  SEPARATOR 
33b0: 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a   ARG0  ARG1 ....
33c0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25  **.** Test the %
33d0: 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69  z format of sqli
33e0: 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 55  te_mprintf().  U
33f0: 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69  se multiple mpri
3400: 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a  ntf() calls to .
3410: 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61  ** concatenate a
3420: 72 67 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e  rg0 through argn
3430: 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72   using separator
3440: 20 61 73 20 74 68 65 20 73 65 70 61 72 61 74 6f   as the separato
3450: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  r..** Return the
3460: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
3470: 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69  ic int test_mpri
3480: 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e  ntf_z(.  void *N
3490: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
34a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
34b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
34c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
34d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
34e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3500: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3510: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3520: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3530: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3540: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3550: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20    char *zResult 
3560: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
3570: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63   for(i=2; i<argc
3580: 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65   && (i==2 || zRe
3590: 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sult); i++){.   
35a0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   zResult = sqlit
35b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
35c0: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
35d0: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
35e0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
35f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3600: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
3610: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
3620: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
3630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3640: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3650: 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20  mprintf_n_test  
3660: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73  STRING.**.** Tes
3670: 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20  t the %n format 
3680: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3690: 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65  f().  Return the
36a0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a   length of the.*
36b0: 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a  * input string..
36c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
36d0: 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20  st_mprintf_n(.  
36e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
36f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3700: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3710: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3720: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3730: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3740: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3760: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3770: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3780: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3790: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
37a0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
37b0: 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  Str;.  int n = 0
37c0: 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74  ;.  zStr = sqlit
37d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 6e  e3_mprintf("%s%n
37e0: 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b  ", argv[1], &n);
37f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3800: 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74  zStr);.  Tcl_Set
3810: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3820: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3830: 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
3840: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3850: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
3860: 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a  nprintf_int  SIZ
3870: 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a  E FORMAT  INT.**
3880: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20  .** Test the of 
3890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
38a0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a  () routine.  SIZ
38b0: 45 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  E is the size of
38c0: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
38d0: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20  uffer in bytes. 
38e0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
38f0: 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41  e is 100.  FORMA
3900: 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  T is the.** form
3910: 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20  at string.  INT 
3920: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  is a single inte
3930: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ger argument.  T
3940: 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72  he FORMAT.** str
3950: 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69 72 65  ing must require
3960: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   no more than th
3970: 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61  is one integer a
3980: 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20  rgument.  If.** 
3990: 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f  You pass in a fo
39a0: 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68 61 74  rmat string that
39b0: 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74   requires more t
39c0: 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  han one argument
39d0: 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20  ,.** bad things 
39e0: 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a  will happen..*/.
39f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3a00: 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20  snprintf_int(.  
3a10: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3a20: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3a30: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3a40: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3a50: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3a60: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3a70: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3a90: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3aa0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3ac0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3ad0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53   */.){.  char zS
3ae0: 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e  tr[100];.  int n
3af0: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29   = atoi(argv[1])
3b00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3b10: 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32  zFormat = argv[2
3b20: 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74  ];.  int a1 = at
3b30: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  oi(argv[3]);.  i
3b40: 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72  f( n>sizeof(zStr
3b50: 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a  ) ) n = sizeof(z
3b60: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Str);.  sqlite3_
3b70: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3b80: 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62  zStr), zStr, "ab
3b90: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3ba0: 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71  stuvwxyz");.  sq
3bb0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
3bc0: 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c  , zStr, zFormat,
3bd0: 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   a1);.  Tcl_Appe
3be0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3bf0: 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74   zStr, 0);.  ret
3c00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
3c10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3c20: 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a  IT_GET_TABLE../*
3c30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3c40: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3c50: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
3c60: 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d    STRING  ?--no-
3c70: 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e  counts?.**.** In
3c80: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c90: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3ca0: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
3cb0: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
3cc0: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
3cd0: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
3ce0: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
3cf0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
3d00: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
3d10: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
3d20: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
3d30: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
3d40: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
3d50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
3d60: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
3d70: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3d80: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3d90: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3da0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3db0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3dc0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3dd0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3df0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3e00: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3e20: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3e30: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
3e40: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
3e50: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
3e60: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
3e70: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  rr = 0;.  int nR
3e80: 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20 30  ow = 0, nCol = 0
3e90: 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75  ;.  char **aResu
3ea0: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
3eb0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
3ec0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
3ed0: 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b  t resCount = -1;
3ee0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29  .  if( argc==5 )
3ef0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
3f00: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
3f10: 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29  v[4], &resCount)
3f20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3f30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ROR;.  }.  if( a
3f40: 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d  rgc!=4 && argc!=
3f50: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
3f60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3f70: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3f80: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3f90: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3fa0: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
3fb0: 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29  ING ?COUNT?", 0)
3fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3fd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3fe0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3ff0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4000: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44  L_ERROR;.  Tcl_D
4020: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
4030: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
4040: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
4050: 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  2],argv[3]);.  i
4060: 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20  f( argc==5 ){.  
4070: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
4080: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
4090: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20  l, &aResult, 0, 
40a0: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  0, &zErr);.  }el
40b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
40c0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
40d0: 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c  b, zSql, &aResul
40e0: 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c  t, &nRow, &nCol,
40f0: 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73   &zErr);.    res
4100: 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29  Count = (nRow+1)
4110: 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  *nCol;.  }.  sql
4120: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4130: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
4140: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
4150: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
4160: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
4170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
4180: 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
4190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
41a0: 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a   if( argc==4 ){.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
41c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
41d0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
41e0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54 63   nRow);.      Tc
41f0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4200: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4220: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
4230: 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
4240: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4250: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4260: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4270: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4280: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4290: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
42a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
42b0: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
42c0: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
42d0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
42e0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
42f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4300: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
4310: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
4320: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4330: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4340: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4350: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4360: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4370: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4390: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
43a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
43b0: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
43c0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
43d0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
43e0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
43f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
4400: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
4410: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
4420: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4430: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4440: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4450: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4460: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4470: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4480: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4490: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
44a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
44b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
44d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
44e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
44f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4500: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4510: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
4520: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4530: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4540: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4560: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4570: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4580: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4590: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
45a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
45b0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
45c0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
45d0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
45e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
45f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4600: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
4610: 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74  f, "%lld", sqlit
4620: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4630: 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c  owid(db));.  Tcl
4640: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4650: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
4660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4670: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4680: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  ge:  sqlite3_key
4690: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65   DB KEY.**.** Se
46a0: 74 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e  t the codec key.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
46c0: 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20  est_key(.  void 
46d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
46e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
46f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4700: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4710: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4720: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4730: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4740: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4750: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4760: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4770: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4780: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4790: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
47a0: 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 29 20  LITE_HAS_CODEC) 
47b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
47c0: 54 45 5f 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52  TE_OMIT_CODEC_FR
47d0: 4f 4d 5f 54 43 4c 29 0a 20 20 73 71 6c 69 74 65  OM_TCL).  sqlite
47e0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
47f0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74  har *zKey;.  int
4800: 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61 72 67   nKey;.  if( arg
4810: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
4820: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4830: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
4840: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
4850: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
4860: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
4870: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
4880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
4890: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
48a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
48b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
48c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
48d0: 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Key = argv[2];. 
48e0: 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a   nKey = strlen(z
48f0: 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Key);.  sqlite3_
4900: 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b  key(db, zKey, nK
4910: 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ey);.#endif.  re
4920: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
4930: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4940: 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42 20 4b  lite3_rekey DB K
4950: 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  EY.**.** Change 
4960: 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a  the codec key..*
4970: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
4980: 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69 64 20  t_rekey(.  void 
4990: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
49a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
49b0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
49c0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
49d0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
49e0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
49f0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4a00: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4a10: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4a20: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4a30: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4a40: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4a50: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4a60: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
4a70: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
4a80: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
4a90: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
4aa0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
4ab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4ac0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4ad0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4ae0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4af0: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4b00: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4b10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4b20: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4b30: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4b40: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4b60: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
4b70: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
4b80: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
4b90: 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b 65 79  3_rekey(db, zKey
4ba0: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4bb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
4bd0: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 20    sqlite3_close 
4be0: 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20  DB.**.** Closes 
4bf0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  the database ope
4c00: 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 6f  ned by sqlite3_o
4c10: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pen..*/.static i
4c20: 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  nt sqlite_test_c
4c30: 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  lose(.  void *No
4c40: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4c50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4c60: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4c70: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4c80: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4c90: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cb0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4cc0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4cd0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4ce0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4cf0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4d00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4d10: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4d20: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4d30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4d40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4d50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4d60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4d70: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4d80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4d90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4da0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4db0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4dc0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4dd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4de0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4df0: 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  se(db);.  Tcl_Se
4e00: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
4e10: 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
4e20: 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
4e30: 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
4e40: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
4e50: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
4e60: 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a 0a 2a  close_v2 DB.**.*
4e70: 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64 61 74  * Closes the dat
4e80: 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20  abase opened by 
4e90: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a 2a 2f  sqlite3_open..*/
4ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
4eb0: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32  te_test_close_v2
4ec0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4ed0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4ee0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4ef0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4f00: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4f10: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4f20: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4f40: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4f50: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4f70: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4f80: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
4f90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
4fa0: 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  rc;.  if( argc!=
4fb0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
4fc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4fd0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4fe0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4ff0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
5000: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
5010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
5020: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
5030: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
5040: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
5050: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
5060: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
5070: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
5080: 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  2(db);.  Tcl_Set
5090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
50a0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
50b0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
50c0: 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
50d0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  L_OK;.}../*.** I
50e0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
50f0: 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63 65 28   the x_coalesce(
5100: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 52  ) function..** R
5110: 65 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20  eturn the first 
5120: 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e 55 4c  argument non-NUL
5130: 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  L argument..*/.s
5140: 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f 69 66  tatic void t1_if
5150: 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71 6c 69  nullFunc(.  sqli
5160: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
5170: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
5180: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5190: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  e **argv.){.  in
51a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
51b0: 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20  i<argc; i++){.  
51c0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 55 4c    if( SQLITE_NUL
51d0: 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  L!=sqlite3_value
51e0: 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29 20 29  _type(argv[i]) )
51f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5200: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
5210: 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a 20 20  tes(argv[i]);.  
5220: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
5230: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
5240: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5250: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5260: 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  i]),.          n
5270: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5280: 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  NT);.      break
5290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
52a0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
52b0: 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  est functions.  
52c0: 20 20 68 65 78 38 28 29 20 69 6e 74 65 72 70 72    hex8() interpr
52d0: 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74  ets its argument
52e0: 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e 64 20   as.** UTF8 and 
52f0: 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e  returns a hex en
5300: 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36 6c 65  coding.  hex16le
5310: 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69 74  () interprets it
5320: 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 61 73  s argument.** as
5330: 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72 65 74   UTF16le and ret
5340: 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64  urns a hex encod
5350: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
5360: 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73 71 6c  oid hex8Func(sql
5370: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5380: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5390: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
53a0: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
53b0: 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  ed char *z;.  in
53c0: 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  t i;.  char zBuf
53d0: 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c  [200];.  z = sql
53e0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
53f0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
5400: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
5410: 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a 5b 69  uf)/2 - 2 && z[i
5420: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5430: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5440: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 32 2c 20  zeof(zBuf)-i*2, 
5450: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
5460: 78 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 7d 0a 20  x", z[i]);.  }. 
5470: 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a   zBuf[i*2] = 0;.
5480: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
5490: 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29  _text(p, (char*)
54a0: 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zBuf, -1, SQLITE
54b0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23  _TRANSIENT);.}.#
54c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
54d0: 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20  IT_UTF16.static 
54e0: 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63 28 73  void hex16Func(s
54f0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5500: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5510: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5520: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5530: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a  gned short int *
5540: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5550: 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20  ar zBuf[400];.  
5560: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5570: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
5580: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5590: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d  sizeof(zBuf)/4 -
55a0: 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29   4 && z[i]; i++)
55b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
55c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
55d0: 75 66 29 2d 69 2a 34 2c 20 26 7a 42 75 66 5b 69  uf)-i*4, &zBuf[i
55e0: 2a 34 5d 2c 22 25 30 34 78 22 2c 20 7a 5b 69 5d  *4],"%04x", z[i]
55f0: 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a 42  &0xff);.  }.  zB
5600: 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20 20 73  uf[i*4] = 0;.  s
5610: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
5620: 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42 75  xt(p, (char*)zBu
5630: 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  f, -1, SQLITE_TR
5640: 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65 6e 64  ANSIENT);.}.#end
5650: 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75  if../*.** A stru
5660: 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69 63 68  cture into which
5670: 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65 20 74   to accumulate t
5680: 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 64  ext..*/.struct d
5690: 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41 6c 6c  str {.  int nAll
56a0: 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20 61 6c  oc;  /* Space al
56b0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  located */.  int
56c0: 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53 70 61   nUsed;   /* Spa
56d0: 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61  ce used */.  cha
56e0: 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54 68 65  r *z;     /* The
56f0: 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   space */.};../*
5700: 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74 20  .** Append text 
5710: 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73 74 61  to a dstr.*/.sta
5720: 74 69 63 20 76 6f 69 64 20 64 73 74 72 41 70 70  tic void dstrApp
5730: 65 6e 64 28 73 74 72 75 63 74 20 64 73 74 72 20  end(struct dstr 
5740: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
5750: 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72 29 7b  z, int divider){
5760: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29  .  int n = (int)
5770: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66 28  strlen(z);.  if(
5780: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20 2b 20   p->nUsed + n + 
5790: 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  2 > p->nAlloc ){
57a0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b  .    char *zNew;
57b0: 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d  .    p->nAlloc =
57c0: 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e   p->nAlloc*2 + n
57d0: 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e 65 77   + 200;.    zNew
57e0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
57f0: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
5800: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65  oc);.    if( zNe
5810: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
5820: 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29  lite3_free(p->z)
5830: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
5840: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
5850: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
5860: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 20 3d      }.    p->z =
5870: 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69 66 28   zNew;.  }.  if(
5880: 20 64 69 76 69 64 65 72 20 26 26 20 70 2d 3e 6e   divider && p->n
5890: 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20 70 2d  Used>0 ){.    p-
58a0: 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d 20 3d  >z[p->nUsed++] =
58b0: 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a 20 20   divider;.  }.  
58c0: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
58d0: 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31 29 3b  nUsed], z, n+1);
58e0: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
58f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5900: 65 64 20 66 6f 72 20 65 61 63 68 20 63 61 6c 6c  ed for each call
5910: 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69 74 65  back from sqlite
5920: 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73 74 61  3ExecFunc.*/.sta
5930: 74 69 63 20 69 6e 74 20 65 78 65 63 46 75 6e 63  tic int execFunc
5940: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
5950: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
5960: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
5970: 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20  r **NotUsed){.  
5980: 73 74 72 75 63 74 20 64 73 74 72 20 2a 70 20 3d  struct dstr *p =
5990: 20 28 73 74 72 75 63 74 20 64 73 74 72 2a 29 70   (struct dstr*)p
59a0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
59b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
59c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
59d0: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
59e0: 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70      dstrAppend(p
59f0: 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29 3b 0a  , "NULL", ' ');.
5a00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5a10: 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c 20 61   dstrAppend(p, a
5a20: 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a 20 20  rgv[i], ' ');.  
5a30: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5a40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70   0;.}../*.** Imp
5a50: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
5a60: 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  he x_sqlite_exec
5a70: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  () function.  Th
5a80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  is function take
5a90: 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 61 72  s.** a single ar
5aa0: 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74 65 6d  gument and attem
5ab0: 70 74 73 20 74 6f 20 65 78 65 63 75 74 65 20 74  pts to execute t
5ac0: 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61 73 20  hat argument as 
5ad0: 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 69  SQL code..** Thi
5ae0: 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61 6e 64  s is illegal and
5af0: 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 65 20   should set the 
5b00: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 66 6c  SQLITE_MISUSE fl
5b10: 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ag on the databa
5b20: 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34 2d 4a  se..**.** 2004-J
5b30: 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76 65 20  an-07:  We have 
5b40: 63 68 61 6e 67 65 64 20 74 68 69 73 20 74 6f 20  changed this to 
5b50: 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20 74 6f  make it legal to
5b60: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 65 78   call sqlite3_ex
5b70: 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77 69 74  ec().** from wit
5b80: 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  hin a function c
5b90: 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20 54 68  all.  .** .** Th
5ba0: 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d 75 6c  is routine simul
5bb0: 61 74 65 73 20 74 68 65 20 65 66 66 65 63 74 20  ates the effect 
5bc0: 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20 74 68  of having two th
5bd0: 72 65 61 64 73 20 61 74 74 65 6d 70 74 20 74 6f  reads attempt to
5be0: 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61 6d 65  .** use the same
5bf0: 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68 65   database at the
5c00: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f 0a 73   same time..*/.s
5c10: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
5c20: 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20 73 71  e3ExecFunc(.  sq
5c30: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5c40: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
5c50: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
5c60: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
5c70: 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20 78  .  struct dstr x
5c80: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30  ;.  memset(&x, 0
5c90: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20  , sizeof(x));.  
5ca0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 65 78  (void)sqlite3_ex
5cb0: 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73 71 6c  ec((sqlite3*)sql
5cc0: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
5cd0: 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20 20 28  ontext),.      (
5ce0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
5cf0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
5d00: 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46 75 6e  ),.      execFun
5d10: 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c 20 30  cCallback, &x, 0
5d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
5d30: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
5d40: 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64 2c 20  , x.z, x.nUsed, 
5d50: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
5d60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5d70: 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e(x.z);.}../*.**
5d80: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5d90: 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63 28 29  of tkt2213func()
5da0: 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e 63 74  , a scalar funct
5db0: 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73 20 65  ion that takes e
5dc0: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 61 72  xactly.** one ar
5dd0: 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73 20 74  gument. It has t
5de0: 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  wo interesting f
5df0: 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a  eatures:.**.** *
5e00: 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69 74 65   It calls sqlite
5e10: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 20 33  3_value_text() 3
5e20: 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20 61 72   times on the ar
5e30: 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33 5f 76  gument sqlite3_v
5e40: 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66 20 74  alue*..**   If t
5e50: 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74 65 72  he three pointer
5e60: 73 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 6e  s returned are n
5e70: 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e 20 53  ot the same an S
5e80: 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61 69 73  QL error is rais
5e90: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74 68 65  ed..**.** * Othe
5ea0: 72 77 69 73 65 20 69 74 20 72 65 74 75 72 6e 73  rwise it returns
5eb0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
5ec0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
5ed0: 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20 20 20  on of its .**   
5ee0: 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75 63 68  argument in such
5ef0: 20 61 20 77 61 79 20 61 73 20 74 68 65 20 56 44   a way as the VD
5f00: 42 45 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  BE representatio
5f10: 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65 6c 6c  n is a Mem* cell
5f20: 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68 65 20   .**   with the 
5f30: 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20 63 6c  MEM_Term flag cl
5f40: 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69 63 6b  ear. .**.** Tick
5f50: 65 74 20 23 32 32 31 33 20 63 61 6e 20 74 68 65  et #2213 can the
5f60: 72 65 66 6f 72 65 20 62 65 20 74 65 73 74 65 64  refore be tested
5f70: 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67 20 74   by evaluating t
5f80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
5f90: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a  SQL expression:.
5fa0: 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31 33 66  **.**   tkt2213f
5fb0: 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e 63 28  unc(tkt2213func(
5fc0: 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a 2a 2f  'a string'));.*/
5fd0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 6b 74  .static void tkt
5fe0: 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a 20 20  2213Function(.  
5ff0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6000: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6010: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
6020: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
6030: 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74 3b 0a  ){.  int nText;.
6040: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6050: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b 0a 20  const *zText1;. 
6060: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63   unsigned char c
6070: 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a 20 20  onst *zText2;.  
6080: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
6090: 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a 20 20  nst *zText3;..  
60a0: 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f  nText = sqlite3_
60b0: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
60c0: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31 20 3d  [0]);.  zText1 =
60d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
60e0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
60f0: 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74 65 33  zText2 = sqlite3
6100: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6110: 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33 20 3d  [0]);.  zText3 =
6120: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6130: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 0a 20  ext(argv[0]);.. 
6140: 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a 54 65   if( zText1!=zTe
6150: 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21 3d 7a  xt2 || zText2!=z
6160: 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73 71 6c  Text3 ){.    sql
6170: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
6180: 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b 74 32  r(context, "tkt2
6190: 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78 65 64  213 is not fixed
61a0: 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
61b0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  .    char *zCopy
61c0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
61d0: 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78 74 29  e3_malloc(nText)
61e0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
61f0: 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54 65 78  py, zText1, nTex
6200: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
6210: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
6220: 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54 65 78  ext, zCopy, nTex
6230: 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  t, sqlite3_free)
6240: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
6250: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
6260: 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65 73 20   function takes 
6270: 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68  4 arguments.  Th
6280: 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34 74 68  e 2nd and.** 4th
6290: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
62a0: 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  e one of these s
62b0: 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74 27 2c  trings:  'text',
62c0: 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20 6f 72   'text16',.** or
62d0: 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73 70 6f   'blob' correspo
62e0: 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66 75 6e  nding to API fun
62f0: 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20 20 20  ctions.**.**    
6300: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
6310: 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  text().**      s
6320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6330: 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  t16().**      sq
6340: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6350: 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69  ().**.** The thi
6360: 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  rd argument is a
6370: 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65 72 20   string, either 
6380: 27 62 79 74 65 73 27 20 6f 72 20 27 62 79 74 65  'bytes' or 'byte
6390: 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27 2c 0a  s16' or 'noop',.
63a0: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
63b0: 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a 2a 20   to APIs:.**.** 
63c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
63d0: 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20 20 20  ue_bytes().**   
63e0: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
63f0: 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20 20 20  _bytes16().**   
6400: 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20 54 68     noop.**.** Th
6410: 65 20 41 50 49 73 20 64 65 73 69 67 6e 61 74 65  e APIs designate
6420: 64 20 62 79 20 74 68 65 20 32 6e 64 20 74 68 72  d by the 2nd thr
6430: 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d 65 6e  ough 4th argumen
6440: 74 73 20 61 72 65 20 61 70 70 6c 69 65 64 0a 2a  ts are applied.*
6450: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 61  * to the first a
6460: 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  rgument in order
6470: 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e 74 65  .  If the pointe
6480: 72 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  rs returned by t
6490: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61 6e 64  he.** second and
64a0: 20 66 6f 75 72 74 68 20 61 72 65 20 64 69 66 66   fourth are diff
64b0: 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f 75 74  erent, this rout
64c0: 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e 20 20  ine returns 1.  
64d0: 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68  Otherwise,.** th
64e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
64f0: 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ns 0..**.** This
6500: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
6510: 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73 65 65  d to test to see
6520: 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64 20 70   when returned p
6530: 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a 2a 20  ointers from.** 
6540: 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f 74 65  the _text(), _te
6550: 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c 6f 62  xt16() and _blob
6560: 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65 20 69  () APIs become i
6570: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73  nvalidated..*/.s
6580: 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 43 68  tatic void ptrCh
6590: 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  ngFunction(.  sq
65a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
65b0: 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61  ontext, .  int a
65c0: 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33  rgc,  .  sqlite3
65d0: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
65e0: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
65f0: 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73 74 20  1, *p2;.  const 
6600: 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 69 66  char *zCmd;.  if
6610: 28 20 61 72 67 63 21 3d 34 20 29 20 72 65 74 75  ( argc!=4 ) retu
6620: 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f  rn;.  zCmd = (co
6630: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
6640: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
6650: 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[1]);.  if( zCm
6660: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6670: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6680: 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20  ,"text")==0 ){. 
6690: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
66a0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
66b0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
66c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
66d0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
66e0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
66f0: 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29 3d 3d  Cmd, "text16")==
6700: 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63  0 ){.    p1 = (c
6710: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
6720: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
6730: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
6740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
6750: 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22  cmp(zCmd, "blob"
6760: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d  )==0 ){.    p1 =
6770: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6780: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62  lite3_value_blob
6790: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c  (argv[0]);.  }el
67a0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  se{.    return;.
67b0: 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f    }.  zCmd = (co
67c0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
67d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
67e0: 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d  v[2]);.  if( zCm
67f0: 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  d==0 ) return;. 
6800: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6810: 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a  ,"bytes")==0 ){.
6820: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
6830: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29  e_bytes(argv[0])
6840: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
6850: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 7d 65  _OMIT_UTF16.  }e
6860: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6870: 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22 29 3d  Cmd, "bytes16")=
6880: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
6890: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
68a0: 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66  argv[0]);.#endif
68b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
68c0: 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f 70 22  cmp(zCmd, "noop"
68d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 64  )==0 ){.    /* d
68e0: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d  o nothing */.  }
68f0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6900: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6910: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6920: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6930: 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[3]);.  if( z
6940: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6950: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6960: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6970: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6980: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6990: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
69a0: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
69b0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
69c0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
69d0: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
69e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20  ==0 ){.    p2 = 
69f0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
6a00: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6a10: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6a20: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6a30: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
6a40: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32  b")==0 ){.    p2
6a50: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6a60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6a70: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6a80: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6a90: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6aa0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6ab0: 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d 0a 0a  xt, p1!=p2);.}..
6ac0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c 20 66  /*.** This SQL f
6ad0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
6ae0: 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e 73 77  a different answ
6af0: 65 72 20 65 61 63 68 20 74 69 6d 65 20 69 74 20  er each time it 
6b00: 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65 6e 20  is called, even 
6b10: 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d 65  if.** the argume
6b20: 6e 74 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  nts are the same
6b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6b40: 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69   nondeterministi
6b50: 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  cFunction(.  sql
6b60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
6b70: 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72  ntext, .  int ar
6b80: 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f  gc,  .  sqlite3_
6b90: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
6ba0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
6bb0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
6bc0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
6bd0: 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f  xt, cnt++);.}../
6be0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
6bf0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6c00: 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61  tion DB.**.** Ca
6c10: 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63  ll the sqlite3_c
6c20: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41  reate_function A
6c30: 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  PI on the given 
6c40: 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65  database in orde
6c50: 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61  r.** to create a
6c60: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
6c70: 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20 20 54  "x_coalesce".  T
6c80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
6c90: 73 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  s the same thing
6ca0: 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f 61 6c  .** as the "coal
6cb0: 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e 2e 20  esce" function. 
6cc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
6cd0: 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20 61 6e  lso registers an
6ce0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a   SQL function.**
6cf0: 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69 74 65   named "x_sqlite
6d00: 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e 76 6f  _exec" that invo
6d10: 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63  kes sqlite3_exec
6d20: 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20 73 71  ().  Invoking sq
6d30: 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20  lite3_exec().** 
6d40: 69 6e 20 74 68 69 73 20 77 61 79 20 69 73 20 69  in this way is i
6d50: 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69 6f 6e  llegal recursion
6d60: 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61 69 73   and should rais
6d70: 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  e an SQLITE_MISU
6d80: 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54 68 65  SE error..** The
6d90: 20 65 66 66 65 63 74 20 69 73 20 73 69 6d 69 6c   effect is simil
6da0: 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74 6f 20  ar to trying to 
6db0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74  use the same dat
6dc0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6dd0: 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74 68 72   from.** two thr
6de0: 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
6df0: 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   time..**.** The
6e00: 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61   original motiva
6e10: 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f  tion for this ro
6e20: 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20  utine was to be 
6e30: 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65  able to call the
6e40: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61  .** sqlite3_crea
6e50: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75 6e 63  te_function func
6e60: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
6e70: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
6e80: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
6e90: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
6ea0: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
6eb0: 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  n logic..*/.stat
6ec0: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61  ic int test_crea
6ed0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
6ee0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
6ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6f00: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
6f10: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
6f20: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
6f30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
6f40: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
6f50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6f60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
6f70: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
6f80: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
6f90: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
6fa0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
6fb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
6fc0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
6fd0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
6fe0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
6ff0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7000: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7010: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
7020: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7040: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
7050: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7060: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
7070: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7080: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7090: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
70a0: 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2c  b, "x_coalesce",
70b0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
70c0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74 31  , 0, .        t1
70d0: 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c 20  _ifnullFunc, 0, 
70e0: 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
70f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7100: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7110: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7120: 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49 54  "hex8", 1, SQLIT
7130: 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45 5f  E_UTF8 | SQLITE_
7140: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
7150: 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78 38           0, hex8
7160: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
7170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7180: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66 28  OMIT_UTF16.  if(
7190: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
71a0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
71b0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
71c0: 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c 20  on(db, "hex16", 
71d0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  1, SQLITE_UTF16 
71e0: 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49  | SQLITE_DETERMI
71f0: 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20 20  NISTIC,.        
7200: 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c 20    0, hex16Func, 
7210: 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  0, 0);.  }.#endi
7220: 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  f.  if( rc==SQLI
7230: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7240: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
7250: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
7260: 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c 20  kt2213func", 1, 
7270: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a  SQLITE_ANY, 0, .
7280: 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32 31            tkt221
7290: 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29  3Function, 0, 0)
72a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
72b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
72c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
72d0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
72e0: 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e 67  , "pointer_chang
72f0: 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41 4e  e", 4, SQLITE_AN
7300: 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  Y, 0, .         
7310: 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e   ptrChngFunction
7320: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 0, 0);.  }..  
7330: 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f 75  /* Functions cou
7340: 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75 6e  nter1() and coun
7350: 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65 20  ter2() have the 
7360: 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  same implementat
7370: 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a 20  ion - they.  ** 
7380: 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20 61  both return an a
7390: 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65 72  scending integer
73a0: 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 2e   with each call.
73b0: 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28 29    But counter1()
73c0: 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a 20   is marked.  ** 
73d0: 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69  as non-determini
73e0: 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65 72  stic and counter
73f0: 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61 73  2() is marked as
7400: 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e 0a   deterministic..
7410: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
7420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7430: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7440: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7450: 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31 2c   "counter1", -1,
7460: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
7470: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7480: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7490: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
74a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
74b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
74c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
74d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
74e0: 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c 49  nter2", -1, SQLI
74f0: 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f 44  TE_UTF8|SQLITE_D
7500: 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20  ETERMINISTIC,.  
7510: 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64 65          0, nonde
7520: 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63 74  terministicFunct
7530: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
7540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7550: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
7560: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  Use the sqlite3_
7570: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
7580: 36 28 29 20 41 50 49 20 68 65 72 65 2e 20 4d 61  6() API here. Ma
7590: 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20 62 75  inly for fun, bu
75a0: 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63  t also .  ** bec
75b0: 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 74  ause it is not t
75c0: 65 73 74 65 64 20 61 6e 79 77 68 65 72 65 20 65  ested anywhere e
75d0: 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63  lse. */.  if( rc
75e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
75f0: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
7600: 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c 69 74  Utf16;.    sqlit
7610: 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
7620: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
7630: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
7640: 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20 73  x);.    pVal = s
7650: 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
7660: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
7670: 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
7680: 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65   -1, "x_sqlite_e
7690: 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  xec", SQLITE_UTF
76a0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
76b0: 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
76c0: 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
76d0: 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
76e0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
76f0: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
7700: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
7710: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
7720: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7730: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7740: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
7750: 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20  (db, zUtf16, .  
7760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 2c                1,
7770: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 64   SQLITE_UTF16, d
7780: 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63 46 75  b, sqlite3ExecFu
7790: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  nc, 0, 0);.    }
77a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
77b0: 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
77c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
77d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
77e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
77f0: 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
7800: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
7810: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
7820: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
7830: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
7840: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
7850: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
7860: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
7870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  }../*.** Routine
7880: 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  s to implement t
7890: 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61 67 67  he x_count() agg
78a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e  regate function.
78b0: 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29  .**.** x_count()
78c0: 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75 6d 62   counts the numb
78d0: 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61  er of non-null a
78e0: 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74 20 74  rguments.  But t
78f0: 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65  here are.** some
7900: 20 74 77 69 73 74 73 20 66 6f 72 20 74 65 73 74   twists for test
7910: 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a  ing purposes..**
7920: 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d  .** If the argum
7930: 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29  ent to x_count()
7940: 20 69 73 20 34 30 20 74 68 65 6e 20 61 20 55 54   is 40 then a UT
7950: 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70  F-8 error is rep
7960: 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  orted.** on the 
7970: 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20  step function.  
7980: 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29 20 69  If x_count(41) i
7990: 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61 20 55  s seen, then a U
79a0: 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69  TF-16 error.** i
79b0: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
79c0: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
79d0: 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 63    If the total c
79e0: 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68 65 6e  ount is 42, then
79f0: 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72 72 6f  .** a UTF-8 erro
7a00: 72 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e  r is reported on
7a10: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20 66 75   the finalize fu
7a20: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  nction..*/.typed
7a30: 65 66 20 73 74 72 75 63 74 20 74 31 43 6f 75 6e  ef struct t1Coun
7a40: 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74 78 3b  tCtx t1CountCtx;
7a50: 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43  .struct t1CountC
7a60: 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b  tx {.  int n;.};
7a70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43  .static void t1C
7a80: 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69  ountStep(.  sqli
7a90: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
7aa0: 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63  text,.  int argc
7ab0: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
7ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31  e **argv.){.  t1
7ad0: 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70  CountCtx *p;.  p
7ae0: 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65   = sqlite3_aggre
7af0: 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e  gate_context(con
7b00: 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29  text, sizeof(*p)
7b10: 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63 3d 3d  );.  if( (argc==
7b20: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c  0 || SQLITE_NULL
7b30: 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  !=sqlite3_value_
7b40: 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20 29 20  type(argv[0]) ) 
7b50: 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  && p ){.    p->n
7b60: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72  ++;.  }.  if( ar
7b70: 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  gc>0 ){.    int 
7b80: 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  v = sqlite3_valu
7b90: 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a  e_int(argv[0]);.
7ba0: 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20 29 7b      if( v==40 ){
7bb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7bc0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bd0: 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66 20 34  ext, "value of 4
7be0: 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f  0 handed to x_co
7bf0: 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64  unt", -1);.#ifnd
7c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
7c10: 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65 20 69  TF16.    }else i
7c20: 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20  f( v==41 ){.    
7c30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 55 74    const char zUt
7c40: 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20  f16ErrMsg[] = { 
7c50: 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78 36 32  0, 0x61, 0, 0x62
7c60: 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c  , 0, 0x63, 0, 0,
7c70: 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0};.      sqlit
7c80: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 31  e3_result_error1
7c90: 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66  6(context, &zUtf
7ca0: 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54  16ErrMsg[1-SQLIT
7cb0: 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31  E_BIGENDIAN], -1
7cc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7cd0: 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69 63 20    }.}   .static 
7ce0: 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69 6e 61  void t1CountFina
7cf0: 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e  lize(sqlite3_con
7d00: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a  text *context){.
7d10: 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b    t1CountCtx *p;
7d20: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61  .  p = sqlite3_a
7d30: 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74  ggregate_context
7d40: 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66  (context, sizeof
7d50: 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70 20 29  (*p));.  if( p )
7d60: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d  {.    if( p->n==
7d70: 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  42 ){.      sqli
7d80: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d90: 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75  (context, "x_cou
7da0: 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34 32 22  nt totals to 42"
7db0: 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , -1);.    }else
7dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
7dd0: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
7de0: 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30  xt, p ? p->n : 0
7df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7e00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7e10: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 73  MIT_DEPRECATED.s
7e20: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7e30: 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  yCountStep(.  sq
7e40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7e50: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7e60: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7e70: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7e80: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73  /* no-op */.}..s
7e90: 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67 61 63  tatic void legac
7ea0: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  yCountFinalize(s
7eb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
7ec0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71 6c 69  context){.  sqli
7ed0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
7ee0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
7ef0: 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28  aggregate_count(
7f00: 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e  context));.}.#en
7f10: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
7f20: 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  :  sqlite3_creat
7f30: 65 5f 61 67 67 72 65 67 61 74 65 20 44 42 0a 2a  e_aggregate DB.*
7f40: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
7f50: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
7f60: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
7f70: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
7f80: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
7f90: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
7fa0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22   named "x_count"
7fb0: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
7fc0: 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74   is similar.** t
7fd0: 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 63  o the built-in c
7fe0: 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c  ount() function,
7ff0: 20 77 69 74 68 20 61 20 66 65 77 20 73 70 65 63   with a few spec
8000: 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f  ial quirks.** fo
8010: 72 20 74 65 73 74 69 6e 67 20 74 68 65 20 73 71  r testing the sq
8020: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8030: 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a  or() APIs..**.**
8040: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f   The original mo
8050: 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69  tivation for thi
8060: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f  s routine was to
8070: 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c   be able to call
8080: 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
8090: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
80a0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
80b0: 61 20 71 75 65 72 79 20 69 73 20 69 6e 20 70 72  a query is in pr
80c0: 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a  ogress in order.
80d0: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 53  ** to test the S
80e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74  QLITE_MISUSE det
80f0: 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53  ection logic.  S
8100: 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a  ee misuse.test..
8110: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8120: 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65 78 74  ne was later ext
8130: 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20 74 68  ended to test th
8140: 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74 65 33  e use of sqlite3
8150: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a  _result_error().
8160: 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72 65 67  ** within aggreg
8170: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ate functions..*
8180: 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74 20 69  *.** Later: It i
8190: 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e  s now also exten
81a0: 64 65 64 20 74 6f 20 72 65 67 69 73 74 65 72 20  ded to register 
81b0: 74 68 65 20 61 67 67 72 65 67 61 74 65 20 66 75  the aggregate fu
81c0: 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63  nction.** "legac
81d0: 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74 68 20  y_count()" with 
81e0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 64 61 74  the supplied dat
81f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68  abase handle. Th
8200: 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f  is is used.** to
8210: 20 74 65 73 74 20 74 68 65 20 64 65 70 72 65 63   test the deprec
8220: 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61 67 67  ated sqlite3_agg
8230: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29 20 41  regate_count() A
8240: 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  PI..*/.static in
8250: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  t test_create_ag
8260: 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69 64 20  gregate(.  void 
8270: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
8280: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
8290: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
82a0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
82b0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
82c0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
82d0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
82e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
82f0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
8300: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
8310: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
8320: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
8330: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
8340: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
8350: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
8360: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8370: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
8380: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
8390: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
83a0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
83b0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
83c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
83d0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
83e0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
83f0: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
8400: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8410: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
8420: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
8430: 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20 30  db, "x_count", 0
8440: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
8450: 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43 6f 75  , 0,.      t1Cou
8460: 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69  ntStep,t1CountFi
8470: 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  nalize);.  if( r
8480: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8490: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
84a0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
84b0: 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c 20  (db, "x_count", 
84c0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
84d0: 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 74 31  0, 0,.        t1
84e0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
84f0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 7d 0a  tFinalize);.  }.
8500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
8510: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
8520: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
8530: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
8540: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
8550: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65 67 61  nction(db, "lega
8560: 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51  cy_count", 0, SQ
8570: 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30 2c 0a  LITE_ANY, 0, 0,.
8580: 20 20 20 20 20 20 20 20 6c 65 67 61 63 79 43 6f          legacyCo
8590: 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63 79 43  untStep, legacyC
85a0: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20 20 20  ountFinalize.   
85b0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   );.  }.#endif. 
85c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
85d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
85e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
85f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
8600: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
8610: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
8620: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
8630: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8640: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
8650: 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58 54 0a  e:  printf TEXT.
8660: 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74 70 75  **.** Send outpu
8670: 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20 55 73  t to printf.  Us
8680: 65 20 74 68 69 73 20 72 61 74 68 65 72 20 74 68  e this rather th
8690: 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72 67 65  an puts to merge
86a0: 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 69   the output.** i
86b0: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 65  n the correct se
86c0: 71 75 65 6e 63 65 20 77 69 74 68 20 64 65 62 75  quence with debu
86d0: 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20 69 6e  gging printfs in
86e0: 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20 63 6f  serted into C co
86f0: 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73 65 73  de..** Puts uses
8700: 20 61 20 73 65 70 61 72 61 74 65 20 62 75 66 66   a separate buff
8710: 65 72 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  er and debugging
8720: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 6c 6c   statements will
8730: 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20 73 65   be out of.** se
8740: 71 75 65 6e 63 65 20 69 66 20 69 74 20 69 73 20  quence if it is 
8750: 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  used..*/.static 
8760: 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74 66 28  int test_printf(
8770: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8780: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8790: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
87a0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
87b0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
87c0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
87d0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
87e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
87f0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8800: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8810: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8820: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8830: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ent */.){.  if( 
8840: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
8850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8860: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
8870: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
8880: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
8890: 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22 2c        " TEXT\"",
88a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
88b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
88c0: 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c 20   printf("%s\n", 
88d0: 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74 75  argv[1]);.  retu
88e0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a  rn TCL_OK;.}....
88f0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8900: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8910: 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  t FORMAT INTEGER
8920: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8930: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
8940: 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20 69  ntf with three i
8950: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8960: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8970: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8980: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
8990: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
89a0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
89b0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
89c0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
89d0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
89e0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
89f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8a00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8a10: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8a20: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8a30: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8a40: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
8a50: 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68  nt a[3], i;.  ch
8a60: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
8a70: 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
8a80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8a90: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
8aa0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
8ab0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
8ac0: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
8ad0: 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a  INT INT\"", 0);.
8ae0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8af0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
8b00: 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=2; i<5; i++){.
8b10: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
8b20: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
8b30: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
8b40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8b50: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8b60: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8b70: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8b80: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8b90: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8ba0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8bb0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8bc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8bd0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8be0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8bf0: 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  t64 FORMAT INTEG
8c00: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8c10: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8c20: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8c30: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
8c40: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8c50: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
8c60: 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20  mprintf_int64(. 
8c70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8c80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8c90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8ca0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8cb0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8cc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8cd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8ce0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8cf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8d00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8d10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8d20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
8d30: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
8d40: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
8d50: 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  a[3];.  char *z;
8d60: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
8d70: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8d80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8d90: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8da0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8db0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
8dc0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49 4e  ORMAT INT INT IN
8dd0: 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T\"", 0);.    re
8de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8df0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
8e00: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
8e10: 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28  ( sqlite3Atoi64(
8e20: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
8e30: 2c 20 31 30 30 30 30 30 30 2c 20 53 51 4c 49 54  , 1000000, SQLIT
8e40: 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20  E_UTF8) ){.     
8e50: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8e60: 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d  t(interp, "argum
8e70: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  ent is not a val
8e80: 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  id 64-bit intege
8e90: 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  r", 0);.      re
8ea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8eb0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20      }.  }.  z = 
8ec0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8ed0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
8ee0: 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63  [1], a[2]);.  Tc
8ef0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8f00: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
8f10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
8f20: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
8f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
8f40: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
8f50: 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49  tf_long FORMAT I
8f60: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
8f70: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
8f80: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
8f90: 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65  hree long intege
8fa0: 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54  r arguments.   T
8fb0: 68 69 73 20 6d 69 67 68 74 20 62 65 20 74 68 65  his might be the
8fc0: 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69  .** same as sqli
8fd0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
8fe0: 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  or sqlite3_mprin
8ff0: 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64  tf_int64, depend
9000: 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f  ing on.** platfo
9010: 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rm..*/.static in
9020: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
9030: 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20 2a  f_long(.  void *
9040: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9060: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
9070: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
9080: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
9090: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
90a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
90b0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
90c0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
90d0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
90e0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
90f0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9100: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67  .  int i;.  long
9110: 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e 74   int a[3];.  int
9120: 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   b[3];.  char *z
9130: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
9140: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9150: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9160: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9170: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9180: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9190: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
91a0: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
91b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
91c0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
91d0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
91e0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
91f0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9200: 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  b[i-2]) ) return
9210: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9220: 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20 69  a[i-2] = (long i
9230: 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20 61  nt)b[i-2];.    a
9240: 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34 29  [i-2] &= (((u64)
9250: 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74 29  1)<<(sizeof(int)
9260: 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20  *8))-1;.  }.  z 
9270: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
9280: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
9290: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
92a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
92b0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
92c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
92d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
92e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
92f0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
9300: 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54 20  intf_str FORMAT 
9310: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
9320: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c  STRING.**.** Cal
9330: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9340: 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  wo integer argum
9350: 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72  ents and one str
9360: 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a  ing argument.*/.
9370: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
9380: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a  e3_mprintf_str(.
9390: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
93a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
93b0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
93c0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
93d0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
93e0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
93f0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9400: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9410: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9420: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9440: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9450: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9460: 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a  [3], i;.  char *
9470: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20  z;.  if( argc<4 
9480: 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20  || argc>5 ){.   
9490: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
94a0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
94b0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
94c0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
94d0: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
94e0: 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47   INT INT ?STRING
94f0: 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ?\"", 0);.    re
9500: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9510: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69    }.  for(i=2; i
9520: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <4; i++){.    if
9530: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
9540: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
9550: 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-2]) ) return 
9560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9570: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
9580: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b  intf(argv[1], a[
9590: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
95a0: 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c   ? argv[4] : NUL
95b0: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
95c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
95d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
95e0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
95f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
9600: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
9610: 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
9620: 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49  INTEGER FORMAT I
9630: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53  NTEGER INTEGER S
9640: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
9650: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
9660: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
9670: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69  nts and one stri
9680: 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  ng argument.*/.s
9690: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
96a0: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a  3_snprintf_str(.
96b0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
96c0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
96d0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
96e0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
96f0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9700: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9710: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9720: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9730: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9740: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9760: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9770: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9780: 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b  [3], i;.  int n;
9790: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
97a0: 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63  ( argc<5 || argc
97b0: 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >6 ){.    Tcl_Ap
97c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
97d0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
97e0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
97f0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9800: 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e   " INT FORMAT IN
9810: 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22  T INT ?STRING?\"
9820: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9830: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9840: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
9850: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
9860: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
9870: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9880: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f   n<0 ){.    Tcl_
9890: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
98a0: 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20  erp, "N must be 
98b0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30  non-negative", 0
98c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
98d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
98e0: 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=3; i<5; i++
98f0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9900: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9910: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20  gv[i], &a[i-3]) 
9920: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9930: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
9940: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b  lite3_malloc( n+
9950: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  1 );.  sqlite3_s
9960: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72  nprintf(n, z, ar
9970: 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[2], a[0], a[1
9980: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
9990: 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [5] : NULL);.  T
99a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
99b0: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
99c0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
99d0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
99e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
99f0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9a00: 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41  ntf_double FORMA
9a10: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
9a20: 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  R DOUBLE.**.** C
9a30: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
9a40: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
9a50: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64  uments and one d
9a60: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a  ouble argument.*
9a70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9a80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
9a90: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ble(.  void *Not
9aa0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
9ab0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
9ac0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
9ad0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
9ae0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
9af0: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9b10: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
9b20: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
9b30: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
9b40: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
9b50: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
9b60: 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64  int a[3], i;.  d
9b70: 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20  ouble r;.  char 
9b80: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
9b90: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9ba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9bb0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9bc0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9bd0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9be0: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
9bf0: 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a   DOUBLE\"", 0);.
9c00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9c10: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
9c20: 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a  i=2; i<4; i++){.
9c30: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
9c40: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
9c50: 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72  i], &a[i-2]) ) r
9c60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9c70: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
9c80: 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c  etDouble(interp,
9c90: 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20   argv[4], &r) ) 
9ca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9cb0: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
9cc0: 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c  mprintf(argv[1],
9cd0: 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b   a[0], a[1], r);
9ce0: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
9cf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
9d00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9d10: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
9d20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
9d30: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
9d40: 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46  mprintf_scaled F
9d50: 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55  ORMAT DOUBLE DOU
9d60: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9d70: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
9d80: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
9d90: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
9da0: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
9db0: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
9dc0: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
9dd0: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
9de0: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
9df0: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
9e00: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
9e10: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
9e20: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
9e30: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
9e40: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
9e50: 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76 6f 69  tf_scaled(.  voi
9e60: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9e70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9e80: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9e90: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9ea0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9eb0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9ec0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ed0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9ee0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9ef0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9f00: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9f10: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9f20: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 64  .){.  int i;.  d
9f30: 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20 63 68  ouble r[2];.  ch
9f40: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9f50: 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
9f60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9f70: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9f80: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9f90: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9fa0: 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f 55 42     " FORMAT DOUB
9fb0: 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29  LE DOUBLE\"", 0)
9fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9fd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9fe0: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
9ff0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
a000: 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20  tDouble(interp, 
a010: 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d  argv[i], &r[i-2]
a020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
a030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
a040: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a050: 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b  argv[1], r[0]*r[
a060: 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
a070: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a080: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a090: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a0a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a0b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a0c0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a0d0: 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52 49 4e  nly FORMAT STRIN
a0e0: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
a0f0: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
a100: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
a110: 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
a120: 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a  product of the.*
a130: 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  * two arguments 
a140: 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68  given above.  Th
a150: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  is is used to ge
a160: 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20  nerate overflow 
a170: 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a  and underflow.**
a180: 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74   doubles to test
a190: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
a1a0: 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c  onverted properl
a1b0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
a1c0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a1d0: 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  _stronly(.  void
a1e0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
a1f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a200: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a210: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a220: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a230: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
a240: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
a250: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a260: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
a270: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
a280: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
a290: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
a2a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
a2b0: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
a2c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a2d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
a2e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
a2f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
a300: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
a310: 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29  AT STRING\"", 0)
a320: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
a330: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
a340: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a350: 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b  f(argv[1], argv[
a360: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
a370: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a380: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
a390: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
a3a0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
a3b0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
a3c0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
a3d0: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48 45 58  ouble FORMAT HEX
a3e0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
a3f0: 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c  ntf with a singl
a400: 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e  e double argumen
a410: 74 20 77 68 69 63 68 20 69 73 20 64 65 72 69 76  t which is deriv
a420: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 68  ed from the.** h
a430: 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63 6f 64  exadecimal encod
a440: 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45 20 64  ing of an IEEE d
a450: 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
a460: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
a470: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a480: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a490: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a4a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a4b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a4c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a4d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a4e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a4f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a500: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a510: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a530: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a540: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a550: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a560: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a570: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a580: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a590: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a5a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a5b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a5c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a5d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a5e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a5f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a600: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a610: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a620: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a630: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a640: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a650: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a660: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a670: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a680: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a690: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a6a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a6b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a6c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a6d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a6e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a6f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a700: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a710: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a730: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a740: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a750: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a760: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a770: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a780: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a790: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a7a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a7b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a7c0: 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61 62 6c  c int test_enabl
a7d0: 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65  e_shared(.  Clie
a7e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a7f0: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a800: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a810: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a820: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a830: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a840: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a850: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a860: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a870: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a880: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a890: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a8a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a8b0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a8c0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a8d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
a8e0: 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e  int enable;.  in
a8f0: 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66  t ret = 0;..  if
a900: 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
a910: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
a920: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
a930: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
a940: 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20  BOOLEAN?");.    
a950: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a960: 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71  ;.  }.  ret = sq
a970: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
a980: 67 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61  g.sharedCacheEna
a990: 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  bled;..  if( obj
a9a0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
a9b0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
a9c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
a9d0: 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20  jv[1], &enable) 
a9e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a9f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aa00: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
aa10: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
aa20: 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20  cache(enable);. 
aa30: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
aa40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63  E_OK ){.      Tc
aa50: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
aa60: 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
aa70: 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54  te3ErrStr(rc), T
aa80: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
aa90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aaa0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
aab0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
aac0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
aad0: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29  BooleanObj(ret))
aae0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
aaf0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  K;.}.#endif..../
ab00: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
ab10: 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
ab20: 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20  ult_codes   DB  
ab30: 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a    BOOLEAN.**.*/.
ab40: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
ab50: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
ab60: 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74 44  codes(.  ClientD
ab70: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
ab80: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
ab90: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
aba0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
abb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
abc0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
abd0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
abe0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
abf0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
ac00: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
ac10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ac20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
ac30: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ac40: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
ac50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
ac60: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
ac70: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
ac80: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
ac90: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
aca0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
acb0: 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45 41  objv, "DB BOOLEA
acc0: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
acd0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ace0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
acf0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
ad00: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
ad10: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
ad20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
ad30: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
ad40: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
ad50: 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65 29  bjv[2], &enable)
ad60: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ad70: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  ROR;.  sqlite3_e
ad80: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
ad90: 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65 29  odes(db, enable)
ada0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
adb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
adc0: 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  e: sqlite3_libve
add0: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a  rsion_number.**.
ade0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
adf0: 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
ae00: 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  mber(.  ClientDa
ae10: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
ae20: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
ae30: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
ae40: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
ae50: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ae60: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
ae70: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
ae80: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
ae90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
aea0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
aeb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
aec0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
aed0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
aee0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
aef0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
af00: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
af10: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
af20: 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
af30: 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
af40: 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  er()));.  return
af50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
af60: 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
af70: 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
af80: 74 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65  tadata DB dbname
af90: 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65   tblname colname
afa0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
afb0: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
afc0: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
afd0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
afe0: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
aff0: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
b000: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
b010: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
b020: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
b030: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
b040: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
b050: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
b060: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
b070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b080: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b090: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
b0a0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
b0b0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
b0c0: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b0d0: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
b0e0: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
b0f0: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
b100: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
b110: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
b120: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
b130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
b140: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
b150: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
b160: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
b170: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b180: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b190: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b1a0: 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
b1b0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
b1c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b1d0: 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61  , objv, "DB dbna
b1e0: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
b1f0: 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me");.    return
b200: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b210: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
b220: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b230: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b240: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
b250: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
b260: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
b270: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54  g(objv[2]);.  zT
b280: 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  bl = Tcl_GetStri
b290: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a  ng(objv[3]);.  z
b2a0: 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20 3f 20  Col = objc==5 ? 
b2b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b2c0: 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20 20 69  jv[4]) : 0;..  i
b2d0: 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d  f( strlen(zDb)==
b2e0: 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20  0 ) zDb = 0;..  
b2f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
b300: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
b310: 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c  ta(db, zDb, zTbl
b320: 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26  , zCol, .      &
b330: 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c  zDatatype, &zCol
b340: 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20  lseq, &notnull, 
b350: 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75  &primarykey, &au
b360: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20  toincrement);.. 
b370: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b380: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
b390: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b3a0: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
b3b0: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
b3c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b3d0: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
b3e0: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
b3f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b400: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b410: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
b420: 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29  j(zDatatype, -1)
b430: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b440: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b450: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b460: 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71  ringObj(zCollseq
b470: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b480: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b490: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b4a0: 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c  NewIntObj(notnul
b4b0: 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  l));.  Tcl_ListO
b4c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b4d0: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b4e0: 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65  IntObj(primaryke
b4f0: 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  y));.  Tcl_ListO
b500: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b510: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b520: 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65  IntObj(autoincre
b530: 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65  ment));.  Tcl_Se
b540: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b550: 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74  p, pRet);..  ret
b560: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
b570: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b580: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61  IT_INCRBLOB..sta
b590: 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e 64  tic int blobHand
b5a0: 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c  leFromObj(.  Tcl
b5b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b5c0: 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62   .  Tcl_Obj *pOb
b5d0: 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  j,.  sqlite3_blo
b5e0: 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20  b **ppBlob.){.  
b5f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
b600: 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74  ;..  z = Tcl_Get
b610: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f  StringFromObj(pO
b620: 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e  bj, &n);.  if( n
b630: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c  ==0 ){.    *ppBl
b640: 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ob = 0;.  }else{
b650: 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64  .    int notUsed
b660: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
b670: 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43  l channel;.    C
b680: 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e  lientData instan
b690: 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20  ceData;.    .   
b6a0: 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47   channel = Tcl_G
b6b0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
b6c0: 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  , z, &notUsed);.
b6d0: 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c      if( !channel
b6e0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b6f0: 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c  ROR;..    Tcl_Fl
b700: 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20  ush(channel);.  
b710: 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e    Tcl_Seek(chann
b720: 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  el, 0, SEEK_SET)
b730: 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44  ;..    instanceD
b740: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  ata = Tcl_GetCha
b750: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
b760: 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a  (channel);.    *
b770: 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69  ppBlob = *((sqli
b780: 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74  te3_blob **)inst
b790: 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  anceData);.  }..
b7a0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b7b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .}..static int t
b7c0: 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  est_blob_reopen(
b7d0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
b7e0: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74  ientData, /* Not
b7f0: 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49   used */.  Tcl_I
b800: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
b810: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
b820: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
b830: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
b840: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
b850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
b860: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
b870: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
b880: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
b890: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
b8a0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
b8b0: 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 69  cl_WideInt iRowi
b8c0: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  d;.  sqlite3_blo
b8d0: 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  b *pBlob;.  int 
b8e0: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
b8f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
b900: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b910: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41  p, 1, objv, "CHA
b920: 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20  NNEL ROWID");.  
b930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b940: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62  OR;.  }..  if( b
b950: 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a  lobHandleFromObj
b960: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
b970: 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75  , &pBlob) ) retu
b980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b990: 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
b9a0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
b9b0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77  , objv[2], &iRow
b9c0: 69 64 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  id) ) return TCL
b9d0: 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
b9e0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
b9f0: 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69  pen(pBlob, iRowi
ba00: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  d);.  if( rc!=SQ
ba10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
ba20: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ba30: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
ba40: 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
ba50: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
ba60: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72    }..  return (r
ba70: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
ba80: 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f  CL_OK : TCL_ERRO
ba90: 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f  R);.}..#endif../
baa0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
bab0: 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
bac0: 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c  tion_v2 DB-HANDL
bad0: 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20  E NAME CMP-PROC 
bae0: 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20  DEL-PROC.**.**  
baf0: 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69   This Tcl proc i
bb00: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
bb10: 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e  ng the experimen
bb20: 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33  tal.**   sqlite3
bb30: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
bb40: 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61 63 65  n_v2() interface
bb50: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74  ..*/.struct Test
bb60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54  CollationX {.  T
bb70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
bb80: 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  p;.  Tcl_Obj *pC
bb90: 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  mp;.  Tcl_Obj *p
bba0: 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20  Del;.};.typedef 
bbb0: 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61  struct TestColla
bbc0: 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74  tionX TestCollat
bbd0: 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69  ionX;.static voi
bbe0: 64 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  d testCreateColl
bbf0: 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70  ationDel(void *p
bc00: 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c  Ctx){.  TestColl
bc10: 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73  ationX *p = (Tes
bc20: 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43  tCollationX *)pC
bc30: 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20  tx;..  int rc = 
bc40: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
bc50: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c  >interp, p->pDel
bc60: 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43  , TCL_EVAL_DIREC
bc70: 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  T|TCL_EVAL_GLOBA
bc80: 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  L);.  if( rc!=TC
bc90: 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  L_OK ){.    Tcl_
bca0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
bcb0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
bcc0: 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
bcd0: 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20  unt(p->pCmp);.  
bce0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bcf0: 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c  (p->pDel);.  sql
bd00: 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20  ite3_free((void 
bd10: 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69  *)p);.}.static i
bd20: 6e 74 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c  nt testCreateCol
bd30: 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69  lationCmp(.  voi
bd40: 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  d *pCtx,.  int n
bd50: 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  Left,.  const vo
bd60: 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74  id *zLeft,.  int
bd70: 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74   nRight,.  const
bd80: 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b   void *zRight.){
bd90: 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  .  TestCollation
bda0: 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c  X *p = (TestColl
bdb0: 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20  ationX *)pCtx;. 
bdc0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70   Tcl_Obj *pScrip
bdd0: 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  t = Tcl_Duplicat
bde0: 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  eObj(p->pCmp);. 
bdf0: 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a   int iRes = 0;..
be00: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
be10: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54  nt(pScript);.  T
be20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
be30: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
be40: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
be50: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65  gObj((char *)zLe
be60: 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54  ft, nLeft));.  T
be70: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
be80: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69  Element(0, pScri
be90: 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pt, Tcl_NewStrin
bea0: 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69  gObj((char *)zRi
beb0: 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20  ght,nRight));.. 
bec0: 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
bed0: 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e  _EvalObjEx(p->in
bee0: 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54  terp, pScript, T
bef0: 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54  CL_EVAL_DIRECT|T
bf00: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a  CL_EVAL_GLOBAL).
bf10: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
bf20: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
bf30: 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  p->interp, Tcl_G
bf40: 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69  etObjResult(p->i
bf50: 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20  nterp), &iRes). 
bf60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
bf70: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
bf80: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63  nterp);.  }.  Tc
bf90: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bfa0: 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75  Script);..  retu
bfb0: 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69  rn iRes;.}.stati
bfc0: 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74  c int test_creat
bfd0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
bfe0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
bff0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
c000: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
c010: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c020: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
c030: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
c040: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
c050: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c070: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
c080: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
c090: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
c0a0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
c0b0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65  ments */.){.  Te
c0c0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b  stCollationX *p;
c0d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
c0e0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
c0f0: 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
c100: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
c110: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
c120: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d  , "DB-HANDLE NAM
c130: 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50  E CMP-PROC DEL-P
c140: 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ROC");.    retur
c150: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c160: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
c170: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
c180: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
c190: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
c1a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
c1b0: 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69  p = (TestCollati
c1c0: 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  onX *)sqlite3_ma
c1d0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74  lloc(sizeof(Test
c1e0: 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20  CollationX));.  
c1f0: 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33  p->pCmp = objv[3
c200: 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f  ];.  p->pDel = o
c210: 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74  bjv[4];.  p->int
c220: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
c230: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
c240: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c  (p->pCmp);.  Tcl
c250: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
c260: 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20  >pDel);..  rc = 
c270: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
c280: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20  ollation_v2(db, 
c290: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
c2a0: 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20  jv[2]), 16, .   
c2b0: 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65     (void *)p, te
c2c0: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
c2d0: 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65  nCmp, testCreate
c2e0: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29  CollationDel.  )
c2f0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
c300: 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20  TE_MISUSE ){.   
c310: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c320: 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  t(interp, "sqlit
c330: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
c340: 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f  e_v2() failed to
c350: 20 64 65 74 65 63 74 20 22 0a 20 20 20 20 20 20   detect ".      
c360: 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f  "an invalid enco
c370: 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29  ding", (char*)0)
c380: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c390: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
c3a0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
c3b0: 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64  e_collation_v2(d
c3c0: 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  b, Tcl_GetString
c3d0: 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54  (objv[2]), SQLIT
c3e0: 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28  E_UTF8, .      (
c3f0: 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72  void *)p, testCr
c400: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70  eateCollationCmp
c410: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
c420: 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20  ationDel.  );.  
c430: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
c440: 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73  ../*.** USAGE: s
c450: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
c460: 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d  nction_v2 DB NAM
c470: 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54  E NARG ENC ?SWIT
c480: 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69  CHES?.**.** Avai
c490: 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73 20 61  lable switches a
c4a0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e  re:.**.**   -fun
c4b0: 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20  c    SCRIPT.**  
c4c0: 20 2d 73 74 65 70 20 20 20 20 53 43 52 49 50 54   -step    SCRIPT
c4d0: 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53  .**   -final   S
c4e0: 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74  CRIPT.**   -dest
c4f0: 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79  roy SCRIPT.*/.ty
c500: 70 65 64 65 66 20 73 74 72 75 63 74 20 43 72 65  pedef struct Cre
c510: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72  ateFunctionV2 Cr
c520: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a  eateFunctionV2;.
c530: 73 74 72 75 63 74 20 43 72 65 61 74 65 46 75 6e  struct CreateFun
c540: 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f  ctionV2 {.  Tcl_
c550: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
c560: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63    Tcl_Obj *pFunc
c570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c580: 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20    /* Script for 
c590: 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74  function invocat
c5a0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  ion */.  Tcl_Obj
c5b0: 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20 20 20   *pStep;        
c5c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
c5d0: 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70  pt for agg. step
c5e0: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
c5f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c   Tcl_Obj *pFinal
c600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c610: 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61   /* Script for a
c620: 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  gg. finalization
c630: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   invocation */. 
c640: 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72   Tcl_Obj *pDestr
c650: 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  oy;             
c660: 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73   /* Destructor s
c670: 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74  cript */.};.stat
c680: 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28  ic void cf2Func(
c690: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
c6a0: 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20  *ctx, int nArg, 
c6b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c6c0: 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20  aArg){.}.static 
c6d0: 76 6f 69 64 20 63 66 32 53 74 65 70 28 73 71 6c  void cf2Step(sql
c6e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c6f0: 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c  x, int nArg, sql
c700: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72  ite3_value **aAr
c710: 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  g){.}.static voi
c720: 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74  d cf2Final(sqlit
c730: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29  e3_context *ctx)
c740: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
c750: 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20  cf2Destroy(void 
c760: 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74  *pUser){.  Creat
c770: 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d  eFunctionV2 *p =
c780: 20 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e   (CreateFunction
c790: 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69  V2 *)pUser;..  i
c7a0: 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20  f( p->interp && 
c7b0: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20  p->pDestroy ){. 
c7c0: 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f     int rc = Tcl_
c7d0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
c7e0: 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79  erp, p->pDestroy
c7f0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
c800: 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42  !=TCL_OK ) Tcl_B
c810: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70  ackgroundError(p
c820: 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a  ->interp);.  }..
c830: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
c840: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c850: 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20  t(p->pFunc); .  
c860: 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54  if( p->pStep ) T
c870: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c880: 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66  p->pStep); .  if
c890: 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63  ( p->pFinal ) Tc
c8a0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
c8b0: 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66  ->pFinal); .  if
c8c0: 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20  ( p->pDestroy ) 
c8d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c8e0: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
c8f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
c900: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
c910: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
c920: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
c930: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c940: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
c950: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c960: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c980: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
c990: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
c9a0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
c9d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
c9e0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
c9f0: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
ca00: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
ca10: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
ca20: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
ca30: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ca40: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ca50: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ca60: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
ca70: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ca80: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
ca90: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
caa0: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cab0: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cac0: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cad0: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cae0: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
caf0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cb00: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cb10: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cb20: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cb30: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cb40: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cb50: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cb60: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cb70: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cb80: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
cb90: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
cba0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cbb0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
cbc0: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
cbd0: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
cbe0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
cbf0: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
cc00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
cc10: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
cc20: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cc30: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
cc40: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cc50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cc60: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cc70: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cc80: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cc90: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cca0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
ccb0: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
ccc0: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
ccd0: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cce0: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
ccf0: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cd00: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cd10: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cd20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cd30: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cd40: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cd50: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cd60: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cd70: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cd80: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
cd90: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
cda0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
cdb0: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
cdc0: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
cdd0: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
cde0: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
cdf0: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
ce00: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
ce10: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
ce20: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
ce30: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
ce40: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
ce50: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
ce60: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
ce70: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
ce80: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
ce90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
cea0: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
ceb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
cec0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
ced0: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
cee0: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
cef0: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
cf00: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
cf10: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
cf20: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
cf30: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
cf40: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
cf50: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
cf60: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
cf70: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
cf80: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
cf90: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
cfa0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
cfb0: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
cfc0: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
cfd0: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
cfe0: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
cff0: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d000: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d010: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d020: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d030: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d040: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d050: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d060: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d070: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d080: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d090: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d0a0: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d0b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d0c0: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d0d0: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d0e0: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d0f0: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d100: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d110: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d120: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d130: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d140: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d150: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d160: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d170: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d180: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d190: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d1a0: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d1b0: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d1c0: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d1d0: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d1e0: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d1f0: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d200: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d210: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d220: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d230: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d240: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d250: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d260: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d270: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d280: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d290: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d2a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d2b0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d2c0: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d2d0: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d2e0: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d2f0: 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65   int test_load_e
d300: 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65  xtension(.  Clie
d310: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
d320: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
d330: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
d340: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
d350: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
d360: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
d370: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
d380: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
d390: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d3a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
d3b0: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
d3c0: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
d3d0: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
d3e0: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  */.){.  Tcl_CmdI
d3f0: 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73  nfo cmdInfo;.  s
d400: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
d410: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44  t rc;.  char *zD
d420: 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  b;.  char *zFile
d430: 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20  ;.  char *zProc 
d440: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  = 0;.  char *zEr
d450: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  r = 0;..  if( ob
d460: 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33  jc!=4 && objc!=3
d470: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
d480: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d490: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41   1, objv, "DB-HA
d4a0: 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f  NDLE FILE ?PROC?
d4b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
d4c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d4d0: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
d4e0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
d4f0: 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53  zFile = Tcl_GetS
d500: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
d510: 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
d520: 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c  .    zProc = Tcl
d530: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d540: 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  3]);.  }..  /* E
d550: 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61 74  xtract the C dat
d560: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f  abase handle fro
d570: 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e  m the Tcl comman
d580: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20  d name */.  if( 
d590: 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  !Tcl_GetCommandI
d5a0: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c  nfo(interp, zDb,
d5b0: 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20   &cmdInfo) ){.  
d5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
d5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
d5e0: 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22  and not found: "
d5f0: 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29  , zDb, (char*)0)
d600: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d610: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62  _ERROR;.  }.  db
d620: 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69   = ((struct Sqli
d630: 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
d640: 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62  jClientData)->db
d650: 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a  ;.  assert(db);.
d660: 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75  .  /* Call the u
d670: 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63  nderlying C func
d680: 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tion. If an erro
d690: 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63  r occurs, set rc
d6a0: 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52   to .  ** TCL_ER
d6b0: 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79  ROR and load any
d6c0: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e   error string in
d6d0: 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  to the interpret
d6e0: 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20  er. If no .  ** 
d6f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
d700: 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a  t rc to TCL_OK..
d710: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
d720: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
d730: 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51  ENSION.  rc = SQ
d740: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45  LITE_ERROR;.  zE
d750: 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rr = sqlite3_mpr
d760: 69 6e 74 66 28 22 74 68 69 73 20 62 75 69 6c 64  intf("this build
d770: 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c   omits sqlite3_l
d780: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22  oad_extension()"
d790: 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
d7a0: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
d7b0: 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65  ension(db, zFile
d7c0: 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b  , zProc, &zErr);
d7d0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
d7e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d7f0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
d800: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20  (interp, zErr ? 
d810: 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56  zErr : "", TCL_V
d820: 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63  OLATILE);.    rc
d830: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
d840: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
d850: 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  TCL_OK;.  }.  sq
d860: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
d870: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
d880: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
d890: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
d8a0: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  oad_extension DB
d8b0: 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f  -HANDLE ONOFF.*/
d8c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
d8d0: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20  _enable_load(.  
d8e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d8f0: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
d900: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
d910: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
d920: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
d930: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
d940: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
d950: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
d970: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d980: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
d990: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
d9a0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
d9b0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
d9c0: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
d9d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
d9e0: 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69    char *zDb;.  i
d9f0: 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28  nt onoff;..  if(
da00: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
da10: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
da20: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
da30: 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f  , "DB-HANDLE ONO
da40: 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  FF");.    return
da50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
da60: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
da70: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
da80: 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68  .  /* Extract th
da90: 65 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e  e C database han
daa0: 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c  dle from the Tcl
dab0: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f   command name */
dac0: 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43  .  if( !Tcl_GetC
dad0: 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
dae0: 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f  p, zDb, &cmdInfo
daf0: 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
db00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
db10: 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
db20: 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63  ound: ", zDb, (c
db30: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
db40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
db50: 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75   }.  db = ((stru
db60: 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64  ct SqliteDb*)cmd
db70: 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
db80: 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  ta)->db;.  asser
db90: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  t(db);..  /* Get
dba0: 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d   the onoff param
dbb0: 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63  eter */.  if( Tc
dbc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
dbd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
dbe0: 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a  [2], &onoff) ){.
dbf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dc00: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  RROR;.  }..#ifde
dc10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
dc20: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54  AD_EXTENSION.  T
dc30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
dc40: 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62 75  interp, "this bu
dc50: 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65  ild omits sqlite
dc60: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
dc70: 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ()");.  return T
dc80: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
dc90: 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65    sqlite3_enable
dca0: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
dcb0: 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65  db, onoff);.  re
dcc0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e  turn TCL_OK;.#en
dcd0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  dif.}../*.** Usa
dce0: 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72  ge:  sqlite_abor
dcf0: 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e  t.**.** Shutdown
dd00: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d   the process imm
dd10: 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20  ediately.  This 
dd20: 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73  is not a clean s
dd30: 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73  hutdown..** This
dd40: 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64   command is used
dd50: 20 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63   to test the rec
dd60: 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61  overability of a
dd70: 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20   database in.** 
dd80: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70  the event of a p
dd90: 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f  rogram crash..*/
dda0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
ddb0: 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64  te_abort(.  void
ddc0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
ddd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
dde0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
ddf0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
de00: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
de10: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
de20: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
de30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
de40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
de50: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
de60: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
de70: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
de80: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
de90: 4d 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65  MSC_VER).  /* We
dea0: 20 64 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77   do this, otherw
deb0: 69 73 65 20 74 68 65 20 74 65 73 74 20 77 69 6c  ise the test wil
dec0: 6c 20 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f  l halt with a po
ded0: 70 75 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a  pup message.   *
dee0: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
def0: 20 63 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f   click away befo
df00: 72 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c  re the test will
df10: 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f   continue..   */
df20: 0a 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65  .  _set_abort_be
df30: 68 61 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c  havior( 0, _CALL
df40: 5f 52 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a  _REPORTFAULT );.
df50: 23 65 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35  #endif.  exit(25
df60: 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  5);.  assert( in
df70: 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  terp==0 );   /* 
df80: 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73  This will always
df90: 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72   fail */.  retur
dfa0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
dfb0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
dfc0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73   routine is a us
dfd0: 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66  er-defined SQL f
dfe0: 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75  unction whose pu
dff0: 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74  rpose.** is to t
e000: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73  est the sqlite_s
e010: 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e  et_result() API.
e020: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e030: 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33  testFunc(sqlite3
e040: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
e050: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
e060: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
e070: 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67  v){.  while( arg
e080: 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73  c>=2 ){.    cons
e090: 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20  t char *zArg0 = 
e0a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
e0b0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
e0c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67  ]);.    if( zArg
e0d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  0 ){.      if( 0
e0e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
e0f0: 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29  (zArg0, "int") )
e100: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e110: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
e120: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
e130: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
e140: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e150: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
e160: 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29  p(zArg0,"int64")
e170: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e180: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
e190: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  t64(context, sql
e1a0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
e1b0: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
e1c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
e1d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
e1e0: 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b  ,"string")==0 ){
e1f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e200: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
e210: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c  text, (char*)sql
e220: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
e230: 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20  argv[1]), -1,.  
e240: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e250: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
e260: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
e270: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
e280: 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  0,"double")==0 )
e290: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e2a0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
e2b0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
e2c0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
e2d0: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
e2e0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
e2f0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e  StrICmp(zArg0,"n
e300: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
e310: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e320: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
e330: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e340: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e350: 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d  (zArg0,"value")=
e360: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e370: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
e380: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
e390: 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  [sqlite3_value_i
e3a0: 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20  nt(argv[1])]);. 
e3b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e3c0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e3d0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
e3e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
e3f0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
e400: 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32   }.    argc -= 2
e410: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  ;.    argv += 2;
e420: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  .  }.  return;..
e430: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
e440: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
e450: 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74  r(context,"first
e460: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
e470: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
e480: 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73      "int int64 s
e490: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
e4a0: 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d  l value", -1);.}
e4b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
e4c0: 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72   sqlite_register
e4d0: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20  _test_function  
e4e0: 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  DB  NAME.**.** R
e4f0: 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74  egister the test
e500: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   SQL function on
e510: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
e520: 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20   under the name 
e530: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
e540: 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74 65  int test_registe
e550: 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  r_func(.  void *
e560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
e570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
e580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
e590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
e5a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
e5b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
e5c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
e5d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
e5e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
e5f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
e600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
e610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
e620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
e630: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
e640: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
e650: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e660: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e670: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e680: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
e690: 20 20 20 20 20 20 20 22 20 44 42 20 46 55 4e 43         " DB FUNC
e6a0: 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a  TION-NAME", 0);.
e6b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e6c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
e6d0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
e6e0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
e6f0: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
e700: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
e710: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
e720: 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
e730: 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
e740: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65  F8, 0, .      te
e750: 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  stFunc, 0, 0);. 
e760: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
e770: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e780: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
e790: 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29  e3ErrStr(rc), 0)
e7a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e7b0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
e7c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
e7d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
e7e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
e7f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
e800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e810: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
e820: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d  e3_finalize  STM
e830: 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a  T .**.** Finaliz
e840: 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61  e a statement ha
e850: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
e860: 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a  int test_finaliz
e870: 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
e880: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
e890: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
e8a0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
e8b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e8c0: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
e8d0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
e8e0: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
e8f0: 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  *db = 0;..  if( 
e900: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
e910: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e920: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
e930: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
e940: 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
e950: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
e960: 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
e970: 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
e980: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e990: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
e9a0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
e9b0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
e9c0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
e9d0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
e9e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
e9f0: 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64  ( pStmt ){.    d
ea00: 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74  b = StmtToDb(pSt
ea10: 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  mt);.  }.  rc = 
ea20: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
ea30: 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
ea40: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
ea50: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
ea60: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
ea70: 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20  ATIC);.  if( db 
ea80: 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  && sqlite3TestEr
ea90: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
eaa0: 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
eab0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
eac0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
ead0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
eae0: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  te3_stmt_status 
eaf0: 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53   STMT  CODE  RES
eb00: 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74  ETFLAG.**.** Get
eb10: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
eb20: 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66  status counter f
eb30: 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  rom a statement.
eb40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
eb50: 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  est_stmt_status(
eb60: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
eb70: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
eb80: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
eb90: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
eba0: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
ebb0: 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b  ){.  int iValue;
ebc0: 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d 20 30  .  int i, op = 0
ebd0: 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63  , resetFlag;.  c
ebe0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
ebf0: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  me;.  sqlite3_st
ec00: 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74  mt *pStmt;..  st
ec10: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
ec20: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
ec30: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
ec40: 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d  nt op;.  } aOp[]
ec50: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
ec60: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
ec70: 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20  LLSCAN_STEP",   
ec80: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
ec90: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
eca0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
ecb0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
ecc0: 52 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RT",            
ecd0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
ece0: 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20  S_SORT          
ecf0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
ed00: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
ed10: 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  TOINDEX",       
ed20: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
ed30: 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20  S_AUTOINDEX     
ed40: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
ed50: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
ed60: 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20 20 20  _STEP",         
ed70: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
ed80: 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20 20 20  S_VM_STEP       
ed90: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20    },.  };.  if( 
eda0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
edb0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
edc0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
edd0: 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52   "STMT PARAMETER
ede0: 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20   RESETFLAG");.  
edf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ee00: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
ee10: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
ee20: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ee30: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
ee40: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
ee50: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61  L_ERROR;.  zOpNa
ee60: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
ee70: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
ee80: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
ee90: 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aOp); i++){.
eea0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
eeb0: 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70  Op[i].zName, zOp
eec0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
eed0: 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70    op = aOp[i].op
eee0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eef0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
ef00: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29  >=ArraySize(aOp)
ef10: 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
ef20: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
ef30: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
ef40: 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  op) ) return TCL
ef50: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
ef60: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
ef70: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
ef80: 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46  objv[3], &resetF
ef90: 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  lag) ) return TC
efa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75  L_ERROR;.  iValu
efb0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e = sqlite3_stmt
efc0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f  _status(pStmt, o
efd0: 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  p, resetFlag);. 
efe0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
eff0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
f000: 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29  wIntObj(iValue))
f010: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
f020: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
f030: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
f040: 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a 2a 2a  SCANSTATUS./*.**
f050: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f060: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
f070: 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73 74 61   STMT IDX.*/.sta
f080: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
f090: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f0a0: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f0b0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f0c0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f0d0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f0e0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f0f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f100: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f110: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f120: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f130: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f140: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f150: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f160: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f170: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f180: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f190: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f1a0: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f1b0: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f1c0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f1d0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f1e0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f1f0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f200: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f210: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f220: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f230: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f240: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f250: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f260: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f270: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f280: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f290: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f2a0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f2b0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f2c0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f2d0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f2e0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f2f0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f300: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f310: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f320: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f330: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f340: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f350: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f360: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f370: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f380: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f390: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f3a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f3b0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f3c0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f3d0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f3e0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f3f0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f400: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f410: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f420: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f430: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f440: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f450: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f460: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f470: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f480: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f490: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f4a0: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f4b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f4c0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f4d0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f4e0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f4f0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f500: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f510: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f520: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f530: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f540: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f550: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f560: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f570: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f580: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f590: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f5a0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f5b0: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f5c0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f5d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f5e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f5f0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f600: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f610: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f620: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f630: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f640: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
f650: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
f660: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f670: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f680: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f690: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
f6a0: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
f6b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f6c0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f6d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f6e0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
f6f0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f700: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f710: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f720: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
f730: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
f740: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
f750: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
f760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
f770: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
f780: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
f790: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
f7a0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
f7b0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f7c0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
f7d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f7e0: 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  st_stmt_scanstat
f7f0: 75 73 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64  us_reset(.  void
f800: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
f810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f820: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
f830: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
f840: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
f850: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
f860: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
f870: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
f880: 2a 2f 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  */.  if( objc!=2
f890: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
f8a0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f8b0: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22   1, objv, "STMT"
f8c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f8d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
f8e0: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
f8f0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
f900: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
f910: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
f920: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f930: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
f940: 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28 70 53  nstatus_reset(pS
f950: 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tmt);.  return T
f960: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
f970: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
f980: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a  NABLE_SQLLOG./*.
f990: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f9a0: 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67  e3_config_sqllog
f9b0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  .**.** Zero the 
f9c0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
f9d0: 4c 4c 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69  LLOG configurati
f9e0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
f9f0: 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c   test_config_sql
fa00: 6c 6f 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  log(.  void * cl
fa10: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
fa20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
fa30: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
fa40: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
fa50: 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
fa60: 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
fa70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
fa80: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
fa90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
faa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
fab0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
fac0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fad0: 4f 47 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  OG, 0, 0);.  ret
fae0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
faf0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ndif../*.** Usag
fb00: 65 3a 20 76 66 73 5f 63 75 72 72 65 6e 74 5f 74  e: vfs_current_t
fb10: 69 6d 65 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20  ime_int64.**.** 
fb20: 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
fb30: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65   returned by the
fb40: 20 64 65 66 61 75 6c 74 20 56 46 53 27 73 20 78   default VFS's x
fb50: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
fb60: 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74   method..*/.stat
fb70: 69 63 20 69 6e 74 20 76 66 73 43 75 72 72 65 6e  ic int vfsCurren
fb80: 74 54 69 6d 65 49 6e 74 36 34 28 0a 20 20 76 6f  tTimeInt64(.  vo
fb90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
fba0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
fbb0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
fbc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
fbd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
fbe0: 69 36 34 20 74 3b 0a 20 20 73 71 6c 69 74 65 33  i64 t;.  sqlite3
fbf0: 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
fc00: 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
fc10: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
fc20: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
fc30: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fc40: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
fc50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
fc60: 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 66 73 2d 3e  OR;.  }.  pVfs->
fc70: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
fc80: 34 28 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 54  4(pVfs, &t);.  T
fc90: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
fca0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
fcb0: 69 64 65 49 6e 74 4f 62 6a 28 74 29 29 3b 0a 20  ideIntObj(t));. 
fcc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
fcd0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
fce0: 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
fcf0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
fd00: 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
fd10: 65 74 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a  et DB DBNAME.*/.
fd20: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
fd30: 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20  snapshot_get(.  
fd40: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fd50: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fd60: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fd70: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fd80: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fd90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
fda0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
fdb0: 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
fdc0: 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
fdd0: 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69 66  pshot = 0;..  if
fde0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
fdf0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fe00: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
fe10: 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
fe20: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fe30: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fe40: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
fe50: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
fe60: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
fe70: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
fe80: 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d  ERROR;.  zName =
fe90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
fea0: 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d  bjv[2]);..  rc =
feb0: 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
fec0: 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65 2c  t_get(db, zName,
fed0: 20 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20   &pSnapshot);.  
fee0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fef0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
ff00: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ff10: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ff20: 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
ff30: 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
ff40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ff50: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
ff60: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
ff70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
ff80: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
ff90: 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
ffa0: 70 53 6e 61 70 73 68 6f 74 29 20 29 20 72 65 74  pSnapshot) ) ret
ffb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ffc0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
ffd0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
ffe0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 75  NewStringObj(zBu
fff0: 66 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  f, -1));.  }.  r
10000 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10010 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10020 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10030 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
10040 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10050 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OT./*.** Usage: 
10060 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10070 5f 6f 70 65 6e 20 44 42 20 44 42 4e 41 4d 45 20  _open DB DBNAME 
10080 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74  SNAPSHOT.*/.stat
10090 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61 70  ic int test_snap
100a0 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69  shot_open(.  voi
100b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
100c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
100d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
100e0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
100f0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
10100 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
10110 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e   *db;.  char *zN
10120 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ame;.  sqlite3_s
10130 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68  napshot *pSnapsh
10140 6f 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ot;..  if( objc!
10150 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
10160 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10170 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
10180 44 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 22  DBNAME SNAPSHOT"
10190 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
101a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
101b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
101c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
101d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
101e0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
101f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65  L_ERROR;.  zName
10200 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
10210 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 53 6e  (objv[2]);.  pSn
10220 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65  apshot = (sqlite
10230 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69  3_snapshot*)sqli
10240 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
10250 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
10260 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20 72 63 20  bjv[3]));..  rc 
10270 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  = sqlite3_snapsh
10280 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a 4e 61 6d  ot_open(db, zNam
10290 65 2c 20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  e, pSnapshot);. 
102a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
102b0 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
102c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
102d0 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
102e0 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
102f0 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
10300 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10310 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
10320 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
10330 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10340 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a  LE_SNAPSHOT */..
10350 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10360 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a  ABLE_SNAPSHOT./*
10370 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
10380 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  e3_snapshot_free
10390 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61   SNAPSHOT.*/.sta
103a0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 61  tic int test_sna
103b0 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76 6f  pshot_free(.  vo
103c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
103d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
103e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
103f0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10400 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10410 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10420 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20 69   *pSnapshot;.  i
10430 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
10440 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10450 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10460 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29 3b  jv, "SNAPSHOT");
10470 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10480 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 6e  ERROR;.  }.  pSn
10490 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65  apshot = (sqlite
104a0 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69  3_snapshot*)sqli
104b0 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
104c0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
104d0 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c 69  bjv[1]));.  sqli
104e0 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
104f0 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  e(pSnapshot);.  
10500 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10510 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10520 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10530 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  T */../*.** Usag
10540 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
10550 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
10560 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10570 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
10580 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
10590 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
105a0 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73   int test_next_s
105b0 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tmt(.  void * cl
105c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
105d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
105e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
105f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10600 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10610 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
10620 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
10630 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
10640 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
10650 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10660 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10670 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10680 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
10690 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
106a0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
106b0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54  [0], 0), " DB ST
106c0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
106d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
106e0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
106f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10700 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10710 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10720 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10730 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10740 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10750 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10760 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  2]), &pStmt) ) r
10770 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10780 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
10790 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c  e3_next_stmt(db,
107a0 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70   pStmt);.  if( p
107b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
107c0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
107d0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
107e0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
107f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10800 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
10810 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10820 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
10830 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10840 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
10850 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
10860 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  donly  STMT.**.*
10870 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
10880 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20   STMT is a NULL 
10890 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69  pointer or a poi
108a0 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
108b0 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67  ent.** that is g
108c0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61  uaranteed to lea
108d0 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
108e0 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
108f0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
10900 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
10910 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10920 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10930 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10940 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10950 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10960 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10970 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
10980 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
10990 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
109a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
109b0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
109c0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
109d0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
109e0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
109f0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
10a00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
10a20 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10a30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10a40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10a50 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10a60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10a70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10a80 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
10a90 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
10aa0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10ab0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10ac0 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
10ad0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
10ae0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10af0 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
10b00 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
10b10 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
10b20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
10b30 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
10b40 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
10b50 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
10b60 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
10b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b80 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a  test_stmt_busy(.
10b90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10ba0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10bb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10bc0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10bd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
10be0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
10bf0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
10c00 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10c10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
10c20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10c30 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10c40 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
10c50 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
10c60 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10c70 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
10c80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
10c90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10ca0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
10cb0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10cc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10cd0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
10ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cf0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
10d00 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d  3_stmt_busy(pStm
10d10 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
10d20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10d30 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
10d40 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
10d50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10d60 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74   Usage:  uses_st
10d70 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54  mt_journal  STMT
10d80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
10d90 75 65 20 69 66 20 53 54 4d 54 20 75 73 65 73 20  ue if STMT uses 
10da0 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
10db0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
10dc0 6e 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  nt uses_stmt_jou
10dd0 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  rnal(.  void * c
10de0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10df0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10e00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10e10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10e20 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10e30 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
10e40 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
10e50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
10e60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
10e70 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
10e80 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
10e90 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
10ea0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
10eb0 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  , 0), " STMT", 0
10ec0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10ed0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
10ee0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10ef0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10f00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10f10 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
10f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10f30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
10f40 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
10f50 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10f60 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10f70 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64  wBooleanObj(((Vd
10f80 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65  be *)pStmt)->use
10f90 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a  sStmtJournal));.
10fa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10fb0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
10fc0 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
10fd0 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
10fe0 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
10ff0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
11000 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74  c int test_reset
11010 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11020 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11030 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11040 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
11050 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
11060 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
11070 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
11080 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
11090 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
110a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
110b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
110c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
110d0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
110e0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
110f0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
11100 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
11110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11120 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
11130 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
11140 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11150 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
11160 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
11170 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
11180 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
11190 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
111a0 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
111b0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
111c0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
111d0 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
111e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
111f0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
11200 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
11210 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
11220 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
11230 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
11240 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11250 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
11260 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11270 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11280 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
11290 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
112a0 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
112b0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
112c0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
112d0 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
112e0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69  ic int test_expi
112f0 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  red(.  void * cl
11300 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11310 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11320 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11330 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11340 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
11350 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
11360 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f  CATED.  sqlite3_
11370 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
11380 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
11390 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
113a0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
113b0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
113c0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
113d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
113e0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
113f0 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
11400 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11410 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
11420 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11430 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11440 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11450 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
11460 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
11470 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11480 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
11490 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65  ooleanObj(sqlite
114a0 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29  3_expired(pStmt)
114b0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
114c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
114d0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
114e0 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69  ite3_transfer_bi
114f0 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20  ndings FROMSTMT 
11500 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61  TOSTMT.**.** Tra
11510 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e  nsfer all bindin
11520 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54  gs from FROMSTMT
11530 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a   over to TOSTMT.
11540 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
11550 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
11560 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
11570 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
11580 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
11590 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
115a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
115b0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
115c0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
115d0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
115e0 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d  t *pStmt1, *pStm
115f0 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t2;.  if( objc!=
11600 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
11610 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11620 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
11630 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
11640 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
11650 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11660 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d  v[0], 0), " FROM
11670 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20  -STMT TO-STMT", 
11680 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
11690 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
116a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
116b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
116c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
116d0 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74  ), &pStmt1)) ret
116e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
116f0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
11700 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
11720 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65  ]), &pStmt2)) re
11730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11740 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11750 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
11760 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
11770 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
11780 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c  bindings(pStmt1,
11790 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69  pStmt2)));.#endi
117a0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
117b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
117c0 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  e:  sqlite3_chan
117d0 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ges DB.**.** Ret
117e0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
117f0 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  f changes made t
11800 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
11810 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a  y the last SQL.*
11820 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a  * execution..*/.
11830 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
11840 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
11850 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11860 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11870 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11880 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11890 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
118a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
118b0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
118c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
118d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
118e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
118f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
11900 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11910 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
11920 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11930 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
11940 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
11950 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11960 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
11970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11980 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
11990 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
119a0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
119b0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
119c0 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
119d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
119e0 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
119f0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
11a00 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
11a10 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
11a20 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
11a30 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
11a40 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
11a50 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
11a60 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
11a70 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
11a80 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
11a90 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
11aa0 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
11ab0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
11ac0 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
11ad0 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
11ae0 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
11af0 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
11b00 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69  urrence of "?" i
11b10 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
11b20 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
11b30 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
11b40 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
11b50 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
11b60 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
11b70 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
11b80 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
11b90 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
11ba0 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
11bb0 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
11bc0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
11bd0 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
11be0 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
11bf0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11c00 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
11c10 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
11c20 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
11c30 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
11c40 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
11c50 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
11c60 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
11c70 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
11c80 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
11c90 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
11ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11cb0 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e  _bind(.  void *N
11cc0 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
11cd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
11ce0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
11cf0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
11d00 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
11d10 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d30 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
11d40 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
11d50 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
11d60 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
11d70 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
11d80 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11d90 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
11da0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
11db0 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
11dc0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
11dd0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
11de0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
11df0 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
11e00 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44   .       " VM ID
11e10 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74  X VALUE (null|st
11e20 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c  atic|normal)\"",
11e30 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11e50 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
11e60 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
11e70 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72  [1], &pStmt) ) r
11e80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11e90 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
11ea0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
11eb0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
11ec0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
11ed0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
11ee0 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"null")==0 ){.
11ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11f00 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
11f10 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20  , idx);.  }else 
11f20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
11f30 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20  4],"static")==0 
11f40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11f50 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11f60 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11f70 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11f80 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65  ue, -1, 0);.  }e
11f90 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
11fa0 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e  rgv[4],"static-n
11fb0 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  bytes")==0 ){.  
11fc0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
11fd0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
11fe0 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
11ff0 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20  ic_bind_value,. 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12020 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61        sqlite_sta
12030 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
12040 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
12050 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
12060 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  normal")==0 ){. 
12070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
12080 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
12090 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d   idx, argv[3], -
120a0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
120b0 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ENT);.  }else if
120c0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
120d0 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b  ,"blob10")==0 ){
120e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
120f0 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
12100 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30  t, idx, "abc\000
12110 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20  xyz\000pq", 10, 
12120 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
12140 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12150 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
12160 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
12170 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
12180 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
12190 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
121a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
121b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
121c0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
121d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
121e0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
121f0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
12200 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
12210 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
12220 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  f[50];.    sqlit
12230 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
12240 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
12250 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
12260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12270 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
12280 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
12290 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
122a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
122b0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
122c0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
122d0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
122e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
122f0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64  _test_collate <d
12300 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75  b ptr> <utf8> <u
12310 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
12320 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  >.**.** This fun
12330 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
12340 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
12350 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f  e selects the co
12360 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a  rrect collation.
12370 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c  ** sequence call
12380 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
12390 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
123a0 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
123b0 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
123c0 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
123d0 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
123e0 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
123f0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
12400 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63  sequence "test_c
12410 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20  ollate".** with 
12420 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12430 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64  <db>. The second
12440 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
12450 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65  e a list of thre
12460 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  e.** boolean val
12470 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72 73  ues. If the firs
12480 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  t is true, then 
12490 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
124a0 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20  t_collate is.** 
124b0 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
124c0 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63  TF-8, if the sec
124d0 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ond is true, a v
124e0 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
124f0 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d  ered for.** UTF-
12500 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69  16le, if the thi
12510 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55 54  rd is true, a UT
12520 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69  F-16be version i
12530 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20  s available..** 
12540 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e  Previous version
12550 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74  s of test_collat
12560 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a  e are deleted..*
12570 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69  *.** The collati
12580 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73 74  on sequence test
12590 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c  _collate is impl
125a0 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69  emented by calli
125b0 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  ng the.** follow
125c0 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
125d0 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f  **.**   "test_co
125e0 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73  llate <enc> <lhs
125f0 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54  > <rhs>".**.** T
12600 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68  he <lhs> and <rh
12610 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20 76  s> are the two v
12620 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70  alues being comp
12630 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e  ared, encoded in
12640 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c   UTF-8..** The <
12650 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69  enc> parameter i
12660 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f  s the encoding o
12670 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
12680 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
12690 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64   SQLite selected
126a0 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43   to call. The TC
126b0 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69 6d  L test script im
126c0 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20  plements the.** 
126d0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70  "test_collate" p
126e0 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  roc..**.** Note 
126f0 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f  that this will o
12700 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e  nly work with on
12710 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 74  e interpreter at
12720 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a   a time, as the.
12730 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65  ** interp pointe
12740 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76  r to use when ev
12750 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c  aluating the TCL
12760 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65   script is store
12770 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c  d in.** pTestCol
12780 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73  lateInterp..*/.s
12790 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70  tatic Tcl_Interp
127a0 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  * pTestCollateIn
127b0 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74  terp;.static int
127c0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
127d0 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  nc(.  void *pCtx
127e0 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e  , .  int nA, con
127f0 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69  st void *zA,.  i
12800 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nB, const voi
12810 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49  d *zB.){.  Tcl_I
12820 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74  nterp *i = pTest
12830 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20  CollateInterp;. 
12840 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c   int encin = SQL
12850 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
12860 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b  Ctx);.  int res;
12870 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c  .  int n;..  sql
12880 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12890 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
128a0 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ..  pX = Tcl_New
128b0 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
128c0 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20  collate", -1);. 
128d0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
128e0 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68  t(pX);..  switch
128f0 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63  ( encin ){.    c
12900 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a  ase SQLITE_UTF8:
12910 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
12920 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12930 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
12940 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31  ngObj("UTF-8",-1
12950 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
12960 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12970 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20  _UTF16LE:.      
12980 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12990 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
129a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
129b0 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a  UTF-16LE",-1));.
129c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
129d0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46   case SQLITE_UTF
129e0 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f  16BE:.      Tcl_
129f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
12a00 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65  ment(i,pX,Tcl_Ne
12a10 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
12a20 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20  16BE",-1));.    
12a30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
12a40 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
12a50 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  rt(0);.  }..  sq
12a60 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
12a70 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c  Malloc();.  pVal
12a80 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
12a90 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61  ew(0);.  if( pVa
12aa0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
12ab0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
12ac0 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c  , nA, zA, encin,
12ad0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12ae0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
12af0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
12b00 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
12b10 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12b20 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
12b30 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12b40 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12b50 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12b60 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12b70 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
12b80 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c  , nB, zB, encin,
12b90 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
12ba0 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  .    n = sqlite3
12bb0 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61  _value_bytes(pVa
12bc0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  l);.    Tcl_List
12bd0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12be0 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54  (i,pX,.        T
12bf0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12c00 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
12c10 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
12c20 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n));.    sqlite3
12c30 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
12c40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e  .  }.  sqlite3En
12c50 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12c60 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ..  Tcl_EvalObjE
12c70 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  x(i, pX, 0);.  T
12c80 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
12c90 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e  pX);.  Tcl_GetIn
12ca0 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f  tFromObj(i, Tcl_
12cb0 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c  GetObjResult(i),
12cc0 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e   &res);.  return
12cd0 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69   res;.}.static i
12ce0 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28  nt test_collate(
12cf0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12d00 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12d10 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12d20 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12d30 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12d40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12d50 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73  ;.  int val;.  s
12d60 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
12d70 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  al;.  int rc;.. 
12d80 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67   if( objc!=5 ) g
12d90 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
12da0 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
12db0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69  rp = interp;.  i
12dc0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
12dd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
12de0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
12df0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
12e00 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
12e10 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
12e20 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12e30 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
12e40 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
12e50 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
12e60 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12e70 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65  ollation(db, "te
12e80 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
12e90 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
12ea0 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12eb0 49 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65  ITE_UTF8, val?te
12ec0 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
12ed0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
12ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
12ef0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31  onst void *zUtf1
12f00 36 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f  6;.    if( TCL_O
12f10 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
12f20 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
12f30 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
12f40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12f50 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  OR;.    rc = sql
12f60 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12f70 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
12f80 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
12f90 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20  _UTF16LE, .     
12fa0 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53         (void *)S
12fb0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76  QLITE_UTF16LE, v
12fc0 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
12fd0 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28  func:0);.    if(
12fe0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12ff0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
13000 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
13010 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
13020 43 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30  CL_ERROR;..#if 0
13030 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13040 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29  _iMallocFail>0 )
13050 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
13060 69 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20  iMallocFail++;. 
13070 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
13090 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
130a0 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74      pVal = sqlit
130b0 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
130c0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
130d0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
130e0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
130f0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
13100 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
13110 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
13120 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
13130 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
13140 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
13150 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13170 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
13190 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
131a0 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c  _collation16(db,
131b0 20 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f   zUtf16, SQLITE_
131c0 55 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20  UTF16BE, .      
131d0 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
131e0 54 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f  TE_UTF16BE, val?
131f0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
13200 63 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  c:0);.    }.    
13210 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13220 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
13230 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
13240 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
13250 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
13260 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13270 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
13280 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a  n TCL_ERROR;.  .
13290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
132a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
132b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
132c0 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
132d0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
132e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
132f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
13300 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73  CL_OK;..bad_args
13310 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  :.  Tcl_AppendRe
13320 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
13330 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
13340 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
13350 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
13360 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
13370 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e  ), " <DB> <utf8>
13380 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31   <utf16le> <utf1
13390 36 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74  6be>", 0);.  ret
133a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
133b0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
133c0 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
133d0 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72  _collate <db ptr
133e0 3e 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74  >.**.** Add a ut
133f0 66 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  f-16 collation s
13400 65 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75  equence named "u
13410 74 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20  tf16bin" to the 
13420 64 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64  database.** hand
13430 6c 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  le. This collati
13440 6f 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70  on sequence comp
13450 61 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69  ares arguments i
13460 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
13470 73 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69  s the.** built-i
13480 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e  n collation "bin
13490 61 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ary"..*/.static 
134a0 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69  int test_utf16bi
134b0 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a  n_collate_func(.
134c0 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
134d0 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76   int nA, const v
134e0 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e  oid *zA,.  int n
134f0 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  B, const void *z
13500 42 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  B.){.  int nCmp 
13510 3d 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20  = (nA>nB ? nB : 
13520 6e 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  nA);.  int res =
13530 20 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20   memcmp(zA, zB, 
13540 6e 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73  nCmp);.  if( res
13550 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d  ==0 ) res = nA -
13560 20 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65   nB;.  return re
13570 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
13580 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
13590 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
135a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
135b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
135c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
135d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
135e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
135f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
13600 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
13610 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
13620 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
13630 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13640 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13650 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
13660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
13670 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
13680 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
13690 62 2c 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53  b, "utf16bin", S
136a0 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20  QLITE_UTF16, 0, 
136b0 0a 20 20 20 20 20 20 74 65 73 74 5f 75 74 66 31  .      test_utf1
136c0 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  6bin_collate_fun
136d0 63 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  c.  );.  if( sql
136e0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
136f0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
13700 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13710 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
13720 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
13730 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13740 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
13750 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  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 57 68 65 6e 20 74 68 65  ../*.** When the
13780 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65   collation neede
13790 64 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e  d callback is in
137a0 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68  voked, record th
137b0 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68  e name of .** th
137c0 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
137d0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68  ating function h
137e0 65 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64  ere.  The record
137f0 65 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65  ed name is linke
13800 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61  d.** to a TCL va
13810 72 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20  riable and used 
13820 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
13830 74 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  t the requested 
13840 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d  collation.** nam
13850 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f  e is correct..*/
13860 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65  .static char zNe
13870 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30  ededCollation[20
13880 30 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20  0];.static char 
13890 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  *pzNeededCollati
138a0 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  on = zNeededColl
138b0 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ation;.../*.** C
138c0 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c  alled when a col
138d0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
138e0 69 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69  is needed.  Regi
138f0 73 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20  stered using.** 
13900 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
13910 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f  n_needed16()..*/
13920 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
13930 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
13940 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  _cb(.  void *pCt
13950 78 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  x, .  sqlite3 *d
13960 62 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  b,.  int eTextRe
13970 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  p,.  const void 
13980 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20  *pName.){.  int 
13990 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
139a0 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
139b0 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68  z;.  for(z = (ch
139c0 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20  ar*)pName, i=0; 
139d0 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29  *z || z[1]; z++)
139e0 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a  {.    if( *z ) z
139f0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
13a00 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20  i++] = *z;.  }. 
13a10 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
13a20 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  n[i] = 0;.  sqli
13a30 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13a40 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20  tion(.      db, 
13a50 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
13a60 45 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f  ENC(db), SQLITE_
13a70 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c  INT_TO_PTR(enc),
13a80 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75   test_collate_fu
13a90 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  nc);.}../*.** Us
13aa0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f  age: add_test_co
13ab0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a  llate_needed DB.
13ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
13ad0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
13ae0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
13af0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
13b00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
13b10 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
13b20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
13b30 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
13b40 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
13b50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67   if( objc!=2 ) g
13b60 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20  oto bad_args;.  
13b70 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
13b80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13b90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13ba0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
13bb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
13bc0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
13bd0 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20  on_needed16(db, 
13be0 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  0, test_collate_
13bf0 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e  needed_cb);.  zN
13c00 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30  eededCollation[0
13c10 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  ] = 0;.  if( sql
13c20 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13c30 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
13c40 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13c50 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
13c60 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
13c70 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
13c80 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
13c90 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74  jv, "DB");.  ret
13ca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
13cb0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
13cc0 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f    add_alignment_
13cd0 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20  test_collations 
13ce0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77   DB.**.** Add tw
13cf0 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  o new collating 
13d00 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65  sequences to the
13d10 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a   database DB.**.
13d20 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69  **     utf16_ali
13d30 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31  gned.**     utf1
13d40 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a  6_unaligned.**.*
13d50 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67  * Both collating
13d60 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74   sequences use t
13d70 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64  he same sort ord
13d80 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a  er as BINARY..**
13d90 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72   The only differ
13da0 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65  ence is that the
13db0 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63   utf16_aligned c
13dc0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
13dd0 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64  ence is declared
13de0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
13df0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66  _UTF16_ALIGNED f
13e00 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  lag..** Both col
13e10 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
13e20 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75   increment the u
13e30 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63  naligned utf16 c
13e40 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76  ounter.** whenev
13e50 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74  er they see a st
13e60 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73  ring that begins
13e70 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20   on an odd byte 
13e80 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61  boundary..*/.sta
13e90 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65  tic int unaligne
13ea0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
13eb0 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74   = 0;.static int
13ec0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
13ed0 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nc(.  void *NotU
13ee0 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  sed,.  int nKey1
13ef0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
13f00 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
13f10 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
13f20 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
13f30 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
13f40 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
13f50 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65  nKey2;.  if( nKe
13f60 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53  y1>0 && 1==(1&(S
13f70 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
13f80 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c  (pKey1))) ) unal
13f90 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
13fa0 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b  nter++;.  if( nK
13fb0 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey2>0 && 1==(1&(
13fc0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
13fd0 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61  T(pKey2))) ) una
13fe0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
13ff0 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20  unter++;.  rc = 
14000 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b  memcmp(pKey1, pK
14010 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72  ey2, n);.  if( r
14020 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  c==0 ){.    rc =
14030 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
14040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14050 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  .}.static int ad
14060 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
14070 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76  _collations(.  v
14080 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14090 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
140a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
140b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
140c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
140d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
140e0 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20  if( objc>=2 ){. 
140f0 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
14100 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14110 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14120 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
14130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
14140 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14150 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
14160 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c  tf16_unaligned",
14170 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a   SQLITE_UTF16, .
14180 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
14190 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
141a0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
141b0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
141c0 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c  "utf16_aligned",
141d0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
141e0 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20  IGNED, .        
141f0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
14200 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Func);.  }.  ret
14210 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14220 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14230 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14240 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  UTF16) */../*.**
14250 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
14260 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74  _function <db pt
14270 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  r> <utf8> <utf16
14280 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a  le> <utf16be>.**
14290 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
142a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  n is used to tes
142b0 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65  t that SQLite se
142c0 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63  lects the correc
142d0 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69  t user.** functi
142e0 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  on callback when
142f0 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
14300 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
14310 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
14320 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
14330 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
14340 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
14350 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74  egisters up to t
14360 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66  hree versions of
14370 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
14380 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63  on.** "test_func
14390 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62  tion" with datab
143a0 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e  ase handle <db>.
143b0 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
143c0 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74  argument is.** t
143d0 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73  rue, then a vers
143e0 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63  ion of test_func
143f0 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  tion is register
14400 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66  ed for UTF-8, if
14410 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73   the.** third is
14420 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e   true, a version
14430 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66   is registered f
14440 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  or UTF-16le, if 
14450 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a  the fourth is.**
14460 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62   true, a UTF-16b
14470 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  e version is ava
14480 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75  ilable.  Previou
14490 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a  s versions of.**
144a0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61   test_function a
144b0 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
144c0 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74  * The user funct
144d0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
144e0 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ed by calling th
144f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20  e following TCL 
14500 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  script:.**.**   
14510 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c  "test_function <
14520 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a  enc> <arg>".**.*
14530 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73  * Where <enc> is
14540 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55   one of UTF-8, U
14550 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36  TF-16LE or UTF16
14560 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73  BE, and <arg> is
14570 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61   the.** single a
14580 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
14590 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69  o the SQL functi
145a0 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  on. The value re
145b0 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65  turned by.** the
145c0 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75   TCL script is u
145d0 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72  sed as the retur
145e0 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53  n value of the S
145f0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a  QL function. It.
14600 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ** is passed to 
14610 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46  SQLite using UTF
14620 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d  -16BE for a UTF-
14630 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28  8 test_function(
14640 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20  ), UTF-8.** for 
14650 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f  a UTF-16LE test_
14660 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20  function(), and 
14670 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20  UTF-16LE for an 
14680 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
14690 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55  hat.** prefers U
146a0 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e  TF-16BE..*/.#ifn
146b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
146c0 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69  UTF16.static voi
146d0 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
146e0 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f  utf8(.  sqlite3_
146f0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
14700 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
14710 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
14720 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
14730 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
14740 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
14750 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
14760 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
14770 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
14780 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
14790 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
147a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
147b0 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
147c0 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
147d0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
147e0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
147f0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
14800 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14810 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b  j("UTF-8", -1));
14820 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
14830 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14840 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
14850 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14860 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
14870 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
14880 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
14890 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
148a0 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
148b0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
148c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
148d0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63  lt_text(pCtx, Tc
148e0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
148f0 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53  t(interp), -1, S
14900 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14910 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
14920 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
14930 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
14940 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
14950 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
14960 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
14970 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
14980 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14990 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
149a0 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73  text16be(pCtx, s
149b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
149c0 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16be(pVal),.   
149d0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
149e0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
149f0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
14a00 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  l);.}.static voi
14a10 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  d test_function_
14a20 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74  utf16le(.  sqlit
14a30 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
14a40 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  , .  int nArg,. 
14a50 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
14a60 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49  *argv.){.  Tcl_I
14a70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
14a80 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20   Tcl_Obj *pX;.  
14a90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
14aa0 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  Val;.  interp = 
14ab0 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71  (Tcl_Interp *)sq
14ac0 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
14ad0 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63  pCtx);.  pX = Tc
14ae0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
14af0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
14b00 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
14b10 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
14b20 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
14b30 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
14b40 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  pX, Tcl_NewStrin
14b50 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
14b60 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
14b70 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14b80 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
14b90 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
14ba0 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
14bb0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
14bc0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
14bd0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
14be0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
14bf0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
14c00 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d  nt(pX);.  pVal =
14c10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14c20 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
14c30 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
14c40 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
14c50 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
14c60 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
14c70 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
14c80 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
14c90 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
14ca0 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
14cb0 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c  alue_text(pVal),
14cc0 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  -1,SQLITE_TRANSI
14cd0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
14ce0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
14cf0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  }.static void te
14d00 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
14d10 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  6be(.  sqlite3_c
14d20 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
14d30 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
14d40 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
14d50 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
14d60 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
14d70 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
14d80 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
14d90 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
14da0 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
14db0 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
14dc0 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
14dd0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
14de0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
14df0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
14e00 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
14e10 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14e20 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
14e30 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14e40 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29  ("UTF-16BE", -1)
14e50 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
14e60 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
14e70 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20  terp, pX, .     
14e80 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
14e90 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  j((char*)sqlite3
14ea0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
14eb0 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63  [0]), -1));.  Tc
14ec0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
14ed0 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  rp, pX, 0);.  Tc
14ee0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
14ef0 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  X);.  pVal = sql
14f00 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
14f10 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
14f20 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
14f30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73  Tcl_GetStringRes
14f40 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20  ult(interp), .  
14f50 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
14f60 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
14f70 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14f80 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73  t_text16(pCtx, s
14f90 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14fa0 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20  t16le(pVal),.   
14fb0 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52     -1, SQLITE_TR
14fc0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
14fd0 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
14fe0 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65  6be(pCtx, sqlite
14ff0 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65  3_value_text16le
15000 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31  (pVal),.      -1
15010 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
15020 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  NT);.  sqlite3_r
15030 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70  esult_text16le(p
15040 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
15050 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
15060 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
15070 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
15080 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
15090 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64  ee(pVal);.}.#end
150a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
150b0 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69  T_UTF16 */.stati
150c0 63 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74  c int test_funct
150d0 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ion(.  void * cl
150e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
150f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
15100 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
15110 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
15120 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
15130 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
15140 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
15150 20 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66    int val;..  if
15160 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
15170 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
15180 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
15190 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
151a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
151b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
151c0 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
151d0 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
151e0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
151f0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
15200 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
15210 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
15220 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
15230 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
15240 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
15250 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
15260 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  TF8, .        in
15270 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
15280 69 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b  ion_utf8, 0, 0);
15290 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
152a0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
152b0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
152c0 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20   objv[3], &val) 
152d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
152e0 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
152f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
15300 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
15310 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
15320 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
15330 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6LE, .        in
15340 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
15350 69 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20  ion_utf16le, 0, 
15360 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43  0);.  }.  if( TC
15370 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
15380 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
15390 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
153a0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
153b0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c  ERROR;.  if( val
153c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
153d0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
153e0 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69  db, "test_functi
153f0 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  on", 1, SQLITE_U
15400 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
15410 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75   interp, test_fu
15420 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20  nction_utf16be, 
15430 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  0, 0);.  }..  re
15440 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64  turn TCL_OK;.bad
15450 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
15460 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15470 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15480 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
15490 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
154a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
154b0 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
154c0 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
154d0 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
154e0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
154f0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
15500 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15510 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  R;.}../*.** Usag
15520 65 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  e:         sqlit
15530 65 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c  e3_test_errstr <
15540 65 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20  err code>.**.** 
15550 54 65 73 74 20 74 68 61 74 20 74 68 65 20 65 6e  Test that the en
15560 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73  glish language s
15570 74 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74  tring equivalent
15580 73 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72  s for sqlite err
15590 6f 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20  or codes.** are 
155a0 73 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65  sane. The parame
155b0 74 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ter is an intege
155c0 72 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61  r representing a
155d0 6e 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63  n sqlite error c
155e0 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  ode..** The resu
155f0 6c 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  lt is a list of 
15600 74 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68  two elements, th
15610 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
15620 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  ntation of the.*
15630 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  * error code and
15640 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
15650 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f  guage explanatio
15660 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
15670 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20   test_errstr(.  
15680 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15690 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
156a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
156b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
156c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
156d0 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20    char *zCode;. 
156e0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62   int i;.  if( ob
156f0 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
15700 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15710 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15720 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a  <error code>");.
15730 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54    }..  zCode = T
15740 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
15750 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[1]);.  for(i=0
15760 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20  ; i<200; i++){. 
15770 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
15780 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c  (t1ErrorName(i),
15790 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b   zCode) ) break;
157a0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65  .  }.  Tcl_SetRe
157b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
157c0 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53  ar *)sqlite3ErrS
157d0 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74  tr(i), 0);.  ret
157e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
157f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62  *.** Usage:    b
15800 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
15810 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69  This routine exi
15820 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70  sts for one purp
15830 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65  ose - to provide
15840 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20   a place to put 
15850 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20  a.** breakpoint 
15860 77 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61  with GDB that ca
15870 6e 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75  n be triggered u
15880 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20  sing TCL code.  
15890 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74  The use.** for t
158a0 68 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61  his is when a pa
158b0 72 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61  rticular test fa
158c0 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65  ils on (say) the
158d0 20 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f   1485th iteratio
158e0 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c  n..** In the TCL
158f0 20 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65   test script, we
15900 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69   can add code li
15910 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
15920 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d     if {$i==1485}
15930 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
15940 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66  * Then run testf
15950 69 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65  ixture in the de
15960 62 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20  bugger and wait 
15970 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69  for the breakpoi
15980 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20  nt to.** fire.  
15990 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  Then additional 
159a0 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20  breakpoints can 
159b0 62 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20  be set to trace 
159c0 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f  down the bug..*/
159d0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
159e0 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76  _breakpoint(.  v
159f0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
15a00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15a10 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
15a20 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
15a30 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
15a40 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
15a50 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
15a60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15a70 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
15a80 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
15a90 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
15aa0 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
15ab0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  */.){.  return T
15ac0 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  CL_OK;         /
15ad0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
15ae0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
15af0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a    sqlite3_bind_z
15b00 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44  eroblob  STMT ID
15b10 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  X N.**.** Test t
15b20 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
15b30 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61  zeroblob interfa
15b40 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15b50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15b60 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65  t..** IDX is the
15b70 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15b80 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15b90 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15ba0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15bb0 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20   binds a N-byte 
15bc0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42  zero-filled BLOB
15bd0 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
15be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15bf0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
15c00 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
15c10 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15c20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
15c30 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
15c40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
15c50 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
15c60 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
15c70 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b  nt idx;.  int n;
15c80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15c90 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
15ca0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15cb0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
15cc0 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29  v, "STMT IDX N")
15cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15ce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
15cf0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
15d00 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15d10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15d20 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
15d30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15d40 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15d50 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15d60 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
15d70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15d80 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
15d90 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15da0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20   objv[3], &n) ) 
15db0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15dc0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15dd0 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28  3_bind_zeroblob(
15de0 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a  pStmt, idx, n);.
15df0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15e00 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
15e10 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
15e20 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
15e30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15e50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15e60 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
15e70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15e80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15e90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
15ea0 62 6c 6f 62 36 34 20 20 53 54 4d 54 20 49 44 58  blob64  STMT IDX
15eb0 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
15ec0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  e sqlite3_bind_z
15ed0 65 72 6f 62 6c 6f 62 36 34 20 69 6e 74 65 72 66  eroblob64 interf
15ee0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
15ef0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
15f00 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68  nt..** IDX is th
15f10 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
15f20 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
15f30 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15f40 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
15f50 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65  * binds a N-byte
15f60 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f   zero-filled BLO
15f70 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  B to the wildcar
15f80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15f90 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
15fa0 6c 6f 62 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  lob64(.  void * 
15fb0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15fc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15fd0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15fe0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15ff0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16000 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16010 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c    int idx;.  Tcl
16020 5f 57 69 64 65 49 6e 74 20 6e 3b 0a 20 20 69 6e  _WideInt n;.  in
16030 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
16040 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
16050 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
16060 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
16070 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20  TMT IDX N");.   
16080 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16090 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
160a0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
160b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
160c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
160d0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
160e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
160f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16100 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16110 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16120 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16130 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
16140 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16150 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
16160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16170 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16180 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
16190 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
161a0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
161b0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
161c0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
161d0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
161e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
161f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16200 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16210 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
16220 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16230 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
16240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16250 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
16260 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
16270 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
16280 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41  d_int  STMT N VA
16290 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
162a0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
162b0 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20  int interface.  
162c0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
162d0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
162e0 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
162f0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
16300 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
16310 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
16320 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
16330 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
16340 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77   VALUE to that w
16350 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
16360 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16370 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
16380 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16390 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
163a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
163b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
163c0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
163d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
163e0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
163f0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16400 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
16410 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16420 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16430 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16440 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16450 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16460 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16470 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
16480 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
16490 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
164a0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
164b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
164c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
164d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
164e0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
164f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16500 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16510 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16520 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16540 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16550 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16560 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72  [3], &value) ) r
16570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16580 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16590 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c  _bind_int(pStmt,
165a0 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
165b0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
165c0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
165d0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
165e0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
165f0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
16600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16610 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16620 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16630 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
16640 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16650 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
16660 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
16670 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
16680 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
16690 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
166a0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
166b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
166c0 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
166d0 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
166e0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
166f0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
16700 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
16710 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
16720 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
16730 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
16740 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  int test_bind_in
16750 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
16760 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16770 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16780 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16790 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
167a0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
167b0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
167c0 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f 57  int idx;.  Tcl_W
167d0 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a 20 20  ideInt value;.  
167e0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
167f0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
16800 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16810 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
16820 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
16830 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
16840 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
16850 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
16860 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
16870 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
16880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16890 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
168a0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
168b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
168c0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
168d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
168f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
16900 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
16910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16920 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
16930 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
16940 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
16950 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
16960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
16970 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
16980 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64  _int64(pStmt, id
16990 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
169a0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
169b0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
169c0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
169d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
169e0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
169f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16a00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16a10 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16a20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
16a30 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
16a40 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
16a50 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
16a60 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
16a70 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
16a80 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
16a90 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
16aa0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
16ab0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
16ac0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
16ad0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
16ae0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
16af0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
16b00 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
16b10 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
16b20 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
16b30 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75  nt test_bind_dou
16b40 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ble(.  void * cl
16b50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16b60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16b70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
16b80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
16b90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
16ba0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
16bb0 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c  int idx;.  doubl
16bc0 65 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20 69  e value = 0;.  i
16bd0 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
16be0 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74  har *zVal;.  int
16bf0 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   i;.  static con
16c00 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
16c10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16c20 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e;     /* Name o
16c30 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c  f the special fl
16c40 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
16c50 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ue */.    unsign
16c60 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20  ed int iUpper;  
16c70 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69 74   /* Upper 32 bit
16c80 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65  s */.    unsigne
16c90 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20  d int iLower;   
16ca0 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73  /* Lower 32 bits
16cb0 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c   */.  } aSpecial
16cc0 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20  Fp[] = {.    {  
16cd0 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66  "NaN",      0x7f
16ce0 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
16cf0 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e  ff },.    {  "SN
16d00 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37 66  aN",     0x7ff7f
16d10 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
16d20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22  },.    {  "-NaN"
16d30 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66 66  ,     0xffffffff
16d40 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a  , 0xffffffff },.
16d50 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20      {  "-SNaN", 
16d60 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20 30     0xfff7ffff, 0
16d70 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
16d80 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20   {  "+Inf",     
16d90 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30 30  0x7ff00000, 0x00
16da0 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20  000000 },.    { 
16db0 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66   "-Inf",     0xf
16dc0 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff00000, 0x00000
16dd0 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45  000 },.    {  "E
16de0 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30  psilon",  0x0000
16df0 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 31  0000, 0x00000001
16e00 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73   },.    {  "-Eps
16e10 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30  ilon", 0x8000000
16e20 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c  0, 0x00000001 },
16e30 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20  .    {  "NaN0", 
16e40 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c 20      0x7ff80000, 
16e50 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
16e60 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20    {  "-NaN0",   
16e70 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78 30   0xfff80000, 0x0
16e80 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
16e90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
16ea0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16ec0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
16ed0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
16ee0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
16ef0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
16f00 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
16f10 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
16f20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16f30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
16f40 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
16f50 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
16f60 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
16f70 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
16f80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
16f90 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16fa0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
16fb0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
16fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  TCL_ERROR;..  /*
16fd0 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20 73   Intercept the s
16fe0 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20  tring "NaN" and 
16ff0 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76  generate a NaN v
17000 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a  alue for it..  *
17010 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69  * All other stri
17020 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20 74  ngs are passed t
17030 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65  hrough to Tcl_Ge
17040 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29  tDoubleFromObj()
17050 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f  ..  ** Tcl_GetDo
17060 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68  ubleFromObj() sh
17070 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20  ould understand 
17080 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76  "NaN" but some v
17090 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e  ersions.  ** con
170a0 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f  tain a bug..  */
170b0 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65  .  zVal = Tcl_Ge
170c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
170d0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
170e0 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
170f0 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61  )/sizeof(aSpecia
17100 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  lFp[0]); i++){. 
17110 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 53     if( strcmp(aS
17120 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d  pecialFp[i].zNam
17130 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20  e, zVal)==0 ){. 
17140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
17150 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d  t64 x;.      x =
17160 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69   aSpecialFp[i].i
17170 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c  Upper;.      x <
17180 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c  <= 32;.      x |
17190 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
171a0 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73  iLower;.      as
171b0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c  sert( sizeof(val
171c0 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20  ue)==8 );.      
171d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78  assert( sizeof(x
171e0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65  )==8 );.      me
171f0 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c  mcpy(&value, &x,
17200 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   8);.      break
17210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
17220 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65  ( i>=sizeof(aSpe
17230 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
17240 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26  SpecialFp[0]) &&
17250 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  .         Tcl_Ge
17260 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69  tDoubleFromObj(i
17270 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
17280 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72  &value) ){.    r
17290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
172a0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
172b0 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28  te3_bind_double(
172c0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
172d0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
172e0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
172f0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
17300 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
17310 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17330 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
17340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
17350 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17370 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17380 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a  null  STMT N.**.
17390 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
173a0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e  te3_bind_null in
173b0 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
173c0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
173d0 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
173e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
173f0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
17400 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17410 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
17420 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c  .** binds a NULL
17430 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
17440 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17450 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a  test_bind_null(.
17460 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17470 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17480 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17490 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
174a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
174b0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
174c0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
174d0 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  dx;.  int rc;.. 
174e0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
174f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17500 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
17510 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
17520 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
17530 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
17540 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
17550 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20   0), " STMT N", 
17560 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17580 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17590 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
175a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
175b0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
175c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
175d0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
175e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
175f0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
17600 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17610 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17620 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74  e3_bind_null(pSt
17630 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  mt, idx);.  if( 
17640 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17650 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17660 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17670 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17680 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17690 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
176a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
176b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
176c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
176d0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
176e0 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54  _bind_text  STMT
176f0 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a   N STRING BYTES.
17700 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
17710 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17720 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
17730 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
17740 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
17750 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
17760 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
17770 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
17780 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
17790 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
177a0 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49  TF-8 string STRI
177b0 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  NG to the wildca
177c0 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  rd.  The string 
177d0 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a  is BYTES bytes.*
177e0 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  * long..*/.stati
177f0 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
17800 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  text(.  void * c
17810 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17820 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17830 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17840 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17850 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17860 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
17870 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
17880 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
17890 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
178a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
178b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
178c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
178d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
178e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
178f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17900 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17910 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17920 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
17930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17950 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17960 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17970 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17980 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
179a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
179b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
179c0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
179d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
179e0 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72  .  value = (char
179f0 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
17a00 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ayFromObj(objv[3
17a10 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66  ], &bytes);.  if
17a20 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17a30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17a40 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [4], &bytes) ) r
17a50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17a60 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
17a70 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
17a80 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79  , idx, value, by
17a90 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  tes, SQLITE_TRAN
17aa0 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71  SIENT);.  if( sq
17ab0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17ac0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
17ad0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
17ae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17af0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
17b10 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17b20 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
17b30 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
17b40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
17b50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
17b60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
17b70 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
17b80 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20  te3_bind_text16 
17b90 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
17ba0 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
17bb0 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
17bc0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
17bd0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
17be0 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
17bf0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
17c00 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
17c10 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
17c20 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
17c30 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
17c40 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55  and.** binds a U
17c50 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52  TF-16 string STR
17c60 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
17c70 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
17c80 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
17c90 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
17ca0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
17cb0 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20  _text16(.  void 
17cc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17cd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17ce0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17cf0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17d00 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
17d10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
17d20 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
17d30 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
17d40 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
17d50 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
17d60 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
17d70 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
17d80 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53  d*) = (objc==6?S
17d90 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c  QLITE_STATIC:SQL
17da0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
17db0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74    Tcl_Obj *oStmt
17dc0 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d      = objv[objc-
17dd0 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  4];.  Tcl_Obj *o
17de0 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  N       = objv[o
17df0 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-3];.  Tcl_Ob
17e00 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62  j *oString  = ob
17e10 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63  jv[objc-2];.  Tc
17e20 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20  l_Obj *oBytes   
17e30 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a  = objv[objc-1];.
17e40 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
17e50 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20  & objc!=6){.    
17e60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17e70 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
17e80 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
17e90 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
17ea0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
17eb0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
17ec0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
17ed0 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
17ee0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17ef0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
17f00 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17f10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17f20 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74  g(oStmt), &pStmt
17f30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17f40 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17f50 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17f60 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20  terp, oN, &idx) 
17f70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17f80 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
17f90 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
17fa0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74  ArrayFromObj(oSt
17fb0 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  ring, 0);.  if( 
17fc0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
17fd0 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73  j(interp, oBytes
17fe0 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
17ff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18000 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
18010 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c  nd_text16(pStmt,
18020 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61   idx, (void *)va
18030 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c  lue, bytes, xDel
18040 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
18050 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
18060 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
18070 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
18080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18090 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
180a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
180b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
180c0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
180d0 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
180e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
180f0 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   }..#endif /* SQ
18100 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
18110 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
18120 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18130 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
18140 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63  nd_blob ?-static
18150 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  ? STMT N DATA BY
18160 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
18170 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
18180 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20  blob interface. 
18190 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
181a0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
181b0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
181c0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
181d0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
181e0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
181f0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
18200 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77   a BLOB to the w
18210 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c  ildcard.  The BL
18220 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74 65  OB is BYTES byte
18230 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
18240 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
18250 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  nd_blob(.  void 
18260 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18270 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18280 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18290 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
182a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
182b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
182c0 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
182d0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
182e0 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
182f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73  c;.  sqlite3_des
18300 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65  tructor_type xDe
18310 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54  structor = SQLIT
18320 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20  E_TRANSIENT;..  
18330 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
18340 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63  bjc!=6 ){.    Tc
18350 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18360 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18370 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18380 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
18390 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
183a0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
183b0 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54   STMT N DATA BYT
183c0 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
183d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
183e0 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d   }..  if( objc==
183f0 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75  6 ){.    xDestru
18400 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54  ctor = SQLITE_ST
18410 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b  ATIC;.    objv++
18420 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
18430 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18440 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18450 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
18460 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
18470 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
18480 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
18490 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
184a0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
184b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
184c0 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ue = Tcl_GetStri
184d0 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69  ng(objv[3]);.  i
184e0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
184f0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18500 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[4], &bytes) ) 
18510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18520 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
18530 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
18540 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
18550 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f  ytes, xDestructo
18560 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
18570 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
18580 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
18590 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
185a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
185b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
185c0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
185d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
185e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
185f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18600 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
18610 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20  parameter_count 
18620 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
18630 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18640 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68   wildcards in th
18650 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e  e given statemen
18660 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
18670 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
18680 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  eter_count(.  vo
18690 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
186a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
186b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
186c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
186d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
186e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
186f0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
18700 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
18710 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
18720 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
18730 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
18740 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18750 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
18760 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18770 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18780 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
18790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
187a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
187b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
187c0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
187d0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
187e0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
187f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18810 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
18820 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20  _parameter_name 
18830 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52   STMT  N.**.** R
18840 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
18850 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61  f the Nth wildca
18860 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20 77  rd.  The first w
18870 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a  ildcard is 1..**
18880 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   An empty string
18890 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
188a0 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  N is out of rang
188b0 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64  e or if the wild
188c0 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c  card.** is namel
188d0 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ess..*/.static i
188e0 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  nt test_bind_par
188f0 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76  ameter_name(.  v
18900 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18910 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18920 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18930 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18940 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18950 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18960 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Stmt;.  int i;..
18970 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
18980 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18990 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
189a0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29   objv, "STMT N")
189b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
189c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
189d0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
189e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
189f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18a00 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
18a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
18a20 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
18a30 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18a40 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75  v[2], &i) ) retu
18a50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18a60 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
18a70 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54  (interp, .     T
18a80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
18a90 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
18aa0 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d  ameter_name(pStm
18ab0 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20  t,i),-1).  );.  
18ac0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18ad0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
18ae0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
18af0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53  rameter_index  S
18b00 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  TMT  NAME.**.** 
18b10 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
18b20 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
18b30 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52   called NAME.  R
18b40 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72 65  eturn 0 if there
18b50 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77   is.** no such w
18b60 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
18b70 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
18b80 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
18b90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18ba0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18bb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18bc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18bd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18be0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
18bf0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
18c00 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
18c10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18c20 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
18c30 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b  v, "STMT NAME");
18c40 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
18c50 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
18c60 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18c70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18c80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18c90 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18ca0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
18cb0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18cc0 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
18cd0 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20  _NewIntObj(.    
18ce0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
18cf0 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
18d00 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72  pStmt,Tcl_GetStr
18d10 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20  ing(objv[2])).  
18d20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75     ).  );.  retu
18d30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
18d40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
18d50 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
18d60 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73  ngs STMT.**.*/.s
18d70 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
18d80 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20  lear_bindings(. 
18d90 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18da0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18db0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18dc0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18dd0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18de0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18df0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
18e00 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18e10 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
18e20 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
18e30 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
18e40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18e50 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
18e60 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18e70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18e80 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18e90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18ea0 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
18eb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18ec0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
18ed0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
18ee0 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  ngs(pStmt)));.  
18ef0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18f00 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
18f10 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d   sqlite3_sleep M
18f20 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73  ILLISECONDS.*/.s
18f30 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
18f40 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  leep(.  void * c
18f50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18f60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18f70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18f80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18f90 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73  jv[].){.  int ms
18fa0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18fb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18fc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18fd0 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   1, objv, "MILLI
18fe0 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72  SECONDS");.    r
18ff0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19000 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
19010 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19020 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d  erp, objv[1], &m
19030 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  s) ){.    return
19040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19050 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
19060 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19070 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
19080 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20  _sleep(ms)));.  
19090 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
190a0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
190b0 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
190c0 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a  errcode DB.**.**
190d0 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
190e0 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
190f0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
19100 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
19110 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  PI.** error code
19120 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45  . e.g. "SQLITE_E
19130 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  RROR"..*/.static
19140 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72   int test_ex_err
19150 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  code(.  void * c
19160 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19180 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19190 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
191a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
191b0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
191c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
191d0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
191e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
191f0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19200 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19210 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19220 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19230 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
19240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19250 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
19260 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
19270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19280 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
19290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
192a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
192b0 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64  tended_errcode(d
192c0 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  b);.  Tcl_Append
192d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
192e0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
192f0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
19300 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19310 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19320 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42  lite3_errcode DB
19330 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
19340 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
19350 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
19360 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
19370 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
19380 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
19390 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
193a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
193b0 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20  errcode(.  void 
193c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
193d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
193e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
193f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
19400 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
19410 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
19420 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19430 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
19440 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19450 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19460 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19470 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19480 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19490 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
194a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
194b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
194c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
194d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
194e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
194f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19500 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19510 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
19520 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19530 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
19540 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
19550 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
19560 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19570 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19580 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
19590 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
195a0 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
195b0 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
195c0 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
195d0 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
195e0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
195f0 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
19600 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
19610 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
19620 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19630 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19640 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
19650 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
19660 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
19670 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
19680 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
19690 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
196a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
196b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
196c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
196d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
196e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
196f0 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
19700 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19710 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19720 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19730 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19740 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19750 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19760 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
19770 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19780 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
19790 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
197a0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
197b0 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
197c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
197d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
197e0 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
197f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
19800 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
19810 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
19820 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
19830 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
19840 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
19850 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
19860 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
19870 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
19880 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
19890 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
198a0 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
198b0 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
198c0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
198d0 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
198e0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
198f0 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36  nt test_errmsg16
19900 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19910 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19920 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19930 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19940 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19950 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
19960 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
19970 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
19980 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b  onst void *zErr;
19990 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
199a0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20  ;.  int bytes = 
199b0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
199c0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
199d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
199e0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
199f0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19a00 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19a10 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19a20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
19a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19a40 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19a50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19a60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19a70 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19a80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19a90 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  ..  zErr = sqlit
19aa0 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b  e3_errmsg16(db);
19ab0 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
19ac0 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20     z = zErr;.   
19ad0 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b   for(bytes=0; z[
19ae0 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65  bytes] || z[byte
19af0 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b  s+1]; bytes+=2){
19b00 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  }.  }.  Tcl_SetO
19b10 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19b20 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
19b30 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73  yObj(zErr, bytes
19b40 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
19b50 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
19b60 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
19b70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19b80 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
19b90 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73  are DB sql bytes
19ba0 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
19bb0 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
19bc0 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
19bd0 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
19be0 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
19bf0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
19c00 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
19c10 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
19c20 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
19c30 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
19c40 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
19c50 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
19c60 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
19c70 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
19c80 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
19c90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
19ca0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
19cb0 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  repare(.  void *
19cc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19cd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19ce0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19cf0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19d00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
19d10 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
19d20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
19d30 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
19d40 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
19d50 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
19d60 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19d70 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
19d80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
19d90 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
19da0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
19db0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19dc0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19dd0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19de0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19df0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19e00 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
19e10 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
19e20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19e30 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19e40 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
19e50 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19e60 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
19e70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19e80 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
19e90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19ea0 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
19eb0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19ec0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19ed0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
19ee0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19f00 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  are(db, zSql, by
19f10 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
19f20 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
19f30 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  0);.  Tcl_ResetR
19f40 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
19f50 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19f60 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
19f70 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
19f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19f90 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e  ( zTail && objc>
19fa0 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79  =5 ){.    if( by
19fb0 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes>=0 ){.      
19fc0 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20  bytes = bytes - 
19fd0 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c  (int)(zTail-zSql
19fe0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
19ff0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61   (int)strlen(zTa
1a000 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20  il)<bytes ){.   
1a010 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29     bytes = (int)
1a020 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20  strlen(zTail);. 
1a030 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
1a040 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1a050 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
1a060 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
1a070 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
1a080 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1a090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a0a0 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
1a0b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1a0c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1a0d0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64  Buf), zBuf, "(%d
1a0e0 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
1a0f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a100 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
1a110 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1a120 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a130 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a140 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1a150 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1a160 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1a170 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1a180 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1a190 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
1a1a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a1b0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1a1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1a1d0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a1e0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1a1f0 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
1a200 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1a210 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1a220 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1a230 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1a240 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1a250 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1a260 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1a270 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1a280 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1a290 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1a2a0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1a2b0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1a2c0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1a2d0 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1a2e0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1a2f0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1a300 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a310 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
1a320 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a330 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a340 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a350 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a360 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a370 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a380 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a390 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Sql;.  char *zCo
1a3a0 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  py = 0;         
1a3b0 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63         /* malloc
1a3c0 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20  () copy of zSql 
1a3d0 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  */.  int bytes;.
1a3e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1a3f0 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1a400 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1a410 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1a420 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
1a430 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a440 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a450 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a460 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a470 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a480 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a490 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a4a0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a4b0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
1a4c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a4d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a4e0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a4f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a500 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a510 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a520 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1a530 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1a540 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
1a550 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a560 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a570 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1a580 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a590 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f 66  .  /* Instead of
1a5a0 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72 65   using zSql dire
1a5b0 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f 70  ctly, make a cop
1a5c0 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20  y into a buffer 
1a5d0 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64 69  obtained.  ** di
1a5e0 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c 6c  rectly from mall
1a5f0 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20 69  oc(). The idea i
1a600 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73  s to make it eas
1a610 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e 64  ier for valgrind
1a620 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62 75  .  ** to spot bu
1a630 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e 20  ffer overreads. 
1a640 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73 3e   */.  if( bytes>
1a650 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79 20  =0 ){.    zCopy 
1a660 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b  = malloc(bytes);
1a670 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70  .    memcpy(zCop
1a680 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29 3b  y, zSql, bytes);
1a690 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a6a0 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1a6b0 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20 20  n(zSql) + 1;.   
1a6c0 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28   zCopy = malloc(
1a6d0 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  n);.    memcpy(z
1a6e0 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b 0a  Copy, zSql, n);.
1a6f0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a700 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1a710 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c 20  , zCopy, bytes, 
1a720 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a730 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a740 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20   free(zCopy);.  
1a750 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a  zTail = &zSql[(z
1a760 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a  Tail - zCopy)];.
1a770 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1a780 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1a790 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  ==0);.  Tcl_Rese
1a7a0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1a7b0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a7c0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a7d0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1a7e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a7f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a800 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62  K && zTail && ob
1a810 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1a820 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1a830 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1a840 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1a850 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1a860 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1a870 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1a880 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
1a890 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
1a8a0 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
1a8b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a8c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1a8d0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1a8e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1a8f0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1a900 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1a910 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a920 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a930 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1a940 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1a950 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a960 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1a970 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1a980 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1a990 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1a9a0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1a9b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a9c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a9d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1a9e0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1a9f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1aa00 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1aa10 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
1aa20 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65  3134 DB.**.** Ge
1aa30 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65  nerate a prepare
1aa40 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  d statement for 
1aa50 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69  a zero-byte stri
1aa60 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20  ng as a test.** 
1aa70 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34  for ticket #3134
1aa80 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68  .  The string sh
1aa90 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65 64  ould be preceded
1aaa0 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
1aab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1aac0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
1aad0 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
1aae0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1aaf0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ab00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1ab10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1ab20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1ab30 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
1ab40 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
1ab50 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
1ab60 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
1ab70 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1ab80 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1ab90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1aba0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1abb0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1abc0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1abd0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1abe0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1abf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ac00 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1ac10 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
1ac20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1ac30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1ac40 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1ac50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1ac60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ac70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1ac80 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1ac90 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1aca0 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
1acb0 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
1acc0 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1acd0 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1ace0 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
1acf0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1ad00 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1ad10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ad20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ad30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1ad40 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1ad50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1ad60 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1ad70 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20  f), zBuf, "(%d) 
1ad80 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
1ad90 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ada0 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
1adb0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
1adc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1add0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1ade0 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1adf0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1ae00 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1ae10 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1ae20 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1ae30 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
1ae40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1ae50 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1ae60 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1ae70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1ae80 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1ae90 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74  are16 DB sql byt
1aea0 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a  es tailvar.**.**
1aeb0 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
1aec0 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
1aed0 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
1aee0 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
1aef0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1af00 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
1af10 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
1af20 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
1af30 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
1af40 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
1af50 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
1af60 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
1af70 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
1af80 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
1af90 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1afa0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
1afb0 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64  repare16(.  void
1afc0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1afd0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1afe0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1aff0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b000 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1b010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b020 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1b030 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1b040 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74  d *zSql;.  const
1b050 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30   void *zTail = 0
1b060 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61  ;.  Tcl_Obj *pTa
1b070 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
1b080 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1b090 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
1b0a0 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20  0]; .  int rc;. 
1b0b0 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20   int bytes;     
1b0c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b0d0 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66  e integer specif
1b0e0 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a  ied as arg 3 */.
1b0f0 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20    int objlen;   
1b100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b110 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65  he byte-array le
1b120 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f  ngth of arg 2 */
1b130 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1b140 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1b150 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b160 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b170 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b180 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1b190 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b1a0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1b1b0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1b1c0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1b1d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b1e0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1b1f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1b200 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b210 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1b220 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b230 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
1b240 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1b250 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
1b260 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1b270 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1b280 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
1b290 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1b2a0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
1b2b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1b2c0 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1b2d0 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1b2e0 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1b2f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b300 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1b310 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1b320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b330 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1b340 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b350 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
1b360 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
1b370 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
1b380 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
1b390 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c  int)((u8 *)zTail
1b3a0 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20  -(u8 *)zSql);.  
1b3b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
1b3c0 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  bjlen = 0;.    }
1b3d0 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c  .    pTail = Tcl
1b3e0 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1b3f0 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
1b400 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49  jlen);.    Tcl_I
1b410 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
1b420 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53  l);.    Tcl_ObjS
1b430 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1b440 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
1b450 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
1b460 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1b470 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  );.  }..  if( pS
1b480 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1b490 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b4a0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b4b0 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1b4c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b4d0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
1b4e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b4f0 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1b500 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b510 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1b520 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b530 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b540 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  e3_prepare16_v2 
1b550 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1b560 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
1b570 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
1b580 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
1b590 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
1b5a0 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
1b5b0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1b5c0 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
1b5d0 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
1b5e0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1b5f0 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
1b600 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
1b610 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
1b620 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
1b630 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
1b640 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
1b650 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1b660 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
1b670 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20  re16_v2(.  void 
1b680 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b690 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b6a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b6b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b6c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1b6d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1b6e0 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
1b6f0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
1b700 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20   *zSql;.  const 
1b710 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  void *zTail = 0;
1b720 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69  .  Tcl_Obj *pTai
1b730 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
1b740 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1b750 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1b760 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ]; .  int rc;.  
1b770 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20  int bytes;      
1b780 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b790 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69   integer specifi
1b7a0 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20  ed as arg 3 */. 
1b7b0 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20   int objlen;    
1b7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b7d0 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e  e byte-array len
1b7e0 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a  gth of arg 2 */.
1b7f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1b800 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1b810 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b820 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1b830 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b840 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1b850 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b860 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1b870 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1b880 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1b890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b8a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1b8b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b8c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1b8d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1b8e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1b8f0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
1b900 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1b910 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
1b920 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1b930 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1b940 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
1b950 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b960 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1b970 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
1b980 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  v2(db, zSql, byt
1b990 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63  es, &pStmt, objc
1b9a0 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30  >=5 ? &zTail : 0
1b9b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1b9c0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1b9d0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1b9e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b9f0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ba00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ba10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
1ba20 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
1ba30 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f  zTail ){.      o
1ba40 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d  bjlen = objlen -
1ba50 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61   (int)((u8 *)zTa
1ba60 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a  il-(u8 *)zSql);.
1ba70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ba80 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20   objlen = 0;.   
1ba90 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54   }.    pTail = T
1baa0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1bab0 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
1bac0 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c  objlen);.    Tcl
1bad0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
1bae0 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ail);.    Tcl_Ob
1baf0 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1bb00 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
1bb10 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  il, 0);.    Tcl_
1bb20 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  DecrRefCount(pTa
1bb30 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  il);.  }..  if( 
1bb40 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1bb50 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1bb60 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1bb70 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1bb80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bb90 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
1bba0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bbb0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1bbc0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1bbd0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1bbe0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bbf0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1bc00 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61  ite3_open filena
1bc10 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  me ?options-list
1bc20 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
1bc30 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69  test_open(.  voi
1bc40 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bc50 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bc60 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bc70 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1bc80 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1bc90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1bca0 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  name;.  sqlite3 
1bcb0 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  *db;.  char zBuf
1bcc0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
1bcd0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
1bce0 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
1bcf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1bd00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1bd10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1bd20 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1bd30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1bd40 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1bd50 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1bd60 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1bd70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bd80 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1bd90 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65   objc>1 ? Tcl_Ge
1bda0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bdb0 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   : 0;.  sqlite3_
1bdc0 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
1bdd0 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
1bde0 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1bdf0 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1be00 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1be10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1be20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1be30 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1be40 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1be50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1be60 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1be70 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c  n_v2 FILENAME FL
1be80 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69  AGS VFS.*/.stati
1be90 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f  c int test_open_
1bea0 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1beb0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1bec0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bed0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bee0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bef0 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1bf00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1bf10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1bf20 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1bf30 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
1bf40 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
1bf50 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1bf60 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54    int nFlag;.  T
1bf70 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b  cl_Obj **apFlag;
1bf80 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
1bf90 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1bfa0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1bfb0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1bfc0 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  , "FILENAME FLAG
1bfd0 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74  S VFS");.    ret
1bfe0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bff0 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
1c000 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c010 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20  bjv[1]);.  zVfs 
1c020 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1c030 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  objv[3]);.  if( 
1c040 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20  zVfs[0]==0x00 ) 
1c050 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20  zVfs = 0;..  rc 
1c060 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  = Tcl_ListObjGet
1c070 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
1c080 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67   objv[2], &nFlag
1c090 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66  , &apFlag);.  if
1c0a0 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
1c0b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28  eturn rc;.  for(
1c0c0 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b  i=0; i<nFlag; i+
1c0d0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61  +){.    int iFla
1c0e0 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70  g;.    struct Op
1c0f0 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63  enFlag {.      c
1c100 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67  onst char *zFlag
1c110 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
1c120 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20  ;.    } aFlag[] 
1c130 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c  = {.      { "SQL
1c140 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1c150 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y", SQLITE_OPEN_
1c160 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
1c170 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c180 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c  _READWRITE", SQL
1c190 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1c1a0 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  TE },.      { "S
1c1b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1c1c0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1c1d0 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
1c1e0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  { "SQLITE_OPEN_D
1c1f0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53  ELETEONCLOSE", S
1c200 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1c210 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20  EONCLOSE },.    
1c220 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c230 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c  _EXCLUSIVE", SQL
1c240 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1c250 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  VE },.      { "S
1c260 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1c270 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ROXY", SQLITE_OP
1c280 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a  EN_AUTOPROXY },.
1c290 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1c2a0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53  OPEN_MAIN_DB", S
1c2b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c2c0 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1c2d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1c2e0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1c2f0 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20  _TEMP_DB },.    
1c300 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c310 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20  _TRANSIENT_DB", 
1c320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1c330 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20  SIENT_DB },.    
1c340 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c350 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _MAIN_JOURNAL", 
1c360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1c370 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c380 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c390 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _TEMP_JOURNAL", 
1c3a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c3b0 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c3c0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c3d0 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  _SUBJOURNAL", SQ
1c3e0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1c3f0 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1c400 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  "SQLITE_OPEN_MAS
1c410 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  TER_JOURNAL", SQ
1c420 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1c430 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c440 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c450 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  _NOMUTEX", SQLIT
1c460 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d  E_OPEN_NOMUTEX }
1c470 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1c480 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1c490 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  ", SQLITE_OPEN_F
1c4a0 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20  ULLMUTEX },.    
1c4b0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c4c0 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20 53  _SHAREDCACHE", S
1c4d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
1c4e0 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
1c4f0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  { "SQLITE_OPEN_P
1c500 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53 51  RIVATECACHE", SQ
1c510 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1c520 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
1c530 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  { "SQLITE_OPEN_W
1c540 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1c550 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _WAL },.      { 
1c560 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  "SQLITE_OPEN_URI
1c570 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  ", SQLITE_OPEN_U
1c580 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c  RI },.      { 0,
1c590 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
1c5a0 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
1c5b0 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
1c5c0 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d  nterp, apFlag[i]
1c5d0 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28  , aFlag, sizeof(
1c5e0 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20  aFlag[0]), .    
1c5f0 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26      "flag", 0, &
1c600 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20  iFlag.    );.   
1c610 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1c620 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c630 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b   flags |= aFlag[
1c640 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d  iFlag].flag;.  }
1c650 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1c660 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61  _open_v2(zFilena
1c670 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
1c680 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  zVfs);.  if( sql
1c690 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1c6a0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1c6b0 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1c6c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1c6d0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c6e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1c6f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1c700 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c710 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
1c720 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
1c730 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
1c740 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
1c750 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c760 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c770 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c780 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1c790 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1c7a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c7b0 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
1c7c0 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
1c7d0 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1c7e0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1c7f0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1c800 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1c810 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c820 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c830 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c840 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c850 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c860 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
1c870 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
1c880 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c890 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
1c8a0 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42  ename = Tcl_GetB
1c8b0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1c8c0 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73  objv[1], 0);.  s
1c8d0 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46  qlite3_open16(zF
1c8e0 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1c8f0 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1c900 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1c910 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1c920 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1c930 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1c940 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c950 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1c960 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1c970 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1c980 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c990 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c9a0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20  ite3_complete16 
1c9b0 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a  <UTF-16 string>.
1c9c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1c9d0 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61  f the supplied a
1c9e0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d  rgument is a com
1c9f0 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
1ca00 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  ent, or zero.** 
1ca10 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1ca20 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1ca30 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64  mplete16(.  void
1ca40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1ca50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ca60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ca70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ca80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1ca90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1caa0 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26  OMIT_COMPLETE) &
1cab0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1cac0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20  E_OMIT_UTF16).  
1cad0 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
1cae0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1caf0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1cb00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1cb10 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
1cb20 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
1cb30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1cb40 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29    zBuf = (char*)
1cb50 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1cb60 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1cb70 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
1cb80 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1cb90 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1cba0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
1cbb0 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
1cbc0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1cbd0 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49  COMPLETE && SQLI
1cbe0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1cbf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cc00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cc10 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53  : sqlite3_step S
1cc20 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  TMT.**.** Advanc
1cc30 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1cc40 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
1cc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cc60 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64  est_step(.  void
1cc70 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1cc80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1cc90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1cca0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ccb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1ccc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ccd0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
1cce0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1ccf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1cd00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1cd10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1cd20 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1cd30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1cd40 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1cd50 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cd60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cd70 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1cd80 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1cd90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cda0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1cdb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cdc0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1cdd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
1cde0 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c    /* if( rc!=SQL
1cdf0 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d  ITE_DONE && rc!=
1ce00 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74  SQLITE_ROW ) ret
1ce10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a  urn TCL_ERROR; *
1ce20 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  /.  Tcl_SetResul
1ce30 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1ce40 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1ce50 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1ce60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1ce70 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a  c int test_sql(.
1ce80 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ce90 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1cea0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ceb0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1cec0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ced0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1cee0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1cef0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1cf00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1cf10 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1cf20 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1cf30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1cf40 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1cf50 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1cf60 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1cf70 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1cf80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1cf90 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
1cfa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1cfb0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71  har *)sqlite3_sq
1cfc0 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f  l(pStmt), TCL_VO
1cfd0 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
1cfe0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1cff0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d000 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53  3_column_count S
1d010 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1d020 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1d030 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1d040 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1d050 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1d060 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1d070 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76  olumn_count(.  v
1d080 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1d090 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1d0a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d0b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d0c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1d0d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d0e0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1d0f0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1d100 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d110 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d120 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d130 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d140 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d150 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1d160 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d170 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d180 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1d190 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1d1a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d1b0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1d1c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d1d0 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1d1e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d1f0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1d200 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
1d210 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1d220 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d230 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d240 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1d250 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  ** Return the ty
1d270 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  pe of the data i
1d280 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1d290 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1d2a0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1d2b0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1d2c0 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
1d2d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d2e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d2f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d300 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d310 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d320 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1d330 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1d340 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  tp;..  if( objc!
1d350 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d360 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d370 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d380 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d390 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d3a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d3b0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d3c0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d3d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d3e0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d3f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d400 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d410 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d430 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d440 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d450 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d460 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d470 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69  OR;..  tp = sqli
1d480 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
1d490 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73  pStmt, col);.  s
1d4a0 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20  witch( tp ){.   
1d4b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
1d4c0 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c  EGER: .      Tcl
1d4d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1d4e0 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43  p, "INTEGER", TC
1d4f0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1d500 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d510 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20  e SQLITE_NULL:. 
1d520 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1d530 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c  lt(interp, "NULL
1d540 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1d550 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d560 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
1d570 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  OAT:.      Tcl_S
1d580 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1d590 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54   "FLOAT", TCL_ST
1d5a0 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1d5b0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1d5c0 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20  LITE_TEXT:.     
1d5d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1d5e0 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54  nterp, "TEXT", T
1d5f0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1d600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1d610 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
1d620 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1d630 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f  ult(interp, "BLO
1d640 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  B", TCL_STATIC);
1d650 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1d660 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1d670 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
1d680 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1d690 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d6a0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d6b0 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c  n_int64 STMT col
1d6c0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1d6d0 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1d6e0 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1d6f0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1d700 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69  cast as an.** wi
1d710 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65  de (64-bit) inte
1d720 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1d730 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69  nt test_column_i
1d740 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
1d750 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d760 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d770 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d780 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d790 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d7a0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1d7b0 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20   int col;.  i64 
1d7c0 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  iVal;..  if( obj
1d7d0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1d7e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d7f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d800 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d810 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d820 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d830 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1d840 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d860 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1d870 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1d880 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d890 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1d8a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d8b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1d8c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1d8d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1d8e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d8f0 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20  RROR;..  iVal = 
1d900 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1d910 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29  nt64(pStmt, col)
1d920 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d930 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d940 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
1d950 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1d960 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d970 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d980 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54  column_blob STMT
1d990 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1d9a0 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1d9b0 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
1d9c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d9d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d9e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d9f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1da00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1da10 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1da20 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69  .  int col;..  i
1da30 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  nt len;.  const 
1da40 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20  void *pBlob;..  
1da50 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1da60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1da70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1da80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1da90 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1daa0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1dab0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1dac0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1dad0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dae0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1daf0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1db00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1db10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1db20 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1db30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1db40 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1db50 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1db60 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1db70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1db80 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  len = sqlite3_co
1db90 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1dba0 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  , col);.  pBlob 
1dbb0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1dbc0 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c  _blob(pStmt, col
1dbd0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1dbe0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1dbf0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1dc00 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a  j(pBlob, len));.
1dc10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1dc20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1dc30 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1dc40 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75  double STMT colu
1dc50 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1dc60 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1dc70 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1dc80 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1dc90 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e  ast as a double.
1dca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1dcb0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
1dcc0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1dcd0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1dce0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1dcf0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1dd00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1dd10 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1dd20 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1dd30 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20  t col;.  double 
1dd40 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  rVal;..  if( obj
1dd50 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1dd60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1dd70 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1dd80 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1dd90 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1dda0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1ddb0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1ddc0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ddd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1dde0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1ddf0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1de00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1de10 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1de20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1de30 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1de40 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1de50 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1de60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1de70 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20  RROR;..  rVal = 
1de80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1de90 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c  ouble(pStmt, col
1dea0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1deb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1dec0 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
1ded0 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1dee0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1def0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1df00 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20  data_count STMT 
1df10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1df20 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1df30 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
1df40 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
1df50 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
1df60 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f  c int test_data_
1df70 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1df80 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1df90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1dfa0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1dfb0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1dfc0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1dfd0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1dfe0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1dff0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e000 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e010 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e020 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e030 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e040 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1e050 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1e060 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e070 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e080 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1e090 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1e0a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1e0b0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1e0c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1e0d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1e0e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1e0f0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
1e100 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ata_count(pStmt)
1e110 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1e120 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e130 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e140 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
1e150 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1e160 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e170 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
1e180 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1e190 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1e1a0 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
1e1b0 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1e1c0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
1e1d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e1e0 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
1e1f0 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1e200 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1e210 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
1e220 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e230 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e240 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e250 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1e260 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e270 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1e280 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
1e290 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1e2a0 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73  t*, int);.  cons
1e2b0 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
1e2c0 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
1e2d0 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65  char *(*)(sqlite
1e2e0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
1e2f0 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1e300 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1e310 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e320 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e330 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e340 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1e350 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e360 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1e370 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1e380 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e390 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1e3a0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1e3b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e3c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1e3d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e3e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1e3f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1e400 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1e410 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1e420 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
1e430 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1e440 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
1e450 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1e460 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e470 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
1e480 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1e490 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1e4a0 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65  t test_global_re
1e4b0 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
1e4c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e4d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e4e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e4f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e500 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1e510 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1e520 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63  RECATED.  int rc
1e530 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1e540 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e550 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e560 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
1e570 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e580 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
1e590 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
1e5a0 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53  cover();.  Tcl_S
1e5b0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1e5c0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1e5d0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1e5e0 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ATIC);.#endif.  
1e5f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e600 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e610 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1e620 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1e630 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e640 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1e650 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1e660 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1e670 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1e680 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1e690 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e6a0 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f  stmt_utf16(.  vo
1e6b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e6c0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e6d0 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1e6e0 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1e6f0 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
1e700 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e710 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e720 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e730 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1e740 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1e750 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1e760 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1e770 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
1e780 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1e790 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74  zName16;.  const
1e7a0 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28   void *(*xFunc)(
1e7b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1e7c0 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1e7d0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29  (const void *(*)
1e7e0 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1e7f0 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1e800 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1e810 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e820 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e830 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e840 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e850 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e860 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1e870 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1e880 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e890 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e8a0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1e8b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1e8c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1e8d0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1e8e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1e8f0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1e900 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1e910 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1e920 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e930 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
1e940 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
1e950 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
1e960 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1e970 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1e980 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72  zName16;.    for
1e990 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b  (n=0; z[n] || z[
1e9a0 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20  n+1]; n+=2){}.  
1e9b0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
1e9c0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
1e9d0 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20  me16, n+2);.    
1e9e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1e9f0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
1ea00 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1ea10 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1ea20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  */..  return TCL
1ea30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ea40 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1ea50 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c  umn_int STMT col
1ea60 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1ea70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ea80 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d  bytes STMT colum
1ea90 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1eaa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1eab0 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d  tes16 STMT colum
1eac0 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n.**.*/.static i
1ead0 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  nt test_stmt_int
1eae0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1eaf0 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69  tData,    /* Poi
1eb00 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1eb10 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1eb20 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1eb30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1eb40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1eb50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1eb60 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1eb70 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1eb80 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
1eb90 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  t (*xFunc)(sqlit
1eba0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1ebb0 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20  .  xFunc = (int 
1ebc0 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1ebd0 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1ebe0 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1ebf0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1ec00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ec10 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1ec20 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1ec30 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1ec40 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1ec50 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1ec60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ec70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ec80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1ec90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1eca0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ecb0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1ecc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ecd0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1ece0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1ecf0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1ed00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ed10 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1ed20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1ed30 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75  cl_NewIntObj(xFu
1ed40 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29  nc(pStmt, col)))
1ed50 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ed60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ed70 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  e:  sqlite_set_m
1ed80 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d  agic  DB  MAGIC-
1ed90 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74  NUMBER.**.** Set
1eda0 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76   the db->magic v
1edb0 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75  alue.  This is u
1edc0 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f  sed to test erro
1edd0 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63  r recovery logic
1ede0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1edf0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1ee00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ee10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1ee20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1ee30 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1ee40 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1ee50 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1ee60 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1ee70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ee80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1ee90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1eea0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1eeb0 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49         " DB MAGI
1eec0 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  C", 0);.    retu
1eed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1eee0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1eef0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1ef00 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1ef10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ef20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1ef30 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1ef40 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a  IC_OPEN")==0 ){.
1ef50 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1ef60 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
1ef70 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
1ef80 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1ef90 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1efa0 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SED")==0 ){.    
1efb0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1efc0 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
1efd0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1efe0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1eff0 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22  LITE_MAGIC_BUSY"
1f000 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1f010 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1f020 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  AGIC_BUSY;.  }el
1f030 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1f040 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1f050 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20  AGIC_ERROR")==0 
1f060 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1f070 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1f080 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
1f090 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1f0a0 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28  terp, argv[2], (
1f0b0 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29  int*)&db->magic)
1f0c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1f0d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f0e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f0f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1f100 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1f110 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69  t  DB .**.** Tri
1f120 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70  gger an interrup
1f130 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  t on DB.*/.stati
1f140 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72  c int test_inter
1f150 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
1f160 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1f170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f180 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1f190 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1f1a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1f1b0 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1f1c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f1d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f1e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f1f0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1f200 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1f210 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f220 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f230 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f240 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f250 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f260 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
1f270 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
1f280 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f290 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69  .static u8 *sqli
1f2a0 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1f2b0 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ne = 0;../*.** F
1f2c0 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69  ill the stack wi
1f2d0 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61  th a known bitpa
1f2e0 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ttern..*/.static
1f2f0 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28   void prepStack(
1f300 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1f310 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35    u32 bigBuf[655
1f320 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  36];.  for(i=0; 
1f330 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29  i<sizeof(bigBuf)
1f340 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30  /sizeof(bigBuf[0
1f350 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b  ]); i++) bigBuf[
1f360 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b  i] = 0xdeadbeef;
1f370 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  .  sqlite3_stack
1f380 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a  _baseline = (u8*
1f390 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  )&bigBuf[65536];
1f3a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
1f3b0 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20  e current stack 
1f3c0 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72  depth.  Used for
1f3d0 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1f3e0 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53  .*/.u64 sqlite3S
1f3f0 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b  tackDepth(void){
1f400 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72  .  u8 x;.  retur
1f410 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f  n (u64)(sqlite3_
1f420 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d  stack_baseline -
1f430 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   &x);.}../*.** U
1f440 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
1f450 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c  tack_used DB SQL
1f460 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65  .**.** Try to me
1f470 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74  asure the amount
1f480 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20   of stack space 
1f490 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  used by a call t
1f4a0 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a  o sqlite3_exec.*
1f4b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1f4c0 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20  t_stack_used(.  
1f4d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f4e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f4f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1f500 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1f510 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1f520 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
1f530 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1f540 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1f550 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1f560 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1f570 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1f580 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1f590 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
1f5a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f5b0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f5c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f5d0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f5e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f5f0 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b  ;.  prepStack();
1f600 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
1f610 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
1f620 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66  ], 0, 0, 0);.  f
1f630 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30  or(i=65535; i>=0
1f640 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74   && ((u32*)sqlit
1f650 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1f660 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65  e)[-i]==0xdeadbe
1f670 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c  ef; i--){}.  Tcl
1f680 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f690 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1f6a0 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74  Obj(i*4));.  ret
1f6b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f6c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f6d0 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1f6e0 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e  on DB function-n
1f6f0 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1f700 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1f710 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  on 'function-nam
1f720 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
1f730 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a   handle DB. It.*
1f740 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  * is assumed tha
1f750 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  t the user funct
1f760 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20  ion was created 
1f770 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d  as UTF8, any num
1f780 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
1f790 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65  nts (the way the
1f7a0 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1f7b0 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1f7c0 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75  ic int delete_fu
1f7d0 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
1f7e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f7f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f800 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1f810 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1f820 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1f830 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1f840 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1f850 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f860 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f870 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f880 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1f890 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1f8a0 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1f8b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f8c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f8d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f8e0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1f8f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1f900 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1f910 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1f920 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
1f930 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
1f940 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  F8, 0, 0, 0, 0);
1f950 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1f960 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1f970 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1f980 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1f990 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f9a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f9b0 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
1f9c0 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61  llation DB colla
1f9d0 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1f9e0 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61  Delete the colla
1f9f0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63  tion sequence 'c
1fa00 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  ollation-name' f
1fa10 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1fa20 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69  dle .** DB. It i
1fa30 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1fa40 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1fa50 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65  uence was create
1fa60 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a  d as UTF8 (the .
1fa70 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  ** way the TCL i
1fa80 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1fa90 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1faa0 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f   delete_collatio
1fab0 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1fac0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1fad0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1fae0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1faf0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1fb00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1fb10 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1fb20 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1fb30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fb40 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fb50 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fb60 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1fb70 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
1fb80 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
1fb90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fba0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1fbb0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1fbc0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1fbd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fbe0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fbf0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1fc00 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53  n(db, argv[2], S
1fc10 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1fc20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1fc30 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1fc40 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1fc50 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1fc60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1fc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1fc80 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  : sqlite3_get_au
1fc90 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a  tocommit DB.**.*
1fca0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1fcb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
1fcc0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
1fcd0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
1fce0 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  e..** Return fal
1fcf0 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
1fd00 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74  atic int get_aut
1fd10 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20  ocommit(.  void 
1fd20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1fd30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fd40 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1fd50 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1fd60 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
1fd70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1fd80 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1fd90 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1fda0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1fdb0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1fdc0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1fdd0 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1fde0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1fdf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1fe00 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1fe10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1fe20 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1fe30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fe40 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1fe50 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
1fe60 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71  , zBuf, "%d", sq
1fe70 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
1fe80 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c  mmit(db));.  Tcl
1fe90 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1fea0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1feb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1fec0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1fed0 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1fee0 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a  meout DB MS.**.*
1fef0 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 74  * Set the busy t
1ff00 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73  imeout.  This is
1ff10 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e   more easily don
1ff20 65 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65  e using the time
1ff30 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  out.** method of
1ff40 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
1ff50 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ce.  But we need
1ff60 20 61 20 77 61 79 20 74 6f 20 74 65 73 74 20 74   a way to test t
1ff70 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65  he case.** where
1ff80 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1ff90 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74  TE_MISUSE..*/.st
1ffa0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75  atic int test_bu
1ffb0 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f  sy_timeout(.  vo
1ffc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ffd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ffe0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1fff0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
20000 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73  .){.  int rc, ms
20010 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
20020 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
20030 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20040 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20050 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20060 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
20070 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
20080 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
20090 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
200a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
200b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
200c0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
200d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
200e0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
200f0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
20100 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
20110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
20120 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f   = sqlite3_busy_
20130 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b  timeout(db, ms);
20140 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
20150 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
20160 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
20170 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
20180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20190 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62  age:  tcl_variab
201a0 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45  le_type VARIABLE
201b0 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
201c0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
201d0 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
201e0 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  sentation for th
201f0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
20200 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65  e given variable
20210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20220 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
20230 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
20240 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20250 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20260 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20270 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20280 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ].){.  Tcl_Obj *
20290 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63  pVar;.  if( objc
202a0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
202b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
202c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41  rp, 1, objv, "VA
202d0 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65  RIABLE");.    re
202e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
202f0 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c    }.  pVar = Tcl
20300 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
20310 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
20320 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43  (objv[1]), 0, TC
20330 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29  L_LEAVE_ERR_MSG)
20340 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20  ;.  if( pVar==0 
20350 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20360 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e  OR;.  if( pVar->
20370 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54  typePtr ){.    T
20380 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
20390 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
203a0 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74  tringObj(pVar->t
203b0 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31  ypePtr->name, -1
203c0 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
203d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
203e0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
203f0 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
20400 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d   ?N?.**.** Attem
20410 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  pt to release me
20420 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68  mory currently h
20430 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75  eld but not actu
20440 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a  ally required..*
20450 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20  * The integer N 
20460 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20470 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72   bytes we are tr
20480 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e  ying to release.
20490 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e    The .** return
204a0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d   value is the am
204b0 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ount of memory a
204c0 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64  ctually released
204d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
204e0 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  test_release_mem
204f0 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ory(.  void * cl
20500 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
20510 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20520 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20530 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20540 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e  v[].){.#if defin
20550 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
20560 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
20570 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  NT) && !defined(
20580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
20590 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69  IO).  int N;.  i
205a0 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62  nt amt;.  if( ob
205b0 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
205c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
205d0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
205e0 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29   1, objv, "?N?")
205f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20600 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20610 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
20620 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
20630 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
20640 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
20650 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d    }else{.    N =
20670 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d   -1;.  }.  amt =
20680 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
20690 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63  _memory(N);.  Tc
206a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
206b0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
206c0 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64  tObj(amt));.#end
206d0 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
206e0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
206f0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
20700 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
20710 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  DB.**.** Attempt
20720 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
20730 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
20740 64 20 62 79 20 64 61 74 61 62 61 73 65 20 44 42  d by database DB
20750 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
20760 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68   result code (wh
20770 69 63 68 20 69 6e 20 74 68 65 20 63 75 72 72 65  ich in the curre
20780 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
20790 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f  n is always zero
207a0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
207b0 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
207c0 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
207d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
207e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
207f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20800 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20810 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20820 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
20830 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rc;.  if( objc!=
20840 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
20850 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
20860 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
20870 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20880 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20890 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
208a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
208b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
208c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
208d0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
208e0 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
208f0 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20  e_memory(db);.  
20900 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
20910 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
20920 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
20930 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20940 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20950 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
20960 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  lush DB.**.** At
20970 74 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20 61  tempt to flush a
20980 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ny dirty pages t
20990 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
209a0 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 63 61  c int test_db_ca
209b0 63 68 65 66 6c 75 73 68 28 0a 20 20 76 6f 69 64  cheflush(.  void
209c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
209d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
209e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
209f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20a00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
20a10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
20a20 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
20a30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
20a40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
20a50 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
20a60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20a70 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
20a80 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
20a90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20aa0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20ab0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
20ac0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
20ad0 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
20ae0 66 6c 75 73 68 28 64 62 29 3b 0a 20 20 69 66 28  flush(db);.  if(
20af0 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
20b00 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20b10 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
20b20 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f  ErrStr(rc), TCL_
20b30 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
20b40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20b50 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52   }..  Tcl_ResetR
20b60 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
20b70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20b80 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20b90 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
20ba0 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a  name DB DBNAME.*
20bb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20bc0 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61  name of a file a
20bd0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
20be0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
20bf0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62  atic int test_db
20c00 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69  _filename(.  voi
20c10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20c20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20c30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20c40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20c50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20c60 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
20c70 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
20c80 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
20c90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
20ca0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
20cb0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
20cc0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
20cd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20ce0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
20cf0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
20d00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20d10 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
20d20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20d30 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
20d40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
20d50 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
20d60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
20d70 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
20d80 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28  (db, zDbName), (
20d90 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75  void*)0);.  retu
20da0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20db0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
20dc0 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
20dd0 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
20de0 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66  Return 1 or 0 if
20df0 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f   DBNAME is reado
20e00 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74  nly or not.  Ret
20e10 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45  urn -1 if DBNAME
20e20 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20e30 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
20e40 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e  t test_db_readon
20e50 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ly(.  void * cli
20e60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
20e70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
20e80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
20e90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
20ea0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
20eb0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
20ec0 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
20ed0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
20ee0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
20ef0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
20f00 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
20f10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
20f20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
20f30 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
20f40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
20f50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
20f60 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
20f70 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
20f80 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
20f90 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
20fa0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20fb0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
20fc0 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72  Obj(sqlite3_db_r
20fd0 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e  eadonly(db, zDbN
20fe0 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ame)));.  return
20ff0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21000 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
21010 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
21020 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72  t ?N?.**.** Quer
21030 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66  y or set the sof
21040 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72  t heap limit for
21050 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
21060 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d  ead.  The.** lim
21070 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  it is only chang
21080 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70  ed if the N is p
21090 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65  resent.  The pre
210a0 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69  vious limit.** i
210b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
210c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
210d0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a  oft_heap_limit(.
210e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
210f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21100 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21110 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
21120 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
21130 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
21140 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64  4 amt;.  Tcl_Wid
21150 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69  eInt N = -1;.  i
21160 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
21170 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
21180 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
21190 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
211a0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
211b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
211c0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
211d0 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
211e0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
211f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
21200 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
21210 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
21220 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66  mt = sqlite3_sof
21230 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
21240 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
21250 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
21260 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
21270 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  amt));.  return 
21280 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21290 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
212a0 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
212b0 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
212c0 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
212d0 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73  leanup API..*/.s
212e0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
212f0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20  hread_cleanup(. 
21300 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21310 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21320 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21330 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21340 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21350 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21360 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
21370 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
21380 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64  _cleanup();.#end
21390 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
213a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
213b0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61  ge:   sqlite3_pa
213c0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44  ger_refcounts  D
213d0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  B.**.** Return a
213e0 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
213f0 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 50   which are the P
21400 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72  agerRefcount for
21410 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f   all.** pagers o
21420 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
21430 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
21440 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
21450 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
21460 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
21470 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21480 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21490 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
214a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
214b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
214c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
214d0 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
214e0 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
214f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21500 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
21510 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
21520 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
21530 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
21540 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
21550 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
21560 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
21570 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21580 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
21590 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
215a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
215b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
215c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
215d0 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
215e0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
215f0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
21600 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
21610 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
21620 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
21630 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
21640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
21650 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
21660 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
21670 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
21680 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
21690 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
216a0 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
216b0 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
216c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
216d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
216e0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
216f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
21700 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
21710 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
21720 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
21730 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
21740 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
21750 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
21760 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
21770 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
21780 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
21790 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
217a0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
217b0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
217c0 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
217d0 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
217e0 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
217f0 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
21800 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
21810 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
21820 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
21830 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
21840 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
21850 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
21860 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
21870 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
21880 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
21890 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
218a0 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
218b0 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
218c0 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
218d0 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
218e0 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
218f0 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
21900 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
21910 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
21920 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
21930 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
21940 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
21950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f  */.static int wo
21960 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
21970 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
21980 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
21990 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
219a0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
219b0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
219c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
219d0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
219e0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
219f0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21a00 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21a20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21a30 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21a40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
21a50 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
21a60 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
21a70 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
21a80 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
21a90 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
21aa0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
21ab0 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
21ac0 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
21ad0 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
21ae0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
21af0 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
21b00 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
21b10 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
21b20 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
21b30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
21b40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
21b50 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
21b60 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
21b70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
21b80 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
21b90 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
21ba0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
21bb0 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
21bc0 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
21bd0 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
21be0 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
21bf0 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
21c00 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
21c10 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
21c20 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
21c30 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
21c40 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
21c50 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
21c60 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
21c70 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
21c80 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
21c90 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
21ca0 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b  c int vfs_unlink
21cb0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
21cc0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21cd0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21ce0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21cf0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21d00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21d10 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21d20 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21d30 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21d40 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21d50 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21d60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21d70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21d80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21d90 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21da0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21db0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
21dc0 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a  te3_vfs *pMain;.
21dd0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61    sqlite3_vfs *a
21de0 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69  pVfs[20];.  sqli
21df0 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f  te3_vfs one, two
21e00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
21e10 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20  _unregister(0); 
21e20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
21e30 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c  of NULL is harml
21e40 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61  ess */.  one.zNa
21e50 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20  me = "__one";.  
21e60 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74  two.zName = "__t
21e70 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  wo";..  /* Calli
21e80 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  ng sqlite3_vfs_r
21e90 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e 64  egister with 2nd
21ea0 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64   argument of 0 d
21eb0 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61  oes not.  ** cha
21ec0 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
21ed0 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e  VFS.  */.  pMain
21ee0 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
21ef0 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  ind(0);.  sqlite
21f00 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
21f10 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  one, 0);.  asser
21f20 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70  t( pMain==0 || p
21f30 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66  Main==sqlite3_vf
21f40 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73  s_find(0) );.  s
21f50 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21f60 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20  ter(&two, 0);.  
21f70 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
21f80 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
21f90 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
21fa0 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66  ;..  /* We can f
21fb0 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74 73  ind a VFS by its
21fc0 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72   name */.  asser
21fd0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21fe0 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
21ff0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
22000 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22010 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
22020 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  );..  /* Calling
22030 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69   sqlite_vfs_regi
22040 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ster with non-ze
22050 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  ro second parame
22060 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a  ter changes the.
22070 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53    ** default VFS
22080 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73  , even if the 1s
22090 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
220a0 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74 68  n existig VFS th
220b0 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69  at is.  ** previ
220c0 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
220d0 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61   as the non-defa
220e0 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ult..  */.  sqli
220f0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
22100 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73  (&one, 1);.  ass
22110 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
22120 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
22130 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
22140 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
22150 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
22160 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
22170 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
22180 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71  0)==&one );.  sq
22190 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
221a0 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61  er(&two, 1);.  a
221b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
221c0 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
221d0 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
221e0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
221f0 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
22200 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
22210 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
22220 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  d(0)==&two );.  
22230 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20  if( pMain ){.   
22240 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
22250 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b  ister(pMain, 1);
22260 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
22270 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
22280 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
22290 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
222a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
222b0 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
222c0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
222d0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
222e0 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a  pMain );.  }.  .
222f0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
22300 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65  default VFS.  Re
22310 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65  peat until there
22320 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53   are no more VFS
22330 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  es.  ** register
22340 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
22350 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56  =0; i<sizeof(apV
22360 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73  fs)/sizeof(apVfs
22370 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
22380 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
22390 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
223a0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
223b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
223c0 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
223d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
223e0 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
223f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
22400 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
22410 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  Vfs[i]);.      a
22420 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
22430 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
22440 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
22450 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22460 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
22470 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a  s_find(0) );.  .
22480 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
22490 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f  e main VFS as no
224a0 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20  n-default (will 
224b0 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c  be made default,
224c0 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c   since.  ** it'l
224d0 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e  l be the only on
224e0 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e  e in existence).
224f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
22500 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
22510 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  in, 0);.  assert
22520 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
22530 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
22540 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73    .  /* Un-regis
22550 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
22560 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72   again to restor
22570 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c  e an empty VFS l
22580 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
22590 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
225a0 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74  pMain);.  assert
225b0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
225c0 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f  _find(0) );..  /
225d0 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53  * Relink all VFS
225e0 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
225f0 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28  der. */  .  for(
22600 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i=sizeof(apVfs)/
22610 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
22620 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
22630 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
22640 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22650 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61  3_vfs_register(a
22660 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20  pVfs[i], 1);.   
22670 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
22680 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
22690 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20  _find(0) );.    
226a0 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
226b0 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
226c0 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
226d0 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Name) );.    }. 
226e0 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73   }..  /* Unregis
226f0 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56  ter out sample V
22700 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  FSes. */.  sqlit
22710 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
22720 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
22730 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
22740 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55  r(&two);..  /* U
22750 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 56  nregistering a V
22760 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63  FS that is not c
22770 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65  urrently registe
22780 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20  red is harmless 
22790 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
227a0 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65  _unregister(&one
227b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
227c0 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f  _unregister(&two
227d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
227e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
227f0 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61  _one")==0 );.  a
22800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
22810 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
22820 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  ==0 );..  /* We 
22830 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77  should be left w
22840 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ith the original
22850 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61 63   default VFS bac
22860 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72  k as the.  ** or
22870 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65  iginal */.  asse
22880 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
22890 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
228a0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
228b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
228c0 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66  cmd:   vfs_initf
228d0 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54  ail_test.**.** T
228e0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
228f0 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f  attempts to vfs_
22900 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67  find and vfs_reg
22910 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  ister when the.*
22920 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
22930 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65  lize() interface
22940 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c   is failing.  Al
22950 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66  l calls should f
22960 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ail..*/.static i
22970 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  nt vfs_initfail_
22980 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22990 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
229a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
229b0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
229c0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
229d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
229e0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
229f0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22a00 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22a10 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22a20 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22a30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22a40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22a50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22a60 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22a70 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22a80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
22a90 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  e;.  one.zName =
22aa0 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28   "__one";..  if(
22ab0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
22ac0 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
22ad0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
22ae0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
22af0 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  &one, 0);.  if( 
22b00 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22b10 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
22b20 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
22b30 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
22b40 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  one, 1);.  if( s
22b50 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
22b60 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
22b70 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
22b80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22b90 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a   Saved VFSes.*/.
22ba0 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
22bb0 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73  fs *apVfs[20];.s
22bc0 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d  tatic int nVfs =
22bd0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   0;../*.** tclcm
22be0 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73  d:   vfs_unregis
22bf0 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e  ter_all.**.** Un
22c00 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  register all VFS
22c10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
22c20 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  t vfs_unregister
22c30 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
22c40 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22c50 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22c60 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22c70 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22c80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22c90 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
22ca0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22cb0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22cc0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22cd0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22ce0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22cf0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22d00 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22d10 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22d20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22d30 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
22d40 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
22d50 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  apVfs); i++){.  
22d60 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
22d70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
22d80 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
22d90 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i]==0 ) break;. 
22da0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
22db0 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
22dc0 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20  i]);.  }.  nVfs 
22dd0 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = i;.  return TC
22de0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
22df0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65  lcmd:   vfs_rere
22e00 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
22e10 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53   Restore all VFS
22e20 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65 6d  es that were rem
22e30 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75  oved using vfs_u
22e40 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f  nregister_all.*/
22e50 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
22e60 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  reregister_all(.
22e70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22e80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
22e90 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
22ea0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
22eb0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
22ec0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
22ed0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
22ee0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
22ef0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22f00 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22f20 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22f30 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22f40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22f50 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22f60 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22f70 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
22f80 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVfs; i++){.    
22f90 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
22fa0 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69  ster(apVfs[i], i
22fb0 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
22fc0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
22fd0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
22fe0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
22ff0 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
23000 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
23010 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
23020 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
23030 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
23040 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
23050 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
23060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23070 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
23080 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23090 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
230a0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
230b0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
230c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
230d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
230e0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
230f0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23100 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23110 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
23130 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
23140 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
23150 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23160 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23170 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
23180 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73  nt iArg = 0;.  s
23190 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
231a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
231b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
231c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
231d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
231e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
231f0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
23200 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23210 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
23220 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
23230 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23240 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23250 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23260 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23270 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
23280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
232a0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c  e_control(db, 0,
232b0 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73   0, &iArg);.  as
232c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
232d0 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72  _NOTFOUND );.  r
232e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
232f0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
23300 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
23310 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
23320 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
23330 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
23340 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
23350 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
23360 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
23370 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
23380 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
23390 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
233a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
233b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
233c0 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
233d0 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
233e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
233f0 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
23400 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75  ERROR );..  retu
23410 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
23420 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
23430 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
23440 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a  errno_test DB.**
23450 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
23460 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
23470 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23480 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
23490 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
234a0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
234b0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53  f the SQLITE_LAS
234c0 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f  T_ERRNO verb..*/
234d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
234e0 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
234f0 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
23500 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23510 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
23520 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
23530 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
23540 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23550 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
23560 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
23570 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
23580 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
23590 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
235a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
235b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
235c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
235d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
235e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
235f0 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
23600 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
23610 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
23620 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
23630 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23640 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
23650 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
23660 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
23670 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
23680 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
23690 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
236a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
236b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
236c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
236d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
236e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
236f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
23700 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
23710 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23720 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
23730 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
23740 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
23750 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
23760 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23770 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23780 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
23790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
237a0 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
237b0 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
237c0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
237d0 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
237e0 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
237f0 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
23800 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
23810 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23820 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
23830 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
23840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23850 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
23860 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
23870 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
23880 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63    file_control_c
23890 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42  hunksize_test DB
238a0 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a   DBNAME SIZE.**.
238b0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
238c0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
238d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
238e0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
238f0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
23900 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
23910 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
23920 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
23930 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
23940 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
23950 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
23960 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
23970 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a  chunksize_test(.
23980 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23990 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
239a0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
239b0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
239c0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
239d0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
239e0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
239f0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
23a00 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
23a10 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
23a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23a30 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
23a40 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
23a50 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
23a60 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
23a70 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
23a80 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
23a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23aa0 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f  ew chunk 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 49 6e 74     || Tcl_GetInt
23c20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
23c30 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29  objv[3], &nSize)
23c40 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  .  ){.   return 
23c50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
23c60 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
23c70 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
23c80 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30   if( zDb[0]=='\0
23c90 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a  ' ) zDb = NULL;.
23ca0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
23cb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
23cc0 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e   zDb, SQLITE_FCN
23cd0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28  TL_CHUNK_SIZE, (
23ce0 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
23cf0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23d00 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
23d10 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
23d20 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
23d30 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
23d40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23d50 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
23d60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
23d70 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
23d80 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
23d90 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d  nt_test DB DBNAM
23da0 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69  E SIZE.**.** Thi
23db0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
23dc0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
23dd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
23de0 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20 53  rface .** with S
23df0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
23e00 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20  _HINT.*/.static 
23e10 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
23e20 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a  _sizehint_test(.
23e30 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23e40 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23e50 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23e60 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23e70 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23e80 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23e90 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
23ea0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
23eb0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
23ec0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23ee0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
23ef0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
23f00 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
23f10 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
23f20 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
23f30 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b 20 20  WideInt nSize;  
23f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
23f50 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20  inted size */.  
23f60 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
23f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f80 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69  /* Db name ("mai
23f90 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
23fa0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
23fb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23fc0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
23fd0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
23fe0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
23ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24000 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20   file_control() 
24010 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  return code */..
24020 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
24030 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
24040 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
24050 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
24060 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65  E SIZE");.    re
24070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24080 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
24090 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
240a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
240b0 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20  v[1]), &db) .   
240c0 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  || Tcl_GetWideIn
240d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
240e0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
240f0 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
24100 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24110 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
24120 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24130 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
24140 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
24150 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
24160 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
24170 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
24180 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28  NTL_SIZE_HINT, (
24190 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a  void *)&nSize);.
241a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
241b0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
241c0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
241d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
241e0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
241f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24200 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
24210 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
24220 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
24230 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
24240 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57 44 0a  oxy_test DB PWD.
24250 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
24260 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
24270 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24280 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
24290 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
242a0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
242b0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47   of the SQLITE_G
242c0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
242d0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   and.** SQLITE_S
242e0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
242f0 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69   verbs..*/.stati
24300 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
24310 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
24320 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
24330 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
24340 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
24350 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
24360 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
24370 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
24380 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
24390 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
243a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
243b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
243c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
243d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
243e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
243f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
24400 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
24410 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
24420 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20  qlite3 *db;.  . 
24430 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
24440 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24450 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
24460 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
24470 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
244a0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
244b0 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30 29 3b  , " DB PWD", 0);
244c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
244d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
244e0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
244f0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24500 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24510 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20  b) ){.   return 
24520 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24530 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
24540 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
24550 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20 69  KING_STYLE).#  i
24560 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
24570 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e 65  E__).#    define
24580 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
24590 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23  OCKING_STYLE 1.#
245a0 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69    else.#    defi
245b0 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
245c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30  _LOCKING_STYLE 0
245d0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
245e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
245f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24600 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
24610 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63  PLE__).  {.    c
24620 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a 20  har *testPath;. 
24630 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69     int rc;.    i
24640 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e  nt nPwd;.    con
24650 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20  st char *zPwd;. 
24660 20 20 20 63 68 61 72 20 70 72 6f 78 79 50 61 74     char proxyPat
24670 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20  h[400];.    .   
24680 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74 53   zPwd = Tcl_GetS
24690 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
246a0 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20  v[2], &nPwd);.  
246b0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72 6f    if( sizeof(pro
246c0 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30 20  xyPath)<nPwd+20 
246d0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
246e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
246f0 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22 2c  , "PWD too big",
24700 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20   (void*)0);.    
24710 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24720 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OR;.    }.    sq
24730 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
24740 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29  izeof(proxyPath)
24750 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 22 25 73  , proxyPath, "%s
24760 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50  /test.proxy", zP
24770 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  wd);.    rc = sq
24780 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24790 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
247a0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
247b0 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
247c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
247d0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
247e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
247f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
24800 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  )); .      retur
24810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
24820 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
24830 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24840 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24850 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
24860 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b  ILE, &testPath);
24870 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
24880 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50  (proxyPath,testP
24890 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20  ath,11) ){.     
248a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
248b0 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20  t(interp, "Lock 
248c0 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e  proxy file did n
248d0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20  ot match the ". 
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
24900 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e  reviously assign
24910 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  ed value", 0);. 
24920 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
24930 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
24940 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24950 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
24960 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
24970 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
24980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24990 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
249a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
249b0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
249c0 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
249d0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
249e0 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
249f0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
24a00 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24a10 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
24a20 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
24a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24a40 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
24a50 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
24a60 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53 51  _OK;  .}..#if SQ
24a70 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
24a80 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24a90 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
24aa0 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45 54  v_retry DB  NRET
24ab0 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20  RY  DELAY.**.** 
24ac0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
24ad0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
24ae0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
24af0 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
24b00 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
24b10 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
24b20 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
24b30 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24b40 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
24b50 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ry(.  ClientData
24b60 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24b70 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24b80 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24b90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24ba0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24bb0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24bc0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24bd0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24be0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24bf0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24c00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24c10 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24c20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24c30 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24c40 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24c50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24c60 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32  nt rc;.  int a[2
24c70 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  ];.  char z[100]
24c80 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
24c90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
24ca0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24cb0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
24cc0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
24cd0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
24ce0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
24cf0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52  [0], 0), " DB NR
24d00 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b  ETRY DELAY", 0);
24d10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24d20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24d30 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24d40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24d50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24d60 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
24d70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24d80 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
24d90 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
24da0 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20  objv[2], &a[0]) 
24db0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
24dc0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
24dd0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
24de0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b  rp, objv[3], &a[
24df0 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  1]) ) return TCL
24e00 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
24e10 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24e20 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24e30 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
24e40 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64  _AV_RETRY, (void
24e50 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *)a);.  sqlite3_
24e60 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
24e70 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64  z), z, "%d %d %d
24e80 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31  ", rc, a[0], a[1
24e90 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
24ea0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24eb0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
24ec0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
24ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
24ee0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24ef0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
24f00 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a   DB HANDLE.**.**
24f10 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24f20 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
24f30 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
24f40 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
24f50 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
24f60 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e  TL_WIN32_SET_HAN
24f70 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  DLE opcode..*/.s
24f80 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
24f90 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
24fa0 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e  _handle(.  Clien
24fb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
24fc0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24fd0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24fe0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24ff0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25000 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25010 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25020 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25030 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25040 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25060 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25070 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25080 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25090 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
250a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
250b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41  ;.  int rc;.  HA
250c0 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c  NDLE hFile = NUL
250d0 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  L;.  char z[100]
250e0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
250f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
25100 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25110 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
25120 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
25130 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
25140 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
25150 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48 41  [0], 0), " DB HA
25160 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NDLE", 0);.    r
25170 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25180 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25190 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
251a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
251b0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
251c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
251d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
251e0 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28 69  getWin32Handle(i
251f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
25200 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
25210 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  hFile) ){.    re
25220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25230 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
25240 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
25250 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
25260 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
25270 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20  _HANDLE,.       
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25290 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69       (void*)&hFi
252a0 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  le);.  sqlite3_s
252b0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
252c0 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72  ), z, "%d %p", r
252d0 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29  c, (void*)hFile)
252e0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
252f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
25300 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
25310 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
25320 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
25330 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
25340 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
25350 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47   DB PERSIST-FLAG
25360 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
25370 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
25380 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
25390 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
253a0 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
253b0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
253c0 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  _WAL opcode..*/.
253d0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
253e0 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
253f0 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  wal(.  ClientDat
25400 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25410 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25420 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25430 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25440 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25450 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25460 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25470 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25480 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25490 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
254a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
254b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
254c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
254d0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
254e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
254f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
25500 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50  int rc;.  int bP
25510 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a  ersist;.  char z
25520 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
25530 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
25540 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
25550 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
25560 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
25570 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
25580 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
25590 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
255a0 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
255b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
255c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
255d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
255e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
255f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25600 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
25610 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
25620 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
25630 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
25640 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29  v[2], &bPersist)
25650 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
25660 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
25670 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25680 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
25690 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
256a0 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65  WAL, (void*)&bPe
256b0 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  rsist);.  sqlite
256c0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
256d0 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
256e0 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b  , rc, bPersist);
256f0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
25700 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
25710 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
25720 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
25730 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
25740 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
25750 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
25760 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a   DB PSOW-FLAG.**
25770 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
25780 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
25790 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
257a0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
257b0 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
257c0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
257d0 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65  OVERWRITE opcode
257e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
257f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
25800 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
25810 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25820 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25830 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25840 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25850 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25860 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25870 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25880 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25890 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
258a0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
258c0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
258d0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
258e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
258f0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25900 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25910 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
25920 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20   rc;.  int b;.  
25930 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
25940 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
25950 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25960 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
25970 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
25980 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
25990 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
259a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
259b0 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20  0), " DB FLAG", 
259c0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
259d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
259e0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
259f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
25a00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
25a10 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
25a20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25a30 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
25a40 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
25a50 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20  p, objv[2], &b) 
25a60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25a70 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
25a80 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
25a90 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46  db,NULL,SQLITE_F
25aa0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
25ab0 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29  VERWRITE,(void*)
25ac0 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  &b);.  sqlite3_s
25ad0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
25ae0 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72  ), z, "%d %d", r
25af0 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  c, b);.  Tcl_App
25b00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
25b10 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
25b20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25b30 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
25b40 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
25b50 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f  rol_vfsname DB ?
25b60 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74  AUXDB?.**.** Ret
25b70 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
25b80 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
25b90 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a  stack of VFSes..
25ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
25bb0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
25bc0 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  me(.  ClientData
25bd0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25be0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
25bf0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
25c00 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
25c10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
25c20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25c30 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25c40 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
25c50 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
25c60 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
25c70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25c80 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25c90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25ca0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25cb0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25cc0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
25cd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
25ce0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63  me = "main";.  c
25cf0 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20  har *zVfsName = 
25d00 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
25d10 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
25d20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25d30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25d40 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
25d50 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
25d60 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
25d70 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
25d80 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
25d90 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
25da0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25db0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
25dc0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
25dd0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25de0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
25df0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25e00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
25e10 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
25e20 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
25e30 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
25e40 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
25e50 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
25e60 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
25e70 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64  TL_VFSNAME,(void
25e80 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  *)&zVfsName);.  
25e90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25ea0 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d  (interp, zVfsNam
25eb0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
25ec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66  sqlite3_free(zVf
25ed0 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  sName);.  return
25ee0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
25ef0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
25f00 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
25f10 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58 44  ilename DB ?AUXD
25f20 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  B?.**.** Return 
25f30 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
25f40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
25f50 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ename.*/.static 
25f60 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
25f70 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20  _tempfilename(. 
25f80 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25f90 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25fa0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25fb0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25fc0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25fd0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25fe0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25ff0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26000 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26010 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26030 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26040 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26050 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
26060 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26070 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26080 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
26090 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
260a0 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a  "main";.  char *
260b0 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  zTName = 0;..  i
260c0 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
260d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
260e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
260f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
26100 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
26110 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
26120 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
26130 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
26140 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
26150 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
26160 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
26170 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
26180 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
26190 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
261a0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
261b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
261c0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
261d0 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
261e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
261f0 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
26200 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
26210 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
26220 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
26230 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a  FILENAME, (void*
26240 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c  )&zTName);.  Tcl
26250 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
26260 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63  terp, zTName, (c
26270 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74  har*)0);.  sqlit
26280 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b  e3_free(zTName);
26290 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
262a0 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  ;  .}.../*.** tc
262b0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
262c0 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20  vfs_list.**.**  
262d0 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69   Return a tcl li
262e0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
262f0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
26300 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e  egistered vfs's.
26310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
26320 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e  fs_list(.  Clien
26330 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26340 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
26350 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
26360 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
26370 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26380 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26390 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
263a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
263b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
263c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
263d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
263e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
263f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26400 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26410 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26420 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
26430 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62   *pVfs;.  Tcl_Ob
26440 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
26450 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62  wObj();.  if( ob
26460 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
26470 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
26480 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
26490 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
264a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
264b0 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33  for(pVfs=sqlite3
264c0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56  _vfs_find(0); pV
264d0 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70  fs; pVfs=pVfs->p
264e0 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c  Next){.    Tcl_L
264f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
26500 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
26510 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
26520 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20  bj(pVfs->zName, 
26530 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  -1));.  }.  Tcl_
26540 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
26550 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65  erp, pRet);.  re
26560 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
26570 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
26580 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
26590 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a  DB ID VALUE.**.*
265a0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
265b0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
265c0 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66  te3_limit interf
265d0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
265e0 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
265f0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
26600 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26610 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43   test_limit(.  C
26620 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26630 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26640 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26650 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26660 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26670 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26680 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26690 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
266a0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
266b0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
266c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
266d0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
266e0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
266f0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26700 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26710 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
26720 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
26730 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
26740 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
26750 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
26760 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d  nt id;.  } aId[]
26770 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
26780 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22  TE_LIMIT_LENGTH"
26790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
267a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
267b0 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
267c0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
267d0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
267e0 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
267f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
26800 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
26810 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
26820 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20  _LIMIT_COLUMN", 
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
26840 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
26860 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
26870 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
26880 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
26890 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
268a0 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PTH           },
268b0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
268c0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
268d0 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54  LECT",     SQLIT
268e0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
268f0 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a  _SELECT      },.
26900 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
26910 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20  MIT_VDBE_OP",   
26920 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
26930 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
26940 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
26950 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
26960 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22  IT_FUNCTION_ARG"
26970 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
26980 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
26990 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  RG         },.  
269a0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
269b0 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20  T_ATTACHED",    
269c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
269d0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
269e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
269f0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
26a00 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
26a10 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49  NGTH", SQLITE_LI
26a20 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
26a30 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20  _LENGTH  },.    
26a40 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
26a50 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
26a60 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
26a70 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
26a80 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ER      },.    {
26a90 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
26aa0 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20  RIGGER_DEPTH",  
26ab0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
26ac0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
26ad0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
26ae0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  "SQLITE_LIMIT_WO
26af0 52 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20  RKER_THREADS",  
26b00 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
26b10 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
26b20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20        },.    .  
26b30 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67    /* Out of rang
26b40 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a  e test cases */.
26b50 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
26b60 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20  MIT_TOOSMALL",  
26b70 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20            -1,   
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b90 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
26ba0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
26bb0 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20  IT_TOOBIG",     
26bc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
26bd0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
26be0 45 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20  EADS+1     },.  
26bf0 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20 3d  };.  int i, id =
26c00 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20   0;.  int val;. 
26c10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
26c20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
26c30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
26c40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
26c50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
26c60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
26c70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
26c80 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
26c90 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44  [0], 0), " DB ID
26ca0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
26cb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26cc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
26cd0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
26ce0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
26cf0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
26d00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26d10 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47  R;.  zId = Tcl_G
26d20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
26d30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
26d40 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
26d50 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29  of(aId[0]); i++)
26d60 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
26d70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61  (zId, aId[i].zNa
26d80 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
26d90 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a  id = aId[i].id;.
26da0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
26db0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d   }.  }.  if( i>=
26dc0 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
26dd0 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20  of(aId[0]) ){.  
26de0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
26df0 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
26e00 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20  own limit type: 
26e10 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30  ", zId, (char*)0
26e20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26e30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
26e40 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
26e50 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
26e60 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
26e70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c    rc = sqlite3_l
26e90 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c  imit(db, id, val
26ea0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
26eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
26ec0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
26ed0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26ee0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
26ef0 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67  lcmd:  save_prng
26f00 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76  _state.**.** Sav
26f10 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
26f20 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  he pseudo-random
26f30 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
26f40 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d  r..** At the sam
26f50 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74  e time, verify t
26f60 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  hat sqlite3_test
26f70 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65  _control works e
26f80 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c  ven when.** call
26f90 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ed with an out-o
26fa0 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a  f-range opcode..
26fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
26fc0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  ve_prng_state(. 
26fd0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26fe0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26ff0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
27000 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
27010 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
27020 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
27030 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
27040 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
27050 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27060 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27080 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27090 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
270a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
270b0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
270c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
270d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
270e0 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a  _control(9999);.
270f0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
27100 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
27110 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d  3_test_control(-
27120 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  1);.  assert( rc
27130 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
27140 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
27150 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
27160 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75  NG_SAVE);.  retu
27170 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
27180 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74  ** tclcmd:  rest
27190 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ore_prng_state.*
271a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
271b0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  tore_prng_state(
271c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
271d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
271e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
271f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
27200 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
27210 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
27220 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
27230 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
27240 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
27250 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27270 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
27280 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
27290 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
272a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
272b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
272c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
272d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
272e0 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b  L_PRNG_RESTORE);
272f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
27300 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
27310 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  :  reset_prng_st
27320 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
27330 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61  t reset_prng_sta
27340 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
27350 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27360 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
27370 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
27380 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
27390 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
273a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
273b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
273c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
273d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
273e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
273f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27400 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27410 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27420 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27430 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27440 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
27450 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
27460 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29  CTRL_PRNG_RESET)
27470 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
27480 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
27490 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61  md:  database_ma
274a0 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a  y_be_corrupt.**.
274b0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
274c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
274d0 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74  might be corrupt
274e0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
274f0 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61  s, set the norma
27500 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70  l.** state of op
27510 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
27520 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f  ic int database_
27530 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a  may_be_corrupt(.
27540 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27550 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
27560 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
27570 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27580 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
27590 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
275a0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
275b0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
275c0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
275d0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
275e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
275f0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27600 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27610 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
27620 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
27630 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
27640 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
27650 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
27660 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
27670 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
27680 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
27690 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e  cmd:  database_n
276a0 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a  ever_corrupt.**.
276b0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
276c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
276d0 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d  are always well-
276e0 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e  formed.  This en
276f0 61 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65  ables extra asse
27700 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
27710 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e  ts that test con
27720 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  ditions that are
27730 20 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72   always true for
27740 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
27750 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  abases..*/.stati
27760 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e  c int database_n
27770 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20  ever_corrupt(.  
27780 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27790 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
277a0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
277b0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
277c0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
277d0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
277e0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
277f0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27800 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27810 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27830 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27840 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27850 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27860 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27870 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
27880 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
27890 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
278a0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29  EVER_CORRUPT, 1)
278b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
278c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
278d0 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74  md:  pcache_stat
278e0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
278f0 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74  test_pcache_stat
27900 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
27910 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
27920 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
27930 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
27940 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
27950 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
27960 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
27970 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
27980 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
27990 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
279a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
279b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
279c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
279d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
279e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
279f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
27a00 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e  nt nMin;.  int n
27a10 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72  Max;.  int nCurr
27a20 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79  ent;.  int nRecy
27a30 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62  clable;.  Tcl_Ob
27a40 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69  j *pRet;..  sqli
27a50 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26  te3PcacheStats(&
27a60 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c  nCurrent, &nMax,
27a70 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c   &nMin, &nRecycl
27a80 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d  able);..  pRet =
27a90 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
27aa0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27ab0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27ac0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
27ad0 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e  tringObj("curren
27ae0 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  t", -1));.  Tcl_
27af0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27b00 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27b10 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
27b20 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54  (nCurrent));.  T
27b30 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
27b40 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
27b50 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
27b60 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31  ingObj("max", -1
27b70 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
27b80 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27b90 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
27ba0 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29  _NewIntObj(nMax)
27bb0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
27bc0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
27bd0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
27be0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
27bf0 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  n", -1));.  Tcl_
27c00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27c10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27c20 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
27c30 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMin));.  Tcl_L
27c40 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
27c50 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
27c60 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
27c70 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c  bj("recyclable",
27c80 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
27c90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
27ca0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
27cb0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52  Tcl_NewIntObj(nR
27cc0 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20  ecyclable));..  
27cd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
27ce0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
27cf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
27d00 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
27d10 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
27d20 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
27d30 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  oid test_unlock_
27d40 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a  notify_cb(void *
27d50 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  *aArg, int nArg)
27d60 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
27d70 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b  r(ii=0; ii<nArg;
27d80 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f   ii++){.    Tcl_
27d90 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65  EvalEx((Tcl_Inte
27da0 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22  rp *)aArg[ii], "
27db0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
27dc0 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  -1, TCL_EVAL_GLO
27dd0 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  BAL);.  }.}.#end
27de0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
27df0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
27e00 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  Y */../*.** tclc
27e10 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c  md:  sqlite3_unl
27e20 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f  ock_notify db.*/
27e30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
27e40 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
27e50 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74  IFY.static int t
27e60 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
27e70 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  y(.  ClientData 
27e80 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
27e90 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
27ea0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
27eb0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
27ec0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
27ed0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
27ee0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
27ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27f00 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
27f10 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
27f20 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
27f30 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
27f40 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
27f50 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
27f60 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
27f70 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
27f80 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
27f90 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
27fa0 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
27fb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
27fc0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
27fd0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
27fe0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
27ff0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
28000 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28010 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
28020 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
28030 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63  y(db, test_unloc
28040 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f  k_notify_cb, (vo
28050 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20  id *)interp);.  
28060 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
28070 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
28080 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
28090 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
280a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
280b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  endif../*.** tcl
280c0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61  cmd:  sqlite3_wa
280d0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
280e0 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?NAME?.*/.static
280f0 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68   int test_wal_ch
28100 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65  eckpoint(.  Clie
28110 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28120 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
28130 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28140 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28150 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28160 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28170 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28180 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28190 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
281a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
281b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
281c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
281d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
281e0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
281f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
28200 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
28210 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
28220 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
28230 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
28240 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
28250 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20   "DB ?NAME?");. 
28260 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28270 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
28280 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
28290 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
282a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
282b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
282c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
282d0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
282e0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
282f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
28300 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
28310 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
28320 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
28330 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
28340 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
28350 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
28360 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
28370 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28380 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
28390 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
283a0 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45  point_v2 db MODE
283b0 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68   ?NAME?.**.** Th
283c0 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73  is command calls
283d0 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f   the wal_checkpo
283e0 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  int_v2() functio
283f0 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  n with the speci
28400 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67  fied.** mode arg
28410 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20  ument (passive, 
28420 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29  full or restart)
28430 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68  . If present, th
28440 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  e database name.
28450 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65  ** NAME is passe
28460 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
28470 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f  argument to wal_
28480 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e  checkpoint_v2().
28490 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41   If it the.** NA
284a0 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ME argument is n
284b0 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55  ot present, a NU
284c0 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61  LL pointer is pa
284d0 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  ssed instead..**
284e0 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b  .** If wal_check
284f0 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72  point_v2() retur
28500 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68  ns any value oth
28510 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
28520 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  USY or.** SQLITE
28530 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63  _OK, then this c
28540 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54  ommand returns T
28550 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63  CL_ERROR. The Tc
28560 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a  l result is set.
28570 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ** to the error 
28580 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64  message obtained
28590 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
285a0 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  rmsg()..**.** Ot
285b0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f  herwise, this co
285c0 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  mmand returns a 
285d0 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e  list of three in
285e0 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
285f0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20  t integer.** is 
28600 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  1 if SQLITE_BUSY
28610 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f   was returned, o
28620 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54  r 0 otherwise. T
28630 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
28640 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65   integers.** are
28650 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
28660 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74  rned via the out
28670 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62  put parameters b
28680 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  y wal_checkpoint
28690 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e  _v2() -.** the n
286a0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
286b0 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74  in the log and t
286c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
286d0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a  mes in the log.*
286e0 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  * that have been
286f0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
28700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
28710 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
28720 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  _v2(.  ClientDat
28730 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
28740 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
28750 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28760 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
28770 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
28780 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
28790 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
287a0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
287b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
287c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
287d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
287e0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
287f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
28800 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
28810 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
28820 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20   int rc;..  int 
28830 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f  eMode;.  int nLo
28840 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20  g = -555;.  int 
28850 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20  nCkpt = -555;.  
28860 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
28870 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61    const char * a
28880 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73  Mode[] = { "pass
28890 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72  ive", "full", "r
288a0 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61  estart", "trunca
288b0 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65  te", 0 };.  asse
288c0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
288d0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
288e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
288f0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
28900 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
28910 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
28920 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
28930 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
28940 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
28950 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
28960 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
28970 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
28980 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
28990 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
289a0 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d  v, "DB MODE ?NAM
289b0 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
289c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
289d0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
289e0 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f  {.    zDb = Tcl_
289f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
28a00 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  ]);.  }.  if( ge
28a10 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
28a20 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
28a30 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
28a40 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f  || (.      TCL_O
28a50 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
28a60 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c  mObj(0, objv[2],
28a70 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54   &eMode).   && T
28a80 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
28a90 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
28aa0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64  p, objv[2], aMod
28ab0 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65  e, "mode", 0, &e
28ac0 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20  Mode) .  )){.   
28ad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28ae0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
28af0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
28b00 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62  point_v2(db, zDb
28b10 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20  , eMode, &nLog, 
28b20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72  &nCkpt);.  if( r
28b30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
28b40 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
28b50 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
28b60 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71  r *zErrCode = sq
28b70 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
28b80 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
28b90 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
28ba0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
28bb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
28bc0 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68  Code, " - ", (ch
28bd0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
28be0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
28bf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28c00 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
28c10 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
28c20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
28c30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
28c40 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
28c50 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45  ntObj(rc==SQLITE
28c60 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54  _BUSY?1:0));.  T
28c70 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
28c80 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
28c90 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
28ca0 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63  Obj(nLog));.  Tc
28cb0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
28cc0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
28cd0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
28ce0 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63  bj(nCkpt));.  Tc
28cf0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
28d00 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
28d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
28d20 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
28d30 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
28d40 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  tocheckpoint db 
28d50 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20  VALUE.*/.static 
28d60 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 61 75 74  int test_wal_aut
28d70 6f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  ocheckpoint(.  C
28d80 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
28d90 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
28da0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
28db0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
28dc0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
28dd0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
28de0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
28df0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
28e00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28e10 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
28e20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
28e30 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
28e40 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28e50 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28e60 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
28e70 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20    int iVal;...  
28e80 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
28e90 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
28ea0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
28eb0 62 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29  bjv, "DB VALUE")
28ec0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
28ed0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
28ee0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
28ef0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
28f00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28f10 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
28f20 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
28f30 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29   objv[2], &iVal)
28f40 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
28f50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28f60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
28f70 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
28f80 6e 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20  nt(db, iVal);.  
28f90 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
28fa0 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72  interp);.  if( r
28fb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
28fc0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28fd0 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74  zErrCode = sqlit
28fe0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20  e3ErrName(rc);. 
28ff0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
29000 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
29010 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72  NewStringObj(zEr
29020 72 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  rCode, -1));.   
29030 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29040 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
29050 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
29060 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74  ** tclcmd:  test
29070 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43  _sqlite3_log ?SC
29080 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  RIPT?.*/.static 
29090 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61  struct LogCallba
290a0 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ck {.  Tcl_Inter
290b0 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63  p *pInterp;.  Tc
290c0 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c  l_Obj *pObj;.} l
290d0 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c  ogcallback = {0,
290e0 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64   0};.static void
290f0 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f   xLogcallback(vo
29100 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20  id *unused, int 
29110 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29  err, char *zMsg)
29120 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65  {.  Tcl_Obj *pNe
29130 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  w = Tcl_Duplicat
29140 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  eObj(logcallback
29150 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e  .pObj);.  Tcl_In
29160 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
29170 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
29180 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
29190 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c      0, pNew, Tcl
291a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
291b0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72  lite3ErrName(err
291c0 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63  ), -1).  );.  Tc
291d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
291e0 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20  lement(0, pNew, 
291f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
29200 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54  (zMsg, -1));.  T
29210 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67  cl_EvalObjEx(log
29220 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
29230 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c  , pNew, TCL_EVAL
29240 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c  _GLOBAL|TCL_EVAL
29250 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
29260 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65  DecrRefCount(pNe
29270 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  w);.}.static int
29280 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f   test_sqlite3_lo
29290 67 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  g(.  ClientData 
292a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
292b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
292c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
292d0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
292e0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
292f0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
29300 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
29310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
29320 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
29330 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
29340 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
29350 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
29360 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a    if( objc>2 ){.
29370 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
29380 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
29390 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
293a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
293b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
293c0 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
293d0 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  j ){.    Tcl_Dec
293e0 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c  rRefCount(logcal
293f0 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20  lback.pObj);.   
29400 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
29410 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61  j = 0;.    logca
29420 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d  llback.pInterp =
29430 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
29440 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
29450 4e 46 49 47 5f 4c 4f 47 2c 20 28 76 6f 69 64 2a  NFIG_LOG, (void*
29460 29 30 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  )0, (void*)0);. 
29470 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20   }.  if( objc>1 
29480 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  ){.    logcallba
29490 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ck.pObj = objv[1
294a0 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ];.    Tcl_IncrR
294b0 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
294c0 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
294d0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
294e0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
294f0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
29500 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
29510 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c  G, xLogcallback,
29520 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a   (void*)0);.  }.
29530 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29540 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63  .}../*.**     tc
29550 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e  l_objproc COMMAN
29560 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a  DNAME ARGS....**
29570 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f  .** Run a TCL co
29580 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20  mmand using its 
29590 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
295a0 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  e.  Throw an err
295b0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d  or if.** the com
295c0 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50  mand has no objP
295d0 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  roc interface..*
295e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
295f0 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69  AsObjProc(.  voi
29600 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
29610 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29620 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
29630 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
29640 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
29650 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
29660 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  fo;.  if( objc<2
29670 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
29680 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
29690 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41   1, objv, "COMMA
296a0 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
296b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
296c0 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47    }.  if( !Tcl_G
296d0 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
296e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
296f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63  ing(objv[1]), &c
29700 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
29710 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
29720 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
29730 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20   not found: ",. 
29740 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
29750 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
29760 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
29770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29780 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d 64  R;.  }.  if( cmd
29790 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20  Info.objProc==0 
297a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
297b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
297c0 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20  "command has no 
297d0 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20  objProc: ",.    
297e0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
297f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
29800 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
29810 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29820 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d 64    }.  return cmd
29830 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64  Info.objProc(cmd
29840 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
29850 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63  ta, interp, objc
29860 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a  -1, objv+1);.}..
29870 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
29880 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
29890 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 66  * WARNING: The f
298a0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
298b0 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  n, printExplainQ
298c0 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20 61 6e  ueryPlan() is an
298d0 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f   exact.** copy o
298e0 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 66  f example code f
298f0 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71 70 2e  rom eqp.in (eqp.
29900 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73 20 63  html). If this c
29910 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ode is modified,
29920 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 6f 63  .** then the doc
29930 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20  umentation copy 
29940 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 64 69  needs to be modi
29950 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  fied as well..*/
29960 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
29970 70 53 74 6d 74 20 69 73 20 61 20 70 72 65 70 61  pStmt is a prepa
29980 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  red SQL statemen
29990 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
299a0 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20   compiles.** an 
299b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
299c0 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65  AN command to re
299d0 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72 65 70  port on the prep
299e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a  ared statement,.
299f0 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20 74 68  ** and prints th
29a00 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74 64 6f  e report to stdo
29a10 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74 66 28  ut using printf(
29a20 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45  )..*/.int printE
29a30 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
29a40 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
29a50 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  tmt){.  const ch
29a60 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
29a70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
29a80 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a   SQL */.  char *
29a90 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20  zExplain;       
29aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
29ab0 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20 51 55   with EXPLAIN QU
29ac0 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65 6e 64  ERY PLAN prepend
29ad0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
29ae0 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20  stmt *pExplain; 
29af0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
29b00 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55 45 52  led EXPLAIN QUER
29b10 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a  Y PLAN command *
29b20 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b40 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
29b50 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  de from sqlite3_
29b60 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a  prepare_v2() */.
29b70 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
29b80 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
29b90 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
29ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
29bb0 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d  R;..  zExplain =
29bc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
29bd0 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
29be0 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b  PLAN %s", zSql);
29bf0 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d  .  if( zExplain=
29c00 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
29c10 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20  TE_NOMEM;..  rc 
29c20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
29c30 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64 62 5f  e_v2(sqlite3_db_
29c40 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a  handle(pStmt), z
29c50 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45  Explain, -1, &pE
29c60 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71  xplain, 0);.  sq
29c70 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78 70 6c  lite3_free(zExpl
29c80 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ain);.  if( rc!=
29c90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
29ca0 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28  rn rc;..  while(
29cb0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
29cc0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
29cd0 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  in) ){.    int i
29ce0 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74  Selectid = sqlit
29cf0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
29d00 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
29d10 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c  int iOrder = sql
29d20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
29d30 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
29d40 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71    int iFrom = sq
29d50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
29d60 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20  (pExplain, 2);. 
29d70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29d80 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20  Detail = (const 
29d90 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
29da0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
29db0 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72  ain, 3);..    pr
29dc0 69 6e 74 66 28 22 25 64 20 25 64 20 25 64 20 25  intf("%d %d %d %
29dd0 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69 64 2c  s\n", iSelectid,
29de0 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20   iOrder, iFrom, 
29df0 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  zDetail);.  }.. 
29e00 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
29e10 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
29e20 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  n);.}..static in
29e30 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70  t test_print_eqp
29e40 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
29e50 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
29e60 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
29e70 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
29e80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
29e90 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
29ea0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
29eb0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
29ec0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
29ed0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
29ee0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
29ef0 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
29f00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29f10 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
29f20 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
29f30 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
29f40 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
29f50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29f60 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70  .  rc = printExp
29f70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53  lainQueryPlan(pS
29f80 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20  tmt);.  /* This 
29f90 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e  is needed on Win
29fa0 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61 20 74  dows so that a t
29fb0 65 73 74 20 63 61 73 65 20 75 73 69 6e 67 20 74  est case using t
29fc0 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69  his .  ** functi
29fd0 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65  on can open a re
29fe0 61 64 20 70 69 70 65 20 61 6e 64 20 67 65 74 20  ad pipe and get 
29ff0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20  the output of.  
2a000 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  ** printExplainQ
2a010 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64  ueryPlan() immed
2a020 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66  iately..  */.  f
2a030 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
2a040 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2a050 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2a060 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2a070 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
2a080 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2a090 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2a0a0 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73  LAIN */../*.** s
2a0b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2a0c0 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e  rol VERB ARGS...
2a0d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2a0e0 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  est_test_control
2a0f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2a100 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a110 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2a120 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2a130 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2a140 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72  .){.  struct Ver
2a150 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b {.    const ch
2a160 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
2a170 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b  nt i;.  } aVerb[
2a180 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c  ] = {.    { "SQL
2a190 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2a1a0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53  ALTIME_FAULT", S
2a1b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
2a1c0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d  OCALTIME_FAULT }
2a1d0 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  , .    { "SQLITE
2a1e0 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
2a1f0 5f 4d 4d 41 50 22 2c 20 20 20 20 20 53 51 4c 49  _MMAP",     SQLI
2a200 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
2a210 45 52 5f 4d 4d 41 50 20 20 20 20 20 7d 2c 20 0a  ER_MMAP     }, .
2a220 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45      { "SQLITE_TE
2a230 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 22  STCTRL_IMPOSTER"
2a240 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
2a250 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2a260 52 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b  R        },.  };
2a270 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
2a280 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
2a290 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2a2a0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
2a2b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2a2c0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
2a2d0 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
2a2e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a2f0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
2a300 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2a310 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
2a320 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
2a330 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
2a340 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
2a350 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
2a360 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
2a370 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
2a380 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
2a390 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
2a3a0 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
2a3b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
2a3c0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
2a3d0 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
2a3e0 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
2a3f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2a400 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
2a410 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
2a420 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
2a430 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2a440 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2a450 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
2a460 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
2a470 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2a480 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
2a490 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a4a0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2a4b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2a4c0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
2a4d0 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
2a4e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a4f0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
2a500 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
2a510 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
2a520 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20    int val;.     
2a530 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2a540 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
2a550 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
2a560 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2a570 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 2, objv, "DB
2a580 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20   LIMIT");.      
2a590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a5a0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2a5b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2a5c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2a5d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2a5e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2a5f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2a600 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2a610 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2a620 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
2a630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a640 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
2a650 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2a660 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
2a670 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76  RTER_MMAP, db, v
2a680 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
2a690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
2a6a0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
2a6b0 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20  L_IMPOSTER: {.  
2a6c0 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74      int onOff, t
2a6d0 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  num;.      const
2a6e0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a   char *zDbName;.
2a6f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2a700 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  b;.      if( obj
2a710 63 21 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=6 ){.        
2a720 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2a730 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
2a740 2c 20 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f  , "DB dbName onO
2a750 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20  ff tnum");.     
2a760 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a770 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2a780 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
2a790 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2a7a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2a7b0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2a7c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2a7d0 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
2a7e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2a7f0 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54  3]);.      if( T
2a800 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2a810 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
2a820 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72 65 74 75  , &onOff) ) retu
2a830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a840 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
2a850 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2a860 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d  , objv[5], &tnum
2a870 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2a880 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2a890 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2a8a0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2a8b0 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a  _IMPOSTER, db, z
2a8c0 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  DbName, onOff, t
2a8d0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
2a8e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
2a8f0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2a900 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2a910 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
2a920 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a   SQLITE_OS_UNIX.
2a930 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
2a940 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
2a950 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
2a960 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2a970 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f  _getrusage(.  vo
2a980 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2a990 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a9a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2a9b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2a9c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2a9d0 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a  char buf[1024];.
2a9e0 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
2a9f0 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20  r;.  memset(&r, 
2aa00 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  0, sizeof(r));. 
2aa10 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
2aa20 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20  E_SELF, &r);..  
2aa30 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2aa40 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62 75  (sizeof(buf), bu
2aa50 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d 65  f,.    "ru_utime
2aa60 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d  =%d.%06d ru_stim
2aa70 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e  e=%d.%06d ru_min
2aa80 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74  flt=%d ru_majflt
2aa90 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29  =%d", .    (int)
2aaa0 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65  r.ru_utime.tv_se
2aab0 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69  c, (int)r.ru_uti
2aac0 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
2aad0 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
2aae0 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
2aaf0 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_stime.tv_usec
2ab00 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2ab10 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e  _minflt, (int)r.
2ab20 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20  ru_majflt.  );. 
2ab30 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2ab40 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2ab50 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
2ab60 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
2ab70 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
2ab80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2ab90 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  IN./*.** Informa
2aba0 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d  tion passed from
2abb0 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
2abc0 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77   into the window
2abd0 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a  s file locker.**
2abe0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
2abf0 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ad..*/.struct wi
2ac00 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a  n32FileLocker {.
2ac10 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20    char *evName; 
2ac20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2ac30 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c   event to signal
2ac40 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20   thread startup 
2ac50 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
2ac60 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
2ac70 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  le of the file t
2ac80 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
2ac90 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20   int delay1;    
2aca0 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
2acb0 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  fore locking */.
2acc0 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20    int delay2;   
2acd0 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
2ace0 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20  efore unlocking 
2acf0 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20  */.  int ok;    
2ad00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
2ad10 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74  shed ok */.  int
2ad20 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20   err;           
2ad30 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65   /* True if an e
2ad40 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d  rror occurs */.}
2ad50 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  ;.#endif...#if S
2ad60 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
2ad70 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68  clude <process.h
2ad80 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  >./*.** The back
2ad90 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68  ground thread th
2ada0 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63  at does file loc
2adb0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2adc0 76 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f  void win32_file_
2add0 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70  locker(void *pAp
2ade0 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74  pData){.  struct
2adf0 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
2ae00 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69   *p = (struct wi
2ae10 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70  n32FileLocker*)p
2ae20 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70  AppData;.  if( p
2ae30 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ->evName ){.    
2ae40 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e  HANDLE ev = Open
2ae50 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49  Event(EVENT_MODI
2ae60 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c  FY_STATE, FALSE,
2ae70 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20   p->evName);.   
2ae80 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20   if ( ev ){.    
2ae90 20 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a    SetEvent(ev);.
2aea0 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
2aeb0 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(ev);.    }.  }
2aec0 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31  .  if( p->delay1
2aed0 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61   ) Sleep(p->dela
2aee0 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46  y1);.  if( LockF
2aef0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
2af00 31 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b  100000000, 0) ){
2af10 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65  .    Sleep(p->de
2af20 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63  lay2);.    Unloc
2af30 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
2af40 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b  , 100000000, 0);
2af50 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a  .    p->ok = 1;.
2af60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
2af70 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43  err = 1;.  }.  C
2af80 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29  loseHandle(p->h)
2af90 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20  ;.  p->h = 0;.  
2afa0 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20  p->delay1 = 0;. 
2afb0 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a   p->delay2 = 0;.
2afc0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
2afd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
2afe0 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33  *      lock_win3
2aff0 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20  2_file FILENAME 
2b000 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a  DELAY1 DELAY2.**
2b010 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75  .** Get an exclu
2b020 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c  sive manditory l
2b030 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20  ock on file for 
2b040 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f  DELAY2 milliseco
2b050 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c  nds..** Wait DEL
2b060 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  AY1 milliseconds
2b070 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
2b080 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  g the lock..*/.s
2b090 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2b0a0 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69  file_lock(.  voi
2b0b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2b0c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2b0d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2b0e0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2b0f0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
2b100 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
2b110 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d  32FileLocker x =
2b120 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c   { "win32_file_l
2b130 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ock", 0, 0, 0, 0
2b140 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
2b150 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
2b160 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
2b170 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20  ;.  int retry = 
2b180 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a  0;.  HANDLE ev;.
2b190 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b    DWORD wResult;
2b1a0 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
2b1b0 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  4 && objc!=1 ){.
2b1c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2b1d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2b1e0 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
2b1f0 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b  DELAY1 DELAY2");
2b200 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2b210 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2b220 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20   objc==1 ){.    
2b230 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b240 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2b250 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25  Buf, "%d %d %d %
2b260 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
2b270 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b              x.ok
2b280 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79  , x.err, x.delay
2b290 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68  1, x.delay2, x.h
2b2a0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
2b2b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b2c0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
2b2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2b2e0 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  OK;.  }.  while(
2b2f0 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30   x.h && retry<30
2b300 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b   ){.    retry++;
2b310 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b  .    Sleep(100);
2b320 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29  .  }.  if( x.h )
2b330 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2b340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2b350 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29  busy", (char*)0)
2b360 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2b370 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2b380 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2b390 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2b3a0 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20  [2], &x.delay1) 
2b3b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2b3c0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
2b3d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2b3e0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e  rp, objv[3], &x.
2b3f0 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e  delay2) ) return
2b400 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
2b410 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
2b420 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2b430 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65  ;.  x.h = Create
2b440 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
2b450 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e  GENERIC_READ|GEN
2b460 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
2b470 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53            FILE_S
2b480 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53  HARE_READ|FILE_S
2b490 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f  HARE_WRITE, 0, O
2b4a0 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
2b4b0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41            FILE_A
2b4c0 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c  TTRIBUTE_NORMAL,
2b4d0 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20   0);.  if( !x.h 
2b4e0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2b4f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2b500 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
2b510 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
2b520 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2b530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b540 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65  ;.  }.  ev = Cre
2b550 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54  ateEvent(NULL, T
2b560 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76  RUE, FALSE, x.ev
2b570 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65  Name);.  if ( !e
2b580 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  v ){.    Tcl_App
2b590 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b5a0 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
2b5b0 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e   event: ", x.evN
2b5c0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2b5d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2b5e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67  RROR;.  }.  _beg
2b5f0 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66  inthread(win32_f
2b600 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28  ile_locker, 0, (
2b610 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65  void*)&x);.  Sle
2b620 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77  ep(0);.  if ( (w
2b630 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72  Result = WaitFor
2b640 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c  SingleObject(ev,
2b650 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f   10000))!=WAIT_O
2b660 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73  BJECT_0 ){.    s
2b670 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b680 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
2b690 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73  uf, "0x%x", wRes
2b6a0 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  ult);.    Tcl_Ap
2b6b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2b6c0 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a  p, "wait failed:
2b6d0 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a   ", zBuf, (char*
2b6e0 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  )0);.    CloseHa
2b6f0 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65  ndle(ev);.    re
2b700 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b710 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2b720 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(ev);.  return 
2b730 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2b740 20 20 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e        exists_win
2b750 33 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a  32_path PATH.**.
2b760 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2b770 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2b780 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73  fied path exists
2b790 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2b7a0 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20  alified name.** 
2b7b0 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 20 63  may exceed 260 c
2b7c0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2b7d0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2b7e0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2b7f0 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 65 78 69  ic int win32_exi
2b800 73 74 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64  sts_path(.  void
2b810 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2b820 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2b830 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2b840 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b850 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2b860 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2b870 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2b880 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2b890 2c 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72  , "PATH");.    r
2b8a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2b8b0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
2b8c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2b8d0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
2b8e0 6a 28 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65  j(.      GetFile
2b8f0 41 74 74 72 69 62 75 74 65 73 57 28 20 54 63 6c  AttributesW( Tcl
2b900 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2b910 5b 31 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46  [1]))!=INVALID_F
2b920 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
2b930 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2b940 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2b950 20 20 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c    find_win32_fil
2b960 65 20 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20  e PATTERN.**.** 
2b970 52 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f  Returns a list o
2b980 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64  f entries in a d
2b990 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61  irectory that ma
2b9a0 74 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  tch the specifie
2b9b0 64 20 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68  d pattern,.** wh
2b9c0 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2b9d0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
2b9e0 65 65 64 20 32 34 38 20 63 68 61 72 61 63 74 65  eed 248 characte
2b9f0 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
2ba00 69 78 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c  ixed with.** "\\
2ba10 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2ba20 6e 74 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69  nt win32_find_fi
2ba30 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  le(.  void *clie
2ba40 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2ba50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2ba60 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2ba70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2ba80 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46  ].){.  HANDLE hF
2ba90 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49  indFile = INVALI
2baa0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
2bab0 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54    WIN32_FIND_DAT
2bac0 41 57 20 66 69 6e 64 44 61 74 61 3b 0a 20 20 54  AW findData;.  T
2bad0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b  cl_Obj *listObj;
2bae0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
2baf0 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  no;.  if( objc!=
2bb00 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2bb10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2bb20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54  , 1, objv, "PATT
2bb30 45 52 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ERN");.    retur
2bb40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2bb50 0a 20 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 46  .  hFindFile = F
2bb60 69 6e 64 46 69 72 73 74 46 69 6c 65 57 28 54 63  indFirstFileW(Tc
2bb70 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2bb80 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44 61 74 61  v[1]), &findData
2bb90 29 3b 0a 20 20 69 66 28 20 68 46 69 6e 64 46 69  );.  if( hFindFi
2bba0 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  le==INVALID_HAND
2bbb0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
2bbc0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2bbd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2bbe0 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
2bbf0 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
2bc00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bc10 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a  R;.  }.  listObj
2bc20 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2bc30 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2bc40 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
2bc50 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  do {.    Tcl_Lis
2bc60 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2bc70 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
2bc80 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64  j, Tcl_NewUnicod
2bc90 65 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69  eObj(.        fi
2bca0 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65  ndData.cFileName
2bcb0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2bcc0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2bcd0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
2bce0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64  tObj, Tcl_NewWid
2bcf0 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20  eIntObj(.       
2bd00 20 66 69 6e 64 44 61 74 61 2e 64 77 46 69 6c 65   findData.dwFile
2bd10 41 74 74 72 69 62 75 74 65 73 29 29 3b 0a 20 20  Attributes));.  
2bd20 7d 20 77 68 69 6c 65 28 20 46 69 6e 64 4e 65 78  } while( FindNex
2bd30 74 46 69 6c 65 57 28 68 46 69 6e 64 46 69 6c 65  tFileW(hFindFile
2bd40 2c 20 26 66 69 6e 64 44 61 74 61 29 20 29 3b 0a  , &findData) );.
2bd50 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65    lastErrno = Ge
2bd60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
2bd70 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e  if( lastErrno!=N
2bd80 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61 73 74 45  O_ERROR && lastE
2bd90 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d  rrno!=ERROR_NO_M
2bda0 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20  ORE_FILES ){.   
2bdb0 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64   FindClose(hFind
2bdc0 46 69 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44  File);.    Tcl_D
2bdd0 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ecrRefCount(list
2bde0 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  Obj);.    Tcl_Se
2bdf0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2be00 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2be10 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2be20 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2be30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2be40 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69  .  FindClose(hFi
2be50 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53  ndFile);.  Tcl_S
2be60 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2be70 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  rp, listObj);.  
2be80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2be90 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c  ../*.**      del
2bea0 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46  ete_win32_file F
2beb0 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65  ILENAME.**.** De
2bec0 6c 65 74 65 73 20 74 68 65 20 73 70 65 63 69 66  letes the specif
2bed0 69 65 64 20 66 69 6c 65 2c 20 77 68 6f 73 65 20  ied file, whose 
2bee0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2bef0 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
2bf00 32 36 30 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  260.** character
2bf10 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2bf20 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
2bf30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2bf40 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
2bf50 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2bf60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2bf70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2bf80 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2bf90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2bfa0 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
2bfb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2bfc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2bfd0 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
2bfe0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
2bff0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c000 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46 69  .  if( !DeleteFi
2c010 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  leW(Tcl_GetUnico
2c020 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
2c030 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2c040 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2c050 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2c060 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2c070 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c080 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
2c090 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2c0a0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2c0b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2c0c0 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f       make_win32_
2c0d0 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a  dir DIRECTORY.**
2c0e0 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20  .** Creates the 
2c0f0 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74  specified direct
2c100 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  ory, whose fully
2c110 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2c120 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a  may exceed 248.*
2c130 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  * characters if 
2c140 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
2c150 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
2c160 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2c170 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63  mkdir(.  void *c
2c180 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2c190 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c1a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2c1b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c1c0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
2c1d0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2c1e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2c1f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2c200 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20  DIRECTORY");.   
2c210 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c220 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72  R;.  }.  if( !Cr
2c230 65 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54  eateDirectoryW(T
2c240 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
2c250 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b  jv[1]), NULL) ){
2c260 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2c270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2c280 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2c290 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2c2a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c2b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2c2c0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2c2d0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2c2e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2c2f0 20 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e        remove_win
2c300 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59  32_dir DIRECTORY
2c310 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74  .**.** Removes t
2c320 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72  he specified dir
2c330 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75  ectory, whose fu
2c340 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2c350 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
2c360 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  8.** characters 
2c370 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
2c380 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
2c390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2c3a0 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64  32_rmdir(.  void
2c3b0 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2c3c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c3d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2c3e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2c3f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2c400 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2c410 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2c420 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2c430 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
2c440 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2c450 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2c460 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79  !RemoveDirectory
2c470 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
2c480 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20  (objv[1])) ){.  
2c490 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2c4a0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2c4b0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
2c4c0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
2c4d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2c4e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52  ROR;.  }.  Tcl_R
2c4f0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2c500 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
2c510 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
2c520 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d  /*.**      optim
2c530 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20  ization_control 
2c540 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a  DB OPT BOOLEAN.*
2c550 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
2c560 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74  isable query opt
2c570 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67  imizations using
2c580 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
2c590 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69  t_control().** i
2c5a0 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61 62  nterface.  Disab
2c5b0 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
2c5c0 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c   false and enabl
2c5d0 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  e if BOOLEAN is 
2c5e0 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20  true..** OPT is 
2c5f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2c600 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
2c610 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a  be disabled..*/.
2c620 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6d  static int optim
2c630 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28  ization_control(
2c640 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2c650 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2c660 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2c670 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2c680 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2c690 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
2c6a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
2c6b0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
2c6c0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e   int onoff;.  in
2c6d0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74  t mask = 0;.  st
2c6e0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2c6f0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2c700 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
2c710 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20    int mask;.  } 
2c720 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aOpt[] = {.    {
2c730 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20   "all",         
2c740 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
2c750 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
2c760 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20  .    { "none",  
2c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c790 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75      },.    { "qu
2c7a0 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20  ery-flattener", 
2c7b0 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79      SQLITE_Query
2c7c0 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20  Flattener },.   
2c7d0 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65   { "column-cache
2c7e0 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2c7f0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20  _ColumnCache    
2c800 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62  },.    { "groupb
2c810 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20  y-order",       
2c820 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2c830 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  der   },.    { "
2c840 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73  factor-constants
2c850 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63  ",    SQLITE_Fac
2c860 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20  torOutConst },. 
2c870 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f     { "distinct-o
2c880 70 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  pt",        SQLI
2c890 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20  TE_DistinctOpt  
2c8a0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65    },.    { "cove
2c8b0 72 2d 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 20  r-idx-scan",    
2c8c0 20 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64    SQLITE_CoverId
2c8d0 78 53 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20 7b  xScan   },.    {
2c8e0 20 22 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a   "order-by-idx-j
2c8f0 6f 69 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 4f  oin",   SQLITE_O
2c900 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d 2c  rderByIdxJoin },
2c910 0a 20 20 20 20 7b 20 22 74 72 61 6e 73 69 74 69  .    { "transiti
2c920 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  ve",          SQ
2c930 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20  LITE_Transitive 
2c940 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75      },.    { "su
2c950 62 71 75 65 72 79 2d 63 6f 72 6f 75 74 69 6e 65  bquery-coroutine
2c960 22 2c 20 20 53 51 4c 49 54 45 5f 53 75 62 71 43  ",  SQLITE_SubqC
2c970 6f 72 6f 75 74 69 6e 65 20 20 7d 2c 0a 20 20 20  oroutine  },.   
2c980 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f   { "omit-noop-jo
2c990 69 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  in",      SQLITE
2c9a0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20  _OmitNoopJoin   
2c9b0 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22  },.    { "stat3"
2c9c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c9d0 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20  SQLITE_Stat34   
2c9e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2c9f0 73 74 61 74 34 22 2c 20 20 20 20 20 20 20 20 20  stat4",         
2ca00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61        SQLITE_Sta
2ca10 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t34         },. 
2ca20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
2ca30 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
2ca40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2ca50 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2ca60 4f 50 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  OPT BOOLEAN");. 
2ca70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ca80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ca90 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2caa0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2cab0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2cac0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2cad0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
2cae0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
2caf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2cb00 2c 20 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75  , &onoff) ) retu
2cb10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2cb20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  zOpt = Tcl_GetSt
2cb30 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2cb40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2cb50 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2cb60 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2cb70 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2cb80 4f 70 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70  Opt, aOpt[i].zOp
2cb90 74 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  tName)==0 ){.   
2cba0 20 20 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69     mask = aOpt[i
2cbb0 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72  ].mask;.      br
2cbc0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2cbd0 20 69 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73   if( onoff ) mas
2cbe0 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28  k = ~mask;.  if(
2cbf0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29   i>=sizeof(aOpt)
2cc00 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
2cc10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2cc20 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2cc30 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69   "unknown optimi
2cc40 7a 61 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20  zation - should 
2cc50 62 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20  be one of:",.   
2cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc70 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
2cc80 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2cc90 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2cca0 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2ccb0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2ccc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ccd0 20 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74   ", aOpt[i].zOpt
2cce0 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
2ccf0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2cd00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2cd10 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2cd20 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2cd30 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2cd40 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29  TIONS, db, mask)
2cd50 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2cd60 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  K;.}..typedef st
2cd70 72 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69  ruct sqlite3_api
2cd80 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65  _routines sqlite
2cd90 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a  3_api_routines;.
2cda0 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
2cdb0 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
2cdc0 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
2cdd0 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
2cde0 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
2cdf0 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
2ce00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2ce10 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
2ce20 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64  nsionCmd(.  void
2ce30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2ce40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2ce50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2ce60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2ce70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78  T objv[].){.  ex
2ce80 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2ce90 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c  _amatch_init(sql
2cea0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2ceb0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2cec0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2ced0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2cee0 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c  closure_init(sql
2cef0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2cf00 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2cf10 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2cf20 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2cf30 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c 69 74 65  eval_init(sqlite
2cf40 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2cf50 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2cf60 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2cf70 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c   int sqlite3_fil
2cf80 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eio_init(sqlite3
2cf90 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2cfa0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2cfb0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2cfc0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a  int sqlite3_fuzz
2cfd0 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  er_init(sqlite3*
2cfe0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2cff0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2d000 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2d010 6e 74 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f  nt sqlite3_ieee_
2d020 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2d030 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2d040 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2d050 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2d060 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
2d070 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2d080 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2d090 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2d0a0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2d0b0 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74   sqlite3_percent
2d0c0 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ile_init(sqlite3
2d0d0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2d0e0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2d0f0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2d100 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67 65  int sqlite3_rege
2d110 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  xp_init(sqlite3*
2d120 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2d130 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2d140 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2d150 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65  nt sqlite3_serie
2d160 73 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  s_init(sqlite3*,
2d170 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2d180 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2d190 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2d1a0 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66  t sqlite3_spellf
2d1b0 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ix_init(sqlite3*
2d1c0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2d1d0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2d1e0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2d1f0 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70  nt sqlite3_totyp
2d200 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2d210 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2d220 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2d230 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2d240 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e  t sqlite3_wholen
2d250 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  umber_init(sqlit
2d260 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2d270 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2d280 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74 61 74 69  tines*);.  stati
2d290 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
2d2a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2d2b0 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20 20 69  *zExtName;.    i
2d2c0 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71 6c 69  nt (*pInit)(sqli
2d2d0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2d2e0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2d2f0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20 61 45  utines*);.  } aE
2d300 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20  xtension[] = {. 
2d310 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c 20 20     { "amatch",  
2d320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d330 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69  lite3_amatch_ini
2d340 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d350 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72  },.    { "closur
2d360 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2d370 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72    sqlite3_closur
2d380 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2d390 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76      },.    { "ev
2d3a0 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
2d3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76        sqlite3_ev
2d3c0 61 6c 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  al_init         
2d3d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2d3e0 20 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20   "fileio",      
2d3f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d400 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20  3_fileio_init   
2d410 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2d420 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
2d430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d440 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2d450 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d460 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
2d470 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2d480 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
2d490 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2d4a0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
2d4b0 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
2d4c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
2d4d0 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
2d4e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2d4f0 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
2d500 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d510 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
2d520 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2d530 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20     { "regexp",  
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2d550 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2d560 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2d570 7d 2c 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73  },.    { "series
2d580 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2d590 20 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73    sqlite3_series
2d5a0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2d5b0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70      },.    { "sp
2d5c0 65 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20  ellfix",        
2d5d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70        sqlite3_sp
2d5e0 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20  ellfix_init     
2d5f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2d600 20 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20   "totype",      
2d610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2d620 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20  3_totype_init   
2d630 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2d640 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65     { "wholenumbe
2d650 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 73 71  r",           sq
2d660 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65  lite3_wholenumbe
2d670 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
2d680 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65  },.  };.  sqlite
2d690 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2d6a0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e  har *zName;.  in
2d6b0 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68  t i, j, rc;.  ch
2d6c0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2d6d0 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b  .  if( objc<3 ){
2d6e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2d6f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2d700 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20   objv, "DB NAME 
2d710 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
2d720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d730 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2d740 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2d750 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2d760 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2d770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66  n TCL_ERROR;.  f
2d780 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20  or(j=2; j<objc; 
2d790 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  j++){.    zName 
2d7a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2d7b0 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  objv[j]);.    fo
2d7c0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
2d7d0 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20  ze(aExtension); 
2d7e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2d7f0 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45  strcmp(zName, aE
2d800 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74  xtension[i].zExt
2d810 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
2d820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2d830 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78  i>=ArraySize(aEx
2d840 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20  tension) ){.    
2d850 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2d860 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73  lt(interp, "no s
2d870 75 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22  uch extension: "
2d880 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  , zName, (char*)
2d890 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
2d8a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2d8b0 7d 0a 20 20 20 20 69 66 28 20 61 45 78 74 65 6e  }.    if( aExten
2d8c0 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b  sion[i].pInit ){
2d8d0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 45 78 74  .      rc = aExt
2d8e0 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28  ension[i].pInit(
2d8f0 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29  db, &zErrMsg, 0)
2d900 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d920 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2d930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2d940 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
2d950 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d960 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69  ult(interp, "ini
2d970 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22  tialization of "
2d980 2c 20 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65  , zName, " faile
2d990 64 3a 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20  d: ", zErrMsg,. 
2d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d9b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
2d9c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d9d0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
2d9e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d9f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
2da00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2da10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f  .}../*.**     so
2da20 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
2da30 61 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74  ap BOOL.**.*/.st
2da40 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 72 5f  atic int sorter_
2da50 74 65 73 74 5f 66 61 6b 65 68 65 61 70 28 0a 20  test_fakeheap(. 
2da60 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2da70 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2da80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2da90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2daa0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2dab0 0a 20 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 69  .  int bArg;.  i
2dac0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2dad0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2dae0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2daf0 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b 0a 20 20 20  jv, "BOOL");.   
2db00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2db10 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 54 63  R;.  }..  if( Tc
2db20 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
2db30 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2db40 5b 31 5d 2c 20 26 62 41 72 67 29 20 29 7b 0a 20  [1], &bArg) ){. 
2db50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2db60 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
2db70 62 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  bArg ){.    if( 
2db80 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2db90 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
2dba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2dbb0 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
2dbc0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  = SQLITE_INT_TO_
2dbd0 50 54 52 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  PTR(-1);.    }. 
2dbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2dbf0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2dc00 66 69 67 2e 70 48 65 61 70 3d 3d 53 51 4c 49 54  fig.pHeap==SQLIT
2dc10 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29  E_INT_TO_PTR(-1)
2dc20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2dc30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2dc40 65 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  eap = 0;.    }. 
2dc50 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52   }..  Tcl_ResetR
2dc60 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2dc70 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2dc80 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72  }../*.**     sor
2dc90 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
2dca0 65 6c 70 65 72 20 44 42 20 53 51 4c 31 20 4e 53  elper DB SQL1 NS
2dcb0 54 45 50 20 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43  TEP SQL2.**.** C
2dcc0 6f 6d 70 69 6c 65 20 53 51 4c 20 73 74 61 74 65  ompile SQL state
2dcd0 6d 65 6e 74 20 24 53 51 4c 31 20 61 6e 64 20 73  ment $SQL1 and s
2dce0 74 65 70 20 69 74 20 24 4e 53 54 45 50 20 74 69  tep it $NSTEP ti
2dcf0 6d 65 73 2e 20 46 6f 72 20 65 61 63 68 20 72 6f  mes. For each ro
2dd00 77 2c 20 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61  w, .** check tha
2dd10 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 61  t the leftmost a
2dd20 6e 64 20 72 69 67 68 74 6d 6f 73 74 20 63 6f 6c  nd rightmost col
2dd30 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 61 72  umns returned ar
2dd40 65 20 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2c  e both integers,
2dd50 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 62 6f 74  .** and that bot
2dd60 68 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  h contain the sa
2dd70 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  me value..**.** 
2dd80 54 68 65 6e 20 65 78 65 63 75 74 65 20 73 74 61  Then execute sta
2dd90 74 65 6d 65 6e 74 20 24 53 51 4c 32 2e 20 43 68  tement $SQL2. Ch
2dda0 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 74 61  eck that the sta
2ddb0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74  tement returns t
2ddc0 68 65 20 73 61 6d 65 0a 2a 2a 20 73 65 74 20 6f  he same.** set o
2ddd0 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68  f integers in th
2dde0 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
2ddf0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
2de00 73 74 65 70 20 28 75 73 69 6e 67 20 24 53 51 4c  step (using $SQL
2de10 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1)..*/.static in
2de20 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f  t sorter_test_so
2de30 72 74 34 5f 68 65 6c 70 65 72 28 0a 20 20 76 6f  rt4_helper(.  vo
2de40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2de50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2de60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2de70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2de80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2de90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2dea0 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1;.  const char 
2deb0 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74 20 6e 53  *zSql2;.  int nS
2dec0 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 53 74 65  tep; .  int iSte
2ded0 70 3b 20 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d  p; .  int iCksum
2dee0 31 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 69 43  1 = 0; .  int iC
2def0 6b 73 75 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e  ksum2 = 0; .  in
2df00 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a  t rc;.  int iB;.
2df10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2df20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2df30 53 74 6d 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f  Stmt;.  .  if( o
2df40 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
2df50 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2df60 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2df70 22 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53  "DB SQL1 NSTEP S
2df80 51 4c 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  QL2");.    retur
2df90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2dfa0 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2dfb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2dfc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2dfd0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2dfe0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2dff0 7a 53 71 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53  zSql1 = Tcl_GetS
2e000 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2e010 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2e020 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2e030 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29  objv[3], &nStep)
2e040 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2e050 52 4f 52 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54  ROR;.  zSql2 = T
2e060 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2e070 76 5b 34 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[4]);..  rc = s
2e080 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2e090 32 28 64 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c  2(db, zSql1, -1,
2e0a0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2e0b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e0c0 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2e0d0 72 3b 0a 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  r;..  iB = sqlit
2e0e0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
2e0f0 70 53 74 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28  pStmt)-1;.  for(
2e100 69 53 74 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e  iStep=0; iStep<n
2e110 53 74 65 70 20 26 26 20 53 51 4c 49 54 45 5f 52  Step && SQLITE_R
2e120 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2e130 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b  (pStmt); iStep++
2e140 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73  ){.    int a = s
2e150 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2e160 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2e170 20 69 66 28 20 61 21 3d 73 71 6c 69 74 65 33 5f   if( a!=sqlite3_
2e180 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2e190 2c 20 69 42 29 20 29 7b 0a 20 20 20 20 20 20 54  , iB) ){.      T
2e1a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2e1b0 69 6e 74 65 72 70 2c 20 22 64 61 74 61 20 65 72  interp, "data er
2e1c0 72 6f 72 3a 20 28 61 21 3d 62 29 22 2c 20 30 29  ror: (a!=b)", 0)
2e1d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2e1e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2e1f0 0a 20 20 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20  .    iCksum1 += 
2e200 28 69 43 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b  (iCksum1 << 3) +
2e210 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   a;.  }.  rc = s
2e220 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2e230 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
2e240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2e250 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20  to sql_error;.. 
2e260 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2e270 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
2e280 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  l2, -1, &pStmt, 
2e290 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2e2a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
2e2b0 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66 6f 72 28  ql_error;.  for(
2e2c0 69 53 74 65 70 3d 30 3b 20 53 51 4c 49 54 45 5f  iStep=0; SQLITE_
2e2d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2e2e0 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b  p(pStmt); iStep+
2e2f0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20  +){.    int a = 
2e300 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2e310 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
2e320 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20 28 69 43    iCksum2 += (iC
2e330 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b 20 61 3b  ksum2 << 3) + a;
2e340 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2e350 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2e360 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  mt);.  if( rc!=S
2e370 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2e380 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  sql_error;..  if
2e390 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73 75  ( iCksum1!=iCksu
2e3a0 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  m2 ){.    Tcl_Ap
2e3b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2e3c0 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69 73  p, "checksum mis
2e3d0 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20 20  match", 0);.    
2e3e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e3f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2e400 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72  TCL_OK;. sql_err
2e410 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  or:.  Tcl_Append
2e420 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2e430 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73 71  sql error: ", sq
2e440 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
2e450 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2e460 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69  CL_ERROR;.}...#i
2e470 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
2e480 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2e490 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
2e4a0 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a 0a  3userauth.h"./*.
2e4b0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2e4c0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
2e4d0 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41 4d  icate DB USERNAM
2e4e0 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73 74  E PASSWORD.*/.st
2e4f0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73  atic int test_us
2e500 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
2e510 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2e520 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2e530 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2e540 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2e550 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2e560 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2e570 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2e580 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2e590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e5a0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2e5b0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2e5c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2e5d0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2e5e0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
2e5f0 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20  r *zUser = 0;.  
2e600 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20  char *zPasswd = 
2e610 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64  0;.  int nPasswd
2e620 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
2e630 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
2e640 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2e650 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2e660 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2e670 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e   objv, "DB USERN
2e680 41 4d 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a  AME PASSWORD");.
2e690 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e6a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2e6b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2e6c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2e6d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2e6e0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2e6f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e700 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
2e710 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2e720 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
2e730 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2e740 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
2e750 73 77 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  swd);.  rc = sql
2e760 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
2e770 74 69 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72  ticate(db, zUser
2e780 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73  , zPasswd, nPass
2e790 77 64 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  wd);.  Tcl_SetRe
2e7a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2e7b0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2e7c0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
2e7d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2e7e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2e7f0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2e800 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23  ENTICATION */..#
2e810 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
2e820 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2e830 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2e840 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64  sqlite3_user_add
2e850 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
2e860 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f  SWORD ISADMIN.*/
2e870 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2e880 5f 75 73 65 72 5f 61 64 64 28 0a 20 20 43 6c 69  _user_add(.  Cli
2e890 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2e8a0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2e8b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2e8c0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2e8d0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2e8e0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2e8f0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2e900 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2e910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e920 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2e930 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2e940 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2e950 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2e960 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
2e970 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
2e980 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  zPasswd = 0;.  i
2e990 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a  nt nPasswd = 0;.
2e9a0 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20    int isAdmin = 
2e9b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
2e9c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2e9d0 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
2e9e0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2e9f0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2ea00 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45  jv, "DB USERNAME
2ea10 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
2ea20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
2ea30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea40 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2ea50 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2ea60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2ea70 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
2ea80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ea90 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
2eaa0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2eab0 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20  [2]);.  zPasswd 
2eac0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
2ead0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
2eae0 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c  &nPasswd);.  Tcl
2eaf0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
2eb00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2eb10 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20  4], &isAdmin);. 
2eb20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
2eb30 65 72 5f 61 64 64 28 64 62 2c 20 7a 55 73 65 72  er_add(db, zUser
2eb40 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73  , zPasswd, nPass
2eb50 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20  wd, isAdmin);.  
2eb60 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
2eb70 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
2eb80 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
2eb90 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
2eba0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
2ebb0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2ebc0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2ebd0 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
2ebe0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2ebf0 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2ec00 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2ec10 5f 75 73 65 72 5f 63 68 61 6e 67 65 20 44 42 20  _user_change DB 
2ec20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2ec30 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61  D ISADMIN.*/.sta
2ec40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65  tic int test_use
2ec50 72 5f 63 68 61 6e 67 65 28 0a 20 20 43 6c 69 65  r_change(.  Clie
2ec60 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2ec70 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2ec80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ec90 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2eca0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2ecb0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2ecc0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2ecd0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2ece0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2ecf0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2ed00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2ed10 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2ed20 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2ed30 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
2ed40 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2ed50 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
2ed60 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
2ed70 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30   int isAdmin = 0
2ed80 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2ed90 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2eda0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
2edb0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2edc0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2edd0 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20  v, "DB USERNAME 
2ede0 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
2edf0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2ee00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2ee10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2ee20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2ee30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2ee40 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2ee50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ee60 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c   }.  zUser = Tcl
2ee70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2ee80 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d  2]);.  zPasswd =
2ee90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2eea0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
2eeb0 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f  nPasswd);.  Tcl_
2eec0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
2eed0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
2eee0 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20  ], &isAdmin);.  
2eef0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
2ef00 72 5f 63 68 61 6e 67 65 28 64 62 2c 20 7a 55 73  r_change(db, zUs
2ef10 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61  er, zPasswd, nPa
2ef20 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a  sswd, isAdmin);.
2ef30 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2ef40 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2ef50 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
2ef60 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2ef70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ef80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2ef90 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2efa0 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  ATION */..#ifdef
2efb0 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2efc0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a  HENTICATION./*.*
2efd0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
2efe0 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 20 44  e3_user_delete D
2eff0 42 20 55 53 45 52 4e 41 4d 45 0a 2a 2f 0a 73 74  B USERNAME.*/.st
2f000 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73  atic int test_us
2f010 65 72 5f 64 65 6c 65 74 65 28 0a 20 20 43 6c 69  er_delete(.  Cli
2f020 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2f030 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2f040 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f050 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2f060 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2f070 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2f080 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2f090 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2f0a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f0b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2f0c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2f0d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2f0e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2f0f0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
2f100 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
2f110 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2f120 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
2f130 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2f140 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2f150 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45  1, objv, "DB USE
2f160 52 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  RNAME");.    ret
2f170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2f180 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2f190 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2f1a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2f1b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2f1c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2f1d0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
2f1e0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2f1f0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d  objv[2]);.  rc =
2f200 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65   sqlite3_user_de
2f210 6c 65 74 65 28 64 62 2c 20 7a 55 73 65 72 29 3b  lete(db, zUser);
2f220 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2f230 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2f240 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2f250 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2f260 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2f270 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f280 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2f290 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CATION */../*.**
2f2a0 20 74 63 6c 63 6d 64 3a 20 62 61 64 5f 62 65 68   tclcmd: bad_beh
2f2b0 61 76 69 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a  avior TYPE.**.**
2f2c0 20 44 6f 20 73 6f 6d 65 20 74 68 69 6e 67 73 20   Do some things 
2f2d0 74 68 61 74 20 73 68 6f 75 6c 64 20 74 72 69 67  that should trig
2f2e0 67 65 72 20 61 20 76 61 6c 67 72 69 6e 64 20 6f  ger a valgrind o
2f2f0 72 20 2d 66 73 61 6e 69 74 69 7a 65 3d 75 6e 64  r -fsanitize=und
2f300 65 66 69 6e 65 64 0a 2a 2a 20 77 61 72 6e 69 6e  efined.** warnin
2f310 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
2f320 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
2f330 65 72 72 6f 72 73 20 61 6e 64 20 77 61 72 6e 69  errors and warni
2f340 6e 67 73 20 6f 75 74 70 75 74 20 62 79 20 74 68  ngs output by th
2f350 6f 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72 65  ose.** tools are
2f360 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
2f370 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a 2a   test scripts..*
2f380 2a 0a 2a 2a 20 20 20 20 20 20 20 54 59 50 45 20  *.**       TYPE 
2f390 20 20 20 20 20 20 42 45 48 41 56 49 4f 52 0a 2a        BEHAVIOR.*
2f3a0 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  *       1       
2f3b0 20 20 20 4f 76 65 72 66 6c 6f 77 20 61 20 73 69     Overflow a si
2f3c0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
2f3d0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
2f3e0 20 4a 75 6d 70 20 62 61 73 65 64 20 6f 6e 20 61   Jump based on a
2f3f0 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
2f400 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20  variable.**     
2f410 20 20 33 20 20 20 20 20 20 20 20 20 20 52 65 61    3          Rea
2f420 64 20 61 66 74 65 72 20 66 72 65 65 0a 2a 2a 20  d after free.** 
2f430 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
2f440 20 50 61 6e 69 63 0a 2a 2f 0a 73 74 61 74 69 63   Panic.*/.static
2f450 20 69 6e 74 20 74 65 73 74 5f 62 61 64 5f 62 65   int test_bad_be
2f460 68 61 76 69 6f 72 28 0a 20 20 43 6c 69 65 6e 74  havior(.  Client
2f470 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2f480 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
2f490 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 74 61 69  n integer contai
2f4a0 6e 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 54  ning zero */.  T
2f4b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f4c0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2f4d0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2f4e0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2f4f0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2f500 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2f510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f520 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2f530 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2f540 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2f550 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2f560 0a 20 20 69 6e 74 20 69 54 79 70 65 3b 0a 20 20  .  int iType;.  
2f570 69 6e 74 20 78 79 7a 3b 0a 20 20 69 6e 74 20 69  int xyz;.  int i
2f580 20 3d 20 2a 28 69 6e 74 2a 29 63 6c 69 65 6e 74   = *(int*)client
2f590 44 61 74 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Data;.  int j;. 
2f5a0 20 69 6e 74 20 77 5b 31 30 5d 3b 0a 20 20 69 6e   int w[10];.  in
2f5b0 74 20 2a 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t *a;.  if( objc
2f5c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2f5d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2f5e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 59  rp, 1, objv, "TY
2f5f0 50 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  PE");.    return
2f600 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f610 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2f620 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2f630 6f 62 6a 76 5b 31 5d 2c 20 26 69 54 79 70 65 29  objv[1], &iType)
2f640 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2f650 52 4f 52 3b 0a 20 20 73 77 69 74 63 68 28 20 69  ROR;.  switch( i
2f660 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
2f670 20 31 3a 20 7b 0a 20 20 20 20 20 20 78 79 7a 20   1: {.      xyz 
2f680 3d 20 30 78 37 66 66 66 66 66 30 30 20 2d 20 69  = 0x7fffff00 - i
2f690 3b 0a 20 20 20 20 20 20 78 79 7a 20 2b 3d 20 30  ;.      xyz += 0
2f6a0 78 31 30 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f  x100;.      Tcl_
2f6b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2f6c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
2f6d0 62 6a 28 78 79 7a 29 29 3b 0a 20 20 20 20 20 20  bj(xyz));.      
2f6e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2f6f0 20 63 61 73 65 20 32 3a 20 7b 0a 20 20 20 20 20   case 2: {.     
2f700 20 77 5b 31 5d 20 3d 20 35 3b 0a 20 20 20 20 20   w[1] = 5;.     
2f710 20 69 66 28 20 77 5b 69 5d 3e 30 20 29 20 77 5b   if( w[i]>0 ) w[
2f720 31 5d 2b 2b 3b 0a 20 20 20 20 20 20 54 63 6c 5f  1]++;.      Tcl_
2f730 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2f740 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
2f750 62 6a 28 77 5b 31 5d 29 29 3b 0a 20 20 20 20 20  bj(w[1]));.     
2f760 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2f770 20 20 63 61 73 65 20 33 3a 20 7b 0a 20 20 20 20    case 3: {.    
2f780 20 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69    a = malloc( si
2f790 7a 65 6f 66 28 69 6e 74 29 2a 31 30 20 29 3b 0a  zeof(int)*10 );.
2f7a0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2f7b0 3c 31 30 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d  <10; j++) a[j] =
2f7c0 20 6a 3b 0a 20 20 20 20 20 20 66 72 65 65 28 61   j;.      free(a
2f7d0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
2f7e0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2f7f0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2f800 61 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 62 72  a[i]));.      br
2f810 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2f820 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 54  ase 4: {.      T
2f830 63 6c 5f 50 61 6e 69 63 28 22 44 65 6c 69 62 65  cl_Panic("Delibe
2f840 72 61 74 65 20 70 61 6e 69 63 22 29 3b 0a 20 20  rate panic");.  
2f850 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2f860 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
2f870 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a  L_OK;.}  ../*.**
2f880 20 74 63 6c 63 6d 64 3a 20 20 20 72 65 67 69 73   tclcmd:   regis
2f890 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20  ter_dbstat_vtab 
2f8a0 44 42 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 74  DB.**.** Cause t
2f8b0 68 65 20 64 62 73 74 61 74 20 76 69 72 74 75 61  he dbstat virtua
2f8c0 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 76  l table to be av
2f8d0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 63  ailable on the c
2f8e0 6f 6e 6e 65 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a  onnection DB.*/.
2f8f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2f900 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f  register_dbstat_
2f910 76 74 61 62 28 0a 20 20 76 6f 69 64 20 2a 63 6c  vtab(.  void *cl
2f920 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2f930 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2f940 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2f950 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2f960 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  v[].){.#ifdef SQ
2f970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2f980 4c 54 41 42 4c 45 0a 20 20 54 63 6c 5f 41 70 70  LTABLE.  Tcl_App
2f990 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2f9a0 2c 20 22 64 62 73 74 61 74 20 6e 6f 74 20 61 76  , "dbstat not av
2f9b0 61 69 6c 61 62 6c 65 20 62 65 63 61 75 73 65 20  ailable because 
2f9c0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  of ".           
2f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9e0 22 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  "SQLITE_OMIT_VIR
2f9f0 54 55 41 4c 54 41 42 4c 45 22 2c 20 28 76 6f 69  TUALTABLE", (voi
2fa00 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  d*)0);.  return 
2fa10 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
2fa20 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65  .  struct Sqlite
2fa30 44 62 20 7b 20 73 71 6c 69 74 65 33 20 2a 64 62  Db { sqlite3 *db
2fa40 3b 20 7d 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62  ; };.  char *zDb
2fa50 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  ;.  Tcl_CmdInfo 
2fa60 63 6d 64 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  cmdInfo;..  if( 
2fa70 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2fa80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2fa90 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2faa0 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
2fab0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2fac0 7d 0a 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  }..  zDb = Tcl_G
2fad0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2fae0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
2faf0 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
2fb00 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
2fb10 6f 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  o) ){.    sqlite
2fb20 33 2a 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  3* db = ((struct
2fb30 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
2fb40 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
2fb50 29 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  )->db;.    sqlit
2fb60 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72  e3DbstatRegister
2fb70 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (db);.  }.  retu
2fb80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
2fb90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2fba0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
2fbb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
2fbc0 3a 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  :   sqlite3_db_c
2fbd0 6f 6e 66 69 67 20 44 42 20 53 45 54 54 49 4e 47  onfig DB SETTING
2fbe0 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76   VALUE.**.** Inv
2fbf0 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  oke sqlite3_db_c
2fc00 6f 6e 66 69 67 28 29 20 66 6f 72 20 6f 6e 65 20  onfig() for one 
2fc10 6f 66 20 74 68 65 20 73 65 74 74 69 6e 67 20 76  of the setting v
2fc20 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
2fc30 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
2fc40 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a 20 20 76  3_db_config(.  v
2fc50 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2fc60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2fc70 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2fc80 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2fc90 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2fca0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2fcb0 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
2fcc0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2fcd0 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20 7d 20 61   int eVal;.  } a
2fce0 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b 0a 20 20  Setting[] = {.  
2fcf0 20 20 7b 20 22 46 4b 45 59 22 2c 20 20 20 20 20    { "FKEY",     
2fd00 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
2fd10 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
2fd20 45 59 20 7d 2c 0a 20 20 20 20 7b 20 22 54 52 49  EY },.    { "TRI
2fd30 47 47 45 52 22 2c 20 20 20 20 20 20 20 20 20 53  GGER",         S
2fd40 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
2fd50 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 7d 2c  NABLE_TRIGGER },
2fd60 0a 20 20 20 20 7b 20 22 46 54 53 33 5f 54 4f 4b  .    { "FTS3_TOK
2fd70 45 4e 49 5a 45 52 22 2c 20 20 53 51 4c 49 54 45  ENIZER",  SQLITE
2fd80 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
2fd90 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20  _FTS3_TOKENIZER 
2fda0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
2fdb0 0a 20 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73  .  int v;.  cons
2fdc0 74 20 63 68 61 72 20 2a 7a 53 65 74 74 69 6e 67  t char *zSetting
2fdd0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2fde0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
2fdf0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2fe00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2fe10 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 45 54  1, objv, "DB SET
2fe20 54 49 4e 47 20 56 41 4c 55 45 22 29 3b 0a 20 20  TING VALUE");.  
2fe30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2fe40 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2fe50 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2fe60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2fe70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2fe80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2fe90 4f 52 3b 0a 20 20 7a 53 65 74 74 69 6e 67 20 3d  OR;.  zSetting =
2fea0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2feb0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 73  bjv[2]);.  if( s
2fec0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
2fed0 53 51 4c 49 54 45 5f 2a 22 2c 20 7a 53 65 74 74  SQLITE_*", zSett
2fee0 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69  ing)==0 ) zSetti
2fef0 6e 67 20 2b 3d 20 37 3b 0a 20 20 69 66 28 20 73  ng += 7;.  if( s
2ff00 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
2ff10 44 42 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53 65  DBCONFIG_*", zSe
2ff20 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
2ff30 74 69 6e 67 20 2b 3d 20 39 3b 0a 20 20 69 66 28  ting += 9;.  if(
2ff40 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
2ff50 28 22 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53 65  ("ENABLE_*", zSe
2ff60 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
2ff70 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 66 6f 72  ting += 7;.  for
2ff80 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
2ff90 65 28 61 53 65 74 74 69 6e 67 29 3b 20 69 2b 2b  e(aSetting); i++
2ffa0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
2ffb0 70 28 7a 53 65 74 74 69 6e 67 2c 20 61 53 65 74  p(zSetting, aSet
2ffc0 74 69 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  ting[i].zName)==
2ffd0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
2ffe0 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
2fff0 65 28 61 53 65 74 74 69 6e 67 29 20 29 7b 0a 20  e(aSetting) ){. 
30000 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
30010 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
30020 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
30030 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69  bj("unknown sqli
30040 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 73 65  te3_db_config se
30050 74 74 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20  tting", -1));.  
30060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30070 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
30080 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
30090 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
300a0 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 54 43   &v) ) return TC
300b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
300c0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
300d0 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 65 56 61   aSetting[i].eVa
300e0 6c 2c 20 76 2c 20 26 76 29 3b 0a 20 20 54 63 6c  l, v, &v);.  Tcl
300f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
30100 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
30110 4f 62 6a 28 76 29 29 3b 0a 20 20 72 65 74 75 72  Obj(v));.  retur
30120 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
30130 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
30140 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
30150 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
30160 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
30170 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
30180 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78  p *interp){.  ex
30190 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
301a0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20  _search_count;. 
301b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
301c0 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b  te3_found_count;
301d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
301e0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
301f0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
30200 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
30210 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _file_count;.  e
30220 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
30230 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20  3_sort_count;.  
30240 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30250 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b  e3_current_time;
30260 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
30270 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f  NIX && defined(_
30280 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
30290 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
302a0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72  NG_STYLE.  exter
302b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  n int sqlite3_ho
302c0 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66  stid_num;.#endif
302d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
302e0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
302f0 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ze;.  extern int
30300 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
30310 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 28 76  redCacheReport(v
30320 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20  oid*,.          
30330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30350 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c  Tcl_Interp*,int,
30360 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b  Tcl_Obj*CONST*);
30370 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 5a  .  static int iZ
30380 65 72 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ero = 0;.  stati
30390 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
303a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
303b0 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78    Tcl_CmdProc *x
303c0 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  Proc;.  } aCmd[]
303d0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f   = {.     { "db_
303e0 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  enter",         
303f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
30400 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e  l_CmdProc*)db_en
30410 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
30420 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f    },.     { "db_
30430 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20  leave",         
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
30450 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65  l_CmdProc*)db_le
30460 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ave             
30470 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30480 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
30490 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
304a0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
304b0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20  e3_mprintf_int  
304c0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
304d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
304e0 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  64",         (Tc
304f0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
30500 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
30510 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30520 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
30530 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  g",          (Tc
30540 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
30550 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20  e3_mprintf_long 
30560 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30570 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
30580 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
30590 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
305a0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20  e3_mprintf_str  
305b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
305c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
305d0 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  r",          (Tc
305e0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
305f0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
30600 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30610 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
30620 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63  only",       (Tc
30630 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
30640 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
30650 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  ly},.     { "sql
30660 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
30670 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63  ble",        (Tc
30680 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
30690 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
306a0 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
306b0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
306c0 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63  led",        (Tc
306d0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
306e0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
306f0 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  d },.     { "sql
30700 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
30710 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f  double",   (Tcl_
30720 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
30730 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
30740 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  le},.     { "sql
30750 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74  ite3_mprintf_z_t
30760 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
30770 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
30780 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20  mprintf_z       
30790 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
307a0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65  te3_mprintf_n_te
307b0 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
307c0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
307d0 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20  printf_n        
307e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
307f0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22  e3_snprintf_int"
30800 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
30810 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e  CmdProc*)test_sn
30820 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d  printf_int     }
30830 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30840 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
30850 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43  wid",     (Tcl_C
30860 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73  mdProc*)test_las
30870 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c  t_rowid       },
30880 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30890 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20  _exec_printf",  
308a0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
308b0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
308c0 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a  _printf      },.
308d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
308e0 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20  exec_hex",      
308f0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
30900 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
30910 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  hex         },. 
30920 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30930 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  xec",           
30940 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
30950 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20  roc*)test_exec  
30960 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30970 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
30980 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20  ec_nr",         
30990 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
309a0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72  oc*)test_exec_nr
309b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
309c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
309d0 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20  _GET_TABLE.     
309e0 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  { "sqlite3_get_t
309f0 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20  able_printf",   
30a00 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
30a10 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f  )test_get_table_
30a20 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66  printf },.#endif
30a30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30a40 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  _close",        
30a50 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
30a60 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
30a70 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a  st_close     },.
30a80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30a90 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20  close_v2",      
30aa0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
30ab0 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
30ac0 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20  t_close_v2  },. 
30ad0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
30ae0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  reate_function",
30af0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
30b00 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
30b10 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20  _function  },.  
30b20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
30b30 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c  eate_aggregate",
30b40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
30b50 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
30b60 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20  aggregate },.   
30b70 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69    { "sqlite_regi
30b80 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
30b90 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  on", (Tcl_CmdPro
30ba0 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72  c*)test_register
30bb0 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20  _func    },.    
30bc0 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74   { "sqlite_abort
30bd0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30be0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
30bf0 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20  *)sqlite_abort  
30c00 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
30c10 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c  { "sqlite_bind",
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
30c40 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20  )test_bind      
30c50 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
30c60 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20   "breakpoint",  
30c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c80 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
30c90 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20  test_breakpoint 
30ca0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
30cb0 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20  "sqlite3_key",  
30cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
30ce0 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20  est_key         
30cf0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
30d00 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20  sqlite3_rekey", 
30d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
30d30 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20  st_rekey        
30d40 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
30d50 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22  qlite_set_magic"
30d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
30d70 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
30d80 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20  ite_set_magic   
30d90 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
30da0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22  lite3_interrupt"
30db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
30dc0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
30dd0 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20  _interrupt      
30de0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30df0 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
30e00 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  ion",        (Tc
30e10 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
30e20 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20  e_function      
30e30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30e40 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
30e50 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
30e60 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
30e70 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20  _collation      
30e80 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30e90 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
30ea0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
30eb0 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74  CmdProc*)get_aut
30ec0 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d  ocommit        }
30ed0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30ee0 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20  3_stack_used",  
30ef0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
30f00 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61  mdProc*)test_sta
30f10 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c  ck_used       },
30f20 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30f30 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20  _busy_timeout", 
30f40 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
30f50 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79  dProc*)test_busy
30f60 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a  _timeout     },.
30f70 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c       { "printf",
30f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f90 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
30fa0 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74  Proc*)test_print
30fb0 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f           },. 
30fc0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f      { "sqlite3Io
30fd0 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  Trace",         
30fe0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
30ff0 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  c*)test_io_trace
31000 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31010 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69   { "clang_saniti
31020 7a 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20  ze_address",    
31030 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
31040 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65  *)clang_sanitize
31050 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b  _address },.  };
31060 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
31070 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
31080 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
31090 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
310a0 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
310b0 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
310c0 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
310d0 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e   "sqlite3_db_con
310e0 66 69 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  fig",           
310f0 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64    test_sqlite3_d
31100 62 5f 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 20  b_config, 0 },. 
31110 20 20 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76      { "bad_behav
31120 69 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ior",           
31130 20 20 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f         test_bad_
31140 62 65 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64  behavior,  (void
31150 2a 29 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20  *)&iZero },.    
31160 20 7b 20 22 72 65 67 69 73 74 65 72 5f 64 62 73   { "register_dbs
31170 74 61 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20  tat_vtab",      
31180 20 20 20 20 74 65 73 74 5f 72 65 67 69 73 74 65      test_registe
31190 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d  r_dbstat_vtab  }
311a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
311b0 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
311c0 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71  nter",    get_sq
311d0 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20  lite_pointer, 0 
311e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
311f0 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20  e3_bind_int",   
31200 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
31210 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30  bind_int,      0
31220 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
31230 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
31240 62 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  b",         test
31250 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20  _bind_zeroblob, 
31260 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
31270 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
31280 6f 62 36 34 22 2c 20 20 20 20 20 20 20 74 65 73  ob64",       tes
31290 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  t_bind_zeroblob6
312a0 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  4, 0 },.     { "
312b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
312c0 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  64",            
312d0 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c  test_bind_int64,
312e0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
312f0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f  "sqlite3_bind_do
31300 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  uble",          
31310 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
31320 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  e,   0 },.     {
31330 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e   "sqlite3_bind_n
31340 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ull",           
31350 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c    test_bind_null
31360 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
31370 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
31380 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20  text",          
31390 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78     test_bind_tex
313a0 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  t     ,0 },.    
313b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
313c0 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20 20  _text16",       
313d0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
313e0 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt16   ,0 },.   
313f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
31400 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  d_blob",        
31410 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62       test_bind_b
31420 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  lob     ,0 },.  
31430 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
31440 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
31450 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  nt",  test_bind_
31460 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c  parameter_count,
31470 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
31480 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
31490 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  ter_name",   tes
314a0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
314b0 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20  _name,  0},.    
314c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
314d0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
314e0 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ",  test_bind_pa
314f0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30  rameter_index, 0
31500 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31510 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
31520 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  s",        test_
31530 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20  clear_bindings, 
31540 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
31550 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20 20 20  te3_sleep",     
31560 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
31570 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  _sleep,         
31580 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
31590 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20  ite3_errcode",  
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
315b0 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20  t_errcode       
315c0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
315d0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
315e0 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 74 65  rrcode",      te
315f0 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20 20 20  st_ex_errcode   
31600 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
31610 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20  qlite3_errmsg", 
31620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
31630 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20  est_errmsg      
31640 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
31650 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
31660 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31670 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20  test_errmsg16   
31680 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
31690 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20  "sqlite3_open", 
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316b0 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20   test_open      
316c0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
316d0 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36   "sqlite3_open16
316e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
316f0 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20    test_open16   
31700 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
31710 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  { "sqlite3_open_
31720 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
31730 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 20     test_open_v2 
31740 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
31750 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70   { "sqlite3_comp
31760 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20 20  lete16",        
31770 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74      test_complet
31780 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20  e16    ,0 },..  
31790 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
317a0 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20 20  epare",         
317b0 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
317c0 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  re       ,0 },. 
317d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
317e0 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20 20  repare16",      
317f0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
31800 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a  are16     ,0 },.
31810 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31820 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20 20 20  prepare_v2",    
31830 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
31840 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20 7d 2c  pare_v2    ,0 },
31850 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31860 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
31870 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 72  ",       test_pr
31880 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c 20 30  epare_tkt3134, 0
31890 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
318a0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 22  e3_prepare16_v2"
318b0 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
318c0 70 72 65 70 61 72 65 31 36 5f 76 32 20 20 2c 30  prepare16_v2  ,0
318d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
318e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20  te3_finalize",  
318f0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
31900 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c  _finalize      ,
31910 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
31920 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
31930 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
31940 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 20  t_stmt_status   
31950 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
31960 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20 20 20  lite3_reset",   
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
31980 73 74 5f 72 65 73 65 74 20 20 20 20 20 20 20 20  st_reset        
31990 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
319a0 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 22 2c  qlite3_expired",
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
319c0 65 73 74 5f 65 78 70 69 72 65 64 20 20 20 20 20  est_expired     
319d0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
319e0 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72  sqlite3_transfer
319f0 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20  _bindings",     
31a00 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69  test_transfer_bi
31a10 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  nd ,0 },.     { 
31a20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73  "sqlite3_changes
31a30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31a40 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20 20 20   test_changes   
31a50 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
31a60 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70 22 2c   "sqlite3_step",
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a80 20 20 74 65 73 74 5f 73 74 65 70 20 20 20 20 20    test_step     
31a90 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
31aa0 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c 22 2c  { "sqlite3_sql",
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20 20 20     test_sql     
31ad0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
31ae0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65 78 74   { "sqlite3_next
31af0 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20 20 20  _stmt",         
31b00 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f 73 74      test_next_st
31b10 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  mt     ,0 },.   
31b20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d    { "sqlite3_stm
31b30 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20  t_readonly",    
31b40 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 72       test_stmt_r
31b50 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20  eadonly ,0 },.  
31b60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
31b70 6d 74 5f 62 75 73 79 22 2c 20 20 20 20 20 20 20  mt_busy",       
31b80 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
31b90 62 75 73 79 20 20 20 20 20 2c 30 20 7d 2c 0a 20  busy     ,0 },. 
31ba0 20 20 20 20 7b 20 22 75 73 65 73 5f 73 74 6d 74      { "uses_stmt
31bb0 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20 20 20 20  _journal",      
31bc0 20 20 20 20 20 20 20 75 73 65 73 5f 73 74 6d 74         uses_stmt
31bd0 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a  _journal ,0 },..
31be0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31bf0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c  release_memory",
31c00 20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 6c          test_rel
31c10 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20  ease_memory,    
31c20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
31c30 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
31c40 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 74 65 73  memory",     tes
31c50 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  t_db_release_mem
31c60 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ory,  0},.     {
31c70 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63   "sqlite3_db_cac
31c80 68 65 66 6c 75 73 68 22 2c 20 20 20 20 20 20 20  heflush",       
31c90 20 20 74 65 73 74 5f 64 62 5f 63 61 63 68 65 66    test_db_cachef
31ca0 6c 75 73 68 2c 20 20 20 20 20 20 30 7d 2c 0a 20  lush,      0},. 
31cb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
31cc0 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20  b_filename",    
31cd0 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66         test_db_f
31ce0 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
31cf0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
31d00 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22  te3_db_readonly"
31d10 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
31d20 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20  _db_readonly,   
31d30 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
31d40 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
31d50 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
31d60 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
31d70 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
31d80 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
31d90 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
31da0 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
31db0 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
31dc0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31dd0 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
31de0 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
31df0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
31e00 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
31e10 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
31e20 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
31e30 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
31e40 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
31e50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
31e60 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
31e70 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
31e80 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
31e90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31ea0 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
31eb0 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
31ec0 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
31ed0 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
31ee0 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
31ef0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31f00 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
31f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
31f20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
31f30 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
31f40 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
31f50 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
31f60 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
31f70 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
31f80 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
31f90 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
31fa0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
31fb0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
31fd0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
31fe0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64    0 },.     { "d
31ff0 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f  atabase_never_co
32000 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 64  rrupt",        d
32010 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f  atabase_never_co
32020 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20  rrupt, 0},.     
32030 7b 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f  { "database_may_
32040 62 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  be_corrupt",    
32050 20 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f     database_may_
32060 62 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a  be_corrupt, 0},.
32070 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61       { "optimiza
32080 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20  tion_control",  
32090 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61          optimiza
320a0 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c  tion_control,0},
320b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
320c0 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f  IN.     { "lock_
320d0 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20  win32_file",    
320e0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
320f0 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30  _file_lock,    0
32100 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73   },.     { "exis
32110 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20  ts_win32_path", 
32120 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
32130 32 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20  2_exists_path,  
32140 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e  0 },.     { "fin
32150 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20  d_win32_file",  
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
32170 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20  32_find_file,   
32180 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65   0 },.     { "de
32190 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22  lete_win32_file"
321a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ,             wi
321b0 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c  n32_delete_file,
321c0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d    0 },.     { "m
321d0 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20  ake_win32_dir", 
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
321f0 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20  in32_mkdir,     
32200 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
32210 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72  remove_win32_dir
32220 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32230 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20  win32_rmdir,    
32240 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
32250 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70       { "tcl_objp
32260 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  roc",           
32270 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a          runAsObj
32280 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c  Proc,       0 },
32290 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ..     /* sqlite
322a0 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49  3_column_*() API
322b0 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
322c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
322d0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
322e0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c  _column_count  ,
322f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32300 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22  ite3_data_count"
32310 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
32320 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20  t_data_count    
32330 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
32340 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
32350 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
32360 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20  st_column_type  
32370 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
32380 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
32390 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ob",           t
323a0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  est_column_blob 
323b0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
323c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
323d0 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
323e0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
323f0 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  le ,0 },.     { 
32400 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
32410 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
32420 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
32430 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  64  ,0 },.     {
32440 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
32450 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73  _text",   test_s
32460 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64  tmt_utf8,  (void
32470 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
32480 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20  _text },.     { 
32490 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
324a0 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74  name",   test_st
324b0 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
324c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
324d0 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  name },.     { "
324e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
324f0 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d  nt",    test_stm
32500 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29  t_int,   (void*)
32510 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
32520 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  nt  },.     { "s
32530 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
32540 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  tes",  test_stmt
32550 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
32560 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
32570 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  tes},.#ifndef SQ
32580 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
32590 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
325a0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
325b0 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  pe",test_stmt_ut
325c0 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
325d0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
325e0 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  e},.#endif.#ifde
325f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
32600 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
32610 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
32620 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22  n_database_name"
32630 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
32640 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
32650 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
32660 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
32670 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
32680 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
32690 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
326a0 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
326b0 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
326c0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
326d0 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
326e0 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
326f0 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
32700 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a  _name},.#endif..
32710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32720 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
32730 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
32740 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f  _bytes16", test_
32750 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a  stmt_int, (void*
32760 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
32770 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20  bytes16 },.     
32780 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
32790 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74  n_text16",  test
327a0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
327b0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
327c0 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20  mn_text16},.    
327d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
327e0 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73  mn_name16",  tes
327f0 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
32800 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
32810 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20  umn_name16},.   
32820 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65    { "add_alignme
32830 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
32840 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65  ns", add_alignme
32850 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
32860 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69  ns, 0      },.#i
32870 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32880 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
32890 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
328a0 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65  n_decltype16",te
328b0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76  st_stmt_utf16,(v
328c0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
328d0 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c  umn_decltype16},
328e0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
328f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
32900 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73  UMN_METADATA.{"s
32910 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
32920 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a  tabase_name16",.
32930 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
32940 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
32950 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
32960 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c  e_name16},.{"sql
32970 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
32980 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  e_name16", test_
32990 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
329a0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
329b0 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c  n_table_name16},
329c0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
329d0 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22  n_origin_name16"
329e0 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
329f0 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
32a00 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
32a10 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  name16},.#endif.
32a20 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
32a30 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
32a40 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  llation_v2", tes
32a50 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
32a60 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
32a70 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62   { "sqlite3_glob
32a80 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20  al_recover",    
32a90 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
32aa0 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20  over, 0   },.   
32ab0 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62    { "working_64b
32ac0 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  it_int",        
32ad0 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
32ae0 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  int,   0   },.  
32af0 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b     { "vfs_unlink
32b00 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
32b10 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
32b20 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
32b30 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66      { "vfs_initf
32b40 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ail_test",      
32b50 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c      vfs_initfail
32b60 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
32b70 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65       { "vfs_unre
32b80 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
32b90 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73       vfs_unregis
32ba0 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
32bb0 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72  .     { "vfs_rer
32bc0 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
32bd0 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69        vfs_reregi
32be0 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
32bf0 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
32c00 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20  ontrol_test",   
32c10 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
32c20 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  rol_test,   0   
32c30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
32c40 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
32c50 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  o_test", file_co
32c60 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
32c70 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
32c80 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
32c90 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
32ca0 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
32cb0 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c  _lockproxy_test,
32cc0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
32cd0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68  "file_control_ch
32ce0 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66  unksize_test", f
32cf0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
32d00 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20  ksize_test,  0  
32d10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
32d20 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e  _control_sizehin
32d30 74 5f 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63  t_test",  file_c
32d40 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
32d50 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23  test,   0   },.#
32d60 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
32d70 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
32d80 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72  ntrol_win32_av_r
32d90 65 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  etry", file_cont
32da0 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
32db0 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  ry,  0   },.    
32dc0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
32dd0 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
32de0 65 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  e", file_control
32df0 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
32e00 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  e, 0  },.#endif.
32e10 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
32e20 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
32e30 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  ",    file_contr
32e40 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20  ol_persist_wal, 
32e50 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
32e60 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
32e70 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
32e80 69 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite",file_contro
32e90 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
32ea0 77 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b  write,0},.     {
32eb0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76   "file_control_v
32ec0 66 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20  fsname",        
32ed0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
32ee0 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20  name,         0 
32ef0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
32f00 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
32f10 6c 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f  lename",   file_
32f20 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
32f30 6e 61 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a  name,    0   },.
32f40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32f50 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20  vfs_list",      
32f60 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20       vfs_list,  
32f70 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
32f80 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
32f90 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74  _function_v2", t
32fa0 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
32fb0 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20  ion_v2, 0 },..  
32fc0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20     /* Functions 
32fd0 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66  from os.h */.#if
32fe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32ff0 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61  _UTF16.     { "a
33000 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  dd_test_collate"
33010 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f  ,        test_co
33020 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20  llate, 0        
33030 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
33040 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
33050 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f  needed", test_co
33060 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20  llate_needed, 0 
33070 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
33080 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  dd_test_function
33090 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75  ",       test_fu
330a0 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20  nction, 0       
330b0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61      },.     { "a
330c0 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e  dd_test_utf16bin
330d0 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65  _collate",    te
330e0 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
330f0 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c  ate, 0        },
33100 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
33110 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72  sqlite3_test_err
33120 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65  str",     test_e
33130 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20  rrstr, 0        
33140 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
33150 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
33160 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61  e",       tcl_va
33170 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20  riable_type, 0  
33180 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20       },.#ifndef 
33190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
331a0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20  ED_CACHE.     { 
331b0 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f  "sqlite3_enable_
331c0 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74  shared_cache", t
331d0 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  est_enable_share
331e0 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  d, 0  },.     { 
331f0 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f  "sqlite3_shared_
33200 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73  cache_report", s
33210 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65  qlite3BtreeShare
33220 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d  dCacheReport, 0}
33230 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
33240 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73  "sqlite3_libvers
33250 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73  ion_number", tes
33260 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  t_libversion_num
33270 62 65 72 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  ber, 0  },.     
33280 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  { "sqlite3_table
33290 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
332a0 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f  ", test_table_co
332b0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30  lumn_metadata, 0
332c0 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c    },.#ifndef SQL
332d0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
332e0 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  B.     { "sqlite
332f0 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20  3_blob_reopen", 
33300 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  test_blob_reopen
33310 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
33320 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74      { "pcache_st
33330 61 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  ats",       test
33340 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30  _pcache_stats, 0
33350 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49    },.#ifdef SQLI
33360 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
33370 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22  _NOTIFY.     { "
33380 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
33390 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c  otify", test_unl
333a0 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d  ock_notify, 0  }
333b0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
333c0 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  "sqlite3_wal_che
333d0 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65 73 74  ckpoint",   test
333e0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c  _wal_checkpoint,
333f0 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   0  },.     { "s
33400 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
33410 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77  point_v2",test_w
33420 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
33430 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
33440 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
33450 63 68 65 63 6b 70 6f 69 6e 74 22 2c 74 65 73 74  checkpoint",test
33460 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
33470 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  int, 0  },.     
33480 7b 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  { "test_sqlite3_
33490 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65  log",         te
334a0 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20  st_sqlite3_log, 
334b0 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  0  },.#ifndef SQ
334c0 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
334d0 4e 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f  N.     { "print_
334e0 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c  explain_query_pl
334f0 61 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f  an", test_print_
33500 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  eqp, 0  },.#endi
33510 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
33520 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c  3_test_control",
33530 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72   test_test_contr
33540 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45  ol },.#if SQLITE
33550 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20  _OS_UNIX.     { 
33560 22 67 65 74 72 75 73 61 67 65 22 2c 20 74 65 73  "getrusage", tes
33570 74 5f 67 65 74 72 75 73 61 67 65 20 7d 2c 0a 23  t_getrusage },.#
33580 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f  endif.     { "lo
33590 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73  ad_static_extens
335a0 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61  ion", tclLoadSta
335b0 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20  ticExtensionCmd 
335c0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65  },.     { "sorte
335d0 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 22  r_test_fakeheap"
335e0 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  , sorter_test_fa
335f0 6b 65 68 65 61 70 20 7d 2c 0a 20 20 20 20 20 7b  keheap },.     {
33600 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f   "sorter_test_so
33610 72 74 34 5f 68 65 6c 70 65 72 22 2c 20 73 6f 72  rt4_helper", sor
33620 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
33630 65 6c 70 65 72 20 7d 2c 0a 23 69 66 64 65 66 20  elper },.#ifdef 
33640 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
33650 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20  ENTICATION.     
33660 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  { "sqlite3_user_
33670 61 75 74 68 65 6e 74 69 63 61 74 65 22 2c 20 74  authenticate", t
33680 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  est_user_authent
33690 69 63 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20  icate, 0 },.    
336a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72   { "sqlite3_user
336b0 5f 61 64 64 22 2c 20 20 20 20 20 20 20 20 20 20  _add",          
336c0 74 65 73 74 5f 75 73 65 72 5f 61 64 64 2c 20 20  test_user_add,  
336d0 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
336e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65    { "sqlite3_use
336f0 72 5f 63 68 61 6e 67 65 22 2c 20 20 20 20 20 20  r_change",      
33700 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67   test_user_chang
33710 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  e,       0 },.  
33720 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73     { "sqlite3_us
33730 65 72 5f 64 65 6c 65 74 65 22 2c 20 20 20 20 20  er_delete",     
33740 20 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65    test_user_dele
33750 74 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  te,       0 },.#
33760 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
33770 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
33780 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20  SCANSTATUS.     
33790 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
337a0 73 63 61 6e 73 74 61 74 75 73 22 2c 20 20 20 20  scanstatus",    
337b0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61     test_stmt_sca
337c0 6e 73 74 61 74 75 73 2c 20 20 20 30 20 7d 2c 0a  nstatus,   0 },.
337d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
337e0 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f  stmt_scanstatus_
337f0 72 65 73 65 74 22 2c 20 74 65 73 74 5f 73 74 6d  reset", test_stm
33800 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
33810 65 74 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69  et,   0 },.#endi
33820 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
33830 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
33840 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
33850 6e 66 69 67 5f 73 71 6c 6c 6f 67 22 2c 20 20 20  nfig_sqllog",   
33860 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6e 66 69        test_confi
33870 67 5f 73 71 6c 6c 6f 67 2c 20 20 20 30 20 7d 2c  g_sqllog,   0 },
33880 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
33890 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  vfs_current_time
338a0 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
338b0 20 20 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d     vfsCurrentTim
338c0 65 49 6e 74 36 34 2c 20 20 20 30 20 7d 2c 0a 23  eInt64,   0 },.#
338d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
338e0 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 20 20 20  BLE_SNAPSHOT.   
338f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61    { "sqlite3_sna
33900 70 73 68 6f 74 5f 67 65 74 22 2c 20 74 65 73 74  pshot_get", test
33910 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 2c 20 30  _snapshot_get, 0
33920 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
33930 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  te3_snapshot_ope
33940 6e 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  n", test_snapsho
33950 74 5f 6f 70 65 6e 2c 20 30 20 7d 2c 0a 20 20 20  t_open, 0 },.   
33960 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61    { "sqlite3_sna
33970 70 73 68 6f 74 5f 66 72 65 65 22 2c 20 74 65 73  pshot_free", tes
33980 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 2c  t_snapshot_free,
33990 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d   0 },.#endif.  }
339a0 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62  ;.  static int b
339b0 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69  itmask_size = si
339c0 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b  zeof(Bitmask)*8;
339d0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  .  static int lo
339e0 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65 20 3d 20  ngdouble_size = 
339f0 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c  sizeof(LONGDOUBL
33a00 45 5f 54 59 50 45 29 3b 0a 20 20 69 6e 74 20 69  E_TYPE);.  int i
33a10 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
33a20 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
33a30 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  t, sqlite3_fulls
33a40 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ync_count;.  ext
33a50 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
33a60 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a  opentemp_count;.
33a70 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
33a80 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b  ite3_like_count;
33a90 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
33aa0 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
33ab0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
33ac0 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
33ad0 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  readdb_count;.  
33ae0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
33af0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62  e3_pager_writedb
33b00 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
33b10 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
33b20 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 3b  er_writej_count;
33b30 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
33b40 49 4e 0a 20 20 65 78 74 65 72 6e 20 4c 4f 4e 47  IN.  extern LONG
33b50 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74 65   volatile sqlite
33b60 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64 69  3_os_type;.#endi
33b70 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
33b80 44 45 42 55 47 0a 20 20 65 78 74 65 72 6e 20 69  DEBUG.  extern i
33b90 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54  nt sqlite3WhereT
33ba0 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
33bb0 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72 61 63  nt sqlite3OSTrac
33bc0 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
33bd0 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 3b  sqlite3WalTrace;
33be0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
33bf0 51 4c 49 54 45 5f 54 45 53 54 0a 23 69 66 64 65  QLITE_TEST.#ifde
33c00 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
33c10 46 54 53 33 0a 20 20 65 78 74 65 72 6e 20 69 6e  FTS3.  extern in
33c20 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65  t sqlite3_fts3_e
33c30 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65  nable_parenthese
33c40 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  s;.#endif.#endif
33c50 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ..  for(i=0; i<s
33c60 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a 65  izeof(aCmd)/size
33c70 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b  of(aCmd[0]); i++
33c80 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ){.    Tcl_Creat
33c90 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  eCommand(interp,
33ca0 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20   aCmd[i].zName, 
33cb0 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 30  aCmd[i].xProc, 0
33cc0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  , 0);.  }.  for(
33cd0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f  i=0; i<sizeof(aO
33ce0 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 4f  bjCmd)/sizeof(aO
33cf0 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  bjCmd[0]); i++){
33d00 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
33d10 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
33d20 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61  , aObjCmd[i].zNa
33d30 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f 62  me, .        aOb
33d40 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20 61  jCmd[i].xProc, a
33d50 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74  ObjCmd[i].client
33d60 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Data, 0);.  }.  
33d70 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
33d80 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61 72  rp, "sqlite_sear
33d90 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ch_count", .    
33da0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
33db0 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c 20  3_search_count, 
33dc0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
33dd0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
33de0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 6f 75  erp, "sqlite_fou
33df0 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  nd_count", .    
33e00 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
33e10 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20 54  3_found_count, T
33e20 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
33e30 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
33e40 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72 74  rp, "sqlite_sort
33e50 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
33e60 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
33e70 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sort_count, TCL_
33e80 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
33e90 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
33ea0 20 22 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c   "sqlite3_max_bl
33eb0 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20 20 20 20  obsize", .      
33ec0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
33ed0 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54 43  max_blobsize, TC
33ee0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
33ef0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
33f00 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65 5f  p, "sqlite_like_
33f10 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
33f20 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6c  char*)&sqlite3_l
33f30 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ike_count, TCL_L
33f40 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
33f50 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
33f60 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75 70  "sqlite_interrup
33f70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
33f80 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
33f90 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
33fa0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
33fb0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
33fc0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
33fd0 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22 2c  pen_file_count",
33fe0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
33ff0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c  sqlite3_open_fil
34000 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  e_count, TCL_LIN
34010 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
34020 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
34030 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
34040 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  me", .      (cha
34050 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72 72  r*)&sqlite3_curr
34060 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c 49  ent_time, TCL_LI
34070 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 53 51 4c  NK_INT);.#if SQL
34080 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
34090 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
340a0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
340b0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
340c0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
340d0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 68  nterp, "sqlite_h
340e0 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a 20 20 20  ostid_num", .   
340f0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
34100 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 2c 20 54  e3_hostid_num, T
34110 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
34120 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  ndif.  Tcl_LinkV
34130 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34140 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
34150 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
34160 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70  )&sqlite3_xferop
34170 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
34180 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
34190 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
341a0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
341b0 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  ddb_count",.    
341c0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
341d0 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
341e0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
341f0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
34200 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34210 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
34220 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  b_count",.      
34230 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
34240 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
34250 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
34260 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
34270 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
34280 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
34290 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
342a0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
342b0 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
342c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
342d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
342e0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
342f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
34300 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69   "unaligned_stri
34310 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20 20  ng_counter",.   
34320 20 20 20 28 63 68 61 72 2a 29 26 75 6e 61 6c 69     (char*)&unali
34330 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
34340 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ter, TCL_LINK_IN
34350 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  T);.#endif.#ifnd
34360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
34370 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
34380 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34390 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f 63  te_last_needed_c
343a0 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20 20  ollation",.     
343b0 20 28 63 68 61 72 2a 29 26 70 7a 4e 65 65 64 65   (char*)&pzNeede
343c0 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f  dCollation, TCL_
343d0 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f  LINK_STRING|TCL_
343e0 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b  LINK_READ_ONLY);
343f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
34400 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c 5f  TE_OS_WIN.  Tcl_
34410 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
34420 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65 22  "sqlite_os_type"
34430 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
34440 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
34450 20 54 43 4c 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b   TCL_LINK_LONG);
34460 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
34470 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20  QLITE_TEST.  {. 
34480 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
34490 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61 6e  char *query_plan
344a0 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f 4c 45 54 45   = "*** OBSOLETE
344b0 20 56 41 52 49 41 42 4c 45 20 2a 2a 2a 22 3b 0a   VARIABLE ***";.
344c0 20 20 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28      Tcl_LinkVar(
344d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
344e0 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20 20  query_plan",.   
344f0 20 20 20 20 28 63 68 61 72 2a 29 26 71 75 65 72      (char*)&quer
34500 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b  y_plan, TCL_LINK
34510 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b  _STRING|TCL_LINK
34520 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 7d  _READ_ONLY);.  }
34530 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
34540 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54 63  QLITE_DEBUG.  Tc
34550 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
34560 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65 5f  , "sqlite_where_
34570 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
34580 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68 65  har*)&sqlite3Whe
34590 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  reTrace, TCL_LIN
345a0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
345b0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
345c0 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22 2c  qlite_os_trace",
345d0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
345e0 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20 54  qlite3OSTrace, T
345f0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
34600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34610 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b  T_WAL.  Tcl_Link
34620 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
34630 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c 0a  ite_wal_trace",.
34640 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
34650 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20 54  lite3WalTrace, T
34660 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
34670 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ndif.#endif.#ifn
34680 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34690 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e  DISKIO.  Tcl_Lin
346a0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
346b0 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  lite_opentemp_co
346c0 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
346d0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e  r*)&sqlite3_open
346e0 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  temp_count, TCL_
346f0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
34700 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  f.  Tcl_LinkVar(
34710 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
34720 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
34730 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
34740 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  )&sqlite_static_
34750 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c 5f  bind_value, TCL_
34760 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
34770 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
34780 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
34790 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c 0a  ic_bind_nbyte",.
347a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
347b0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
347c0 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _nbyte, TCL_LINK
347d0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
347e0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
347f0 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63 74  lite_temp_direct
34800 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ory",.      (cha
34810 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d 70  r*)&sqlite3_temp
34820 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f  _directory, TCL_
34830 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20  LINK_STRING);.  
34840 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
34850 72 70 2c 20 22 73 71 6c 69 74 65 5f 64 61 74 61  rp, "sqlite_data
34860 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
34870 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
34880 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
34890 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
348a0 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
348b0 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74 6d  ar(interp, "bitm
348c0 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20  ask_size",.     
348d0 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73 6b   (char*)&bitmask
348e0 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _size, TCL_LINK_
348f0 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  INT|TCL_LINK_REA
34900 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c  D_ONLY);.  Tcl_L
34910 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
34920 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65 22  longdouble_size"
34930 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
34940 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65 2c  longdouble_size,
34950 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
34960 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
34970 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
34980 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
34990 5f 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  _sync_count",.  
349a0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
349b0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  te3_sync_count, 
349c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
349d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
349e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c  erp, "sqlite_ful
349f0 6c 73 79 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20  lsync_count",.  
34a00 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
34a10 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
34a20 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
34a30 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
34a40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
34a50 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  3) && defined(SQ
34a60 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 54 63 6c  LITE_TEST).  Tcl
34a70 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
34a80 20 22 73 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e   "sqlite_fts3_en
34a90 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
34aa0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
34ab0 26 73 71 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e  &sqlite3_fts3_en
34ac0 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73 65 73  able_parentheses
34ad0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
34ae0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
34af0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a                  TCL_OK;.}.