/ Hex Artifact Content
Login

Artifact 05df2a9e4f483b2fb642162209e3aeb11c24b44f:


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 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
47a0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
47b0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
47c0: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
47d0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
47e0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
47f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4800: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4810: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4820: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4830: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4840: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4860: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4870: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4880: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4890: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
48a0: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
48b0: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
48c0: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
48d0: 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  3_key(db, zKey, 
48e0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
48f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4900: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
4910: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42  sqlite3_rekey DB
4920: 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67   KEY.**.** Chang
4930: 65 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e  e the codec key.
4940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4950: 65 73 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69  est_rekey(.  voi
4960: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4970: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4980: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4990: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
49a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
49b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
49c0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
49d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
49e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
49f0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4a00: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4a10: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4a20: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
4a30: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
4a40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
4a50: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
4a60: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
4a70: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
4a80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4a90: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4aa0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4ab0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
4ac0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
4ad0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
4ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4af0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
4b00: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
4b10: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4b30: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
4b40: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
4b50: 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69  en(zKey);.  sqli
4b60: 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b  te3_rekey(db, zK
4b70: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
4b80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
4b90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4ba0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  e:  sqlite3_clos
4bb0: 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  e DB.**.** Close
4bc0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4bd0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4be0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4bf0: 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74   int sqlite_test
4c00: 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a  _close(.  void *
4c10: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4c20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4c30: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4c40: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4c50: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4c60: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4c90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
4ca0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4cb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4cc0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4ce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
4cf0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
4d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4d10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4d20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4d30: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4d40: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
4d50: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4d70: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
4d80: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
4d90: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
4da0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4db0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
4dc0: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  lose(db);.  Tcl_
4dd0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
4de0: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
4df0: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
4e00: 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
4e10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4e20: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4e30: 33 5f 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a  3_close_v2 DB.**
4e40: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4e50: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4e60: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4e80: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f  lite_test_close_
4e90: 76 32 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  v2(.  void *NotU
4ea0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4eb0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ec0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4ed0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4ee0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4ef0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4f10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4f20: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4f30: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4f40: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4f50: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
4f60: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
4f70: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
4f80: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
4f90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4fa0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4fb0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4fc0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4fd0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
4fe0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4ff0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5000: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
5010: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
5020: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
5030: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
5040: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
5050: 5f 76 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  _v2(db);.  Tcl_S
5060: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
5070: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
5080: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
5090: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
50a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
50b0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
50c0: 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63  of the x_coalesc
50d0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
50e0: 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   Return the firs
50f0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e  t argument non-N
5100: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
5110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f  .static void t1_
5120: 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71  ifnullFunc(.  sq
5130: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5140: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5150: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5160: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5170: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5180: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
5190: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
51a0: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
51b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
51c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
51d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
51e0: 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a  bytes(argv[i]);.
51f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5200: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
5210: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
5220: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5230: 76 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  v[i]),.         
5240: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
5250: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
5260: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
5270: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
5280: 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e   test functions.
5290: 20 20 20 20 68 65 78 38 28 29 20 69 6e 74 65 72      hex8() inter
52a0: 70 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65  prets its argume
52b0: 6e 74 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e  nt as.** UTF8 an
52c0: 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20  d returns a hex 
52d0: 65 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36  encoding.  hex16
52e0: 6c 65 28 29 20 69 6e 74 65 72 70 72 65 74 73 20  le() interprets 
52f0: 69 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  its argument.** 
5300: 61 73 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72  as UTF16le and r
5310: 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63  eturns a hex enc
5320: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5330: 20 76 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73   void hex8Func(s
5340: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5350: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5360: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5370: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5380: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
5390: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
53a0: 75 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73  uf[200];.  z = s
53b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53c0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f  t(argv[0]);.  fo
53d0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
53e0: 7a 42 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a  zBuf)/2 - 2 && z
53f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
5400: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5410: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 32  sizeof(zBuf)-i*2
5420: 2c 20 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25  , &zBuf[i*2], "%
5430: 30 32 78 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 7d  02x", z[i]);.  }
5440: 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30  .  zBuf[i*2] = 0
5450: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
5460: 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72  lt_text(p, (char
5470: 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  *)zBuf, -1, SQLI
5480: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
5490: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
54a0: 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69  OMIT_UTF16.stati
54b0: 63 20 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63  c void hex16Func
54c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
54d0: 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73   *p, int argc, s
54e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
54f0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  rgv){.  const un
5500: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
5510: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *z;.  int i;.  
5520: 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a  char zBuf[400];.
5530: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
5540: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
5550: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5560: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34  i<sizeof(zBuf)/4
5570: 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 4 && z[i]; i+
5580: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
5590: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
55a0: 7a 42 75 66 29 2d 69 2a 34 2c 20 26 7a 42 75 66  zBuf)-i*4, &zBuf
55b0: 5b 69 2a 34 5d 2c 22 25 30 34 78 22 2c 20 7a 5b  [i*4],"%04x", z[
55c0: 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20  i]&0xff);.  }.  
55d0: 7a 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20  zBuf[i*4] = 0;. 
55e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
55f0: 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a  text(p, (char*)z
5600: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
5610: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65  TRANSIENT);.}.#e
5620: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ndif../*.** A st
5630: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69  ructure into whi
5640: 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  ch to accumulate
5650: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   text..*/.struct
5660: 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41   dstr {.  int nA
5670: 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20  lloc;  /* Space 
5680: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
5690: 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53  nt nUsed;   /* S
56a0: 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63  pace used */.  c
56b0: 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54  har *z;     /* T
56c0: 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  he space */.};..
56d0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78  /*.** Append tex
56e0: 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73  t to a dstr.*/.s
56f0: 74 61 74 69 63 20 76 6f 69 64 20 64 73 74 72 41  tatic void dstrA
5700: 70 70 65 6e 64 28 73 74 72 75 63 74 20 64 73 74  ppend(struct dst
5710: 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  r *p, const char
5720: 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72   *z, int divider
5730: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  ){.  int n = (in
5740: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  t)strlen(z);.  i
5750: 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20  f( p->nUsed + n 
5760: 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20  + 2 > p->nAlloc 
5770: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
5780: 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  w;.    p->nAlloc
5790: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
57a0: 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e   n + 200;.    zN
57b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
57c0: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  lloc(p->z, p->nA
57d0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
57e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
57f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
5800: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
5810: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
5820: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
5830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
5840: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
5850: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
5860: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
5870: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
5880: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
5890: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
58a0: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
58b0: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
58c0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
58d0: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
58e0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
58f0: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
5900: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
5910: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
5920: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
5930: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
5940: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
5950: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
5960: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
5970: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
5980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
5990: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
59a0: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
59b0: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
59c0: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
59d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
59e0: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
59f0: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
5a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5a10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
5a20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5a30: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
5a40: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
5a50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
5a60: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
5a70: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
5a80: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
5a90: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
5aa0: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
5ab0: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
5ac0: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
5ad0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
5ae0: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
5af0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
5b00: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
5b10: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
5b20: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
5b30: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
5b40: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
5b50: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
5b60: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
5b70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
5b80: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
5b90: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
5ba0: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
5bb0: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
5bc0: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
5bd0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
5be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
5bf0: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
5c00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5c10: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5c20: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
5c30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5c40: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
5c50: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
5c60: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
5c70: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
5c80: 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73  exec((sqlite3*)s
5c90: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5ca0: 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20  (context),.     
5cb0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5cc0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5cd0: 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46  0]),.      execF
5ce0: 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  uncCallback, &x,
5cf0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
5d00: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
5d10: 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64  xt, x.z, x.nUsed
5d20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5d30: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  NT);.  sqlite3_f
5d40: 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ree(x.z);.}../*.
5d50: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5d60: 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63  n of tkt2213func
5d70: 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e  (), a scalar fun
5d80: 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73  ction that takes
5d90: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20   exactly.** one 
5da0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73  argument. It has
5db0: 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67   two interesting
5dc0: 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a   features:.**.**
5dd0: 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69   * It calls sqli
5de0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
5df0: 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20   3 times on the 
5e00: 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33  argument sqlite3
5e10: 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66  _value*..**   If
5e20: 20 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74   the three point
5e30: 65 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ers returned are
5e40: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e   not the same an
5e50: 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61   SQL error is ra
5e60: 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74  ised..**.** * Ot
5e70: 68 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72  herwise it retur
5e80: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
5e90: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
5ea0: 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20  tion of its .** 
5eb0: 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75    argument in su
5ec0: 63 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20  ch a way as the 
5ed0: 56 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74  VDBE representat
5ee0: 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65  ion is a Mem* ce
5ef0: 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68  ll .**   with th
5f00: 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20  e MEM_Term flag 
5f10: 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69  clear. .**.** Ti
5f20: 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74  cket #2213 can t
5f30: 68 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74  herefore be test
5f40: 65 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67  ed by evaluating
5f50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
5f60: 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
5f70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31  :.**.**   tkt221
5f80: 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e  3func(tkt2213fun
5f90: 63 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a  c('a string'));.
5fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5fb0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a  kt2213Function(.
5fc0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5fd0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5fe0: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
5ff0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6000: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74  v.){.  int nText
6010: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6020: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b  r const *zText1;
6030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6040: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a   const *zText2;.
6050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6060: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a  const *zText3;..
6070: 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65    nText = sqlite
6080: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
6090: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31  gv[0]);.  zText1
60a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
60b0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
60c0: 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74    zText2 = sqlit
60d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
60e0: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33  gv[0]);.  zText3
60f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6100: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
6110: 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a  .  if( zText1!=z
6120: 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21  Text2 || zText2!
6130: 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73  =zText3 ){.    s
6140: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
6150: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b  ror(context, "tk
6160: 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78  t2213 is not fix
6170: 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  ed", -1);.  }els
6180: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  e{.    char *zCo
6190: 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  py = (char *)sql
61a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78  ite3_malloc(nTex
61b0: 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  t);.    memcpy(z
61c0: 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54  Copy, zText1, nT
61d0: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
61e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
61f0: 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54  ntext, zCopy, nT
6200: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  ext, sqlite3_fre
6210: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
6220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   The following S
6230: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  QL function take
6240: 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  s 4 arguments.  
6250: 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34  The 2nd and.** 4
6260: 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  th argument must
6270: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   be one of these
6280: 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74   strings:  'text
6290: 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20  ', 'text16',.** 
62a0: 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73  or 'blob' corres
62b0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66  ponding to API f
62c0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20  unctions.**.**  
62d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
62e0: 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20  e_text().**     
62f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6300: 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20  ext16().**      
6310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6320: 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ob().**.** The t
6330: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
6340: 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65   a string, eithe
6350: 72 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79  r 'bytes' or 'by
6360: 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27  tes16' or 'noop'
6370: 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  ,.** correspondi
6380: 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a  ng to APIs:.**.*
6390: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
63a0: 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20  alue_bytes().** 
63b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
63c0: 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20  ue_bytes16().** 
63d0: 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20       noop.**.** 
63e0: 54 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61  The APIs designa
63f0: 74 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74  ted by the 2nd t
6400: 68 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d  hrough 4th argum
6410: 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64  ents are applied
6420: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
6430: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64   argument in ord
6440: 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e  er.  If the poin
6450: 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79  ters returned by
6460: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
6470: 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69  nd fourth are di
6480: 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f  fferent, this ro
6490: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
64a0: 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
64b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
64c0: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  urns 0..**.** Th
64d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
64e0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73  sed to test to s
64f0: 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64  ee when returned
6500: 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a   pointers from.*
6510: 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f  * the _text(), _
6520: 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c  text16() and _bl
6530: 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65  ob() APIs become
6540: 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
6560: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20  ChngFunction(.  
6570: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6580: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6590: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
65a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
65b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
65c0: 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73  *p1, *p2;.  cons
65d0: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20  t char *zCmd;.  
65e0: 69 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65  if( argc!=4 ) re
65f0: 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28  turn;.  zCmd = (
6600: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6610: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6620: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
6630: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6640: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6650: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6660: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
6670: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6680: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6690: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
66a0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
66b0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
66c0: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
66d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20  ==0 ){.    p1 = 
66e0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
66f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6700: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6710: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6720: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
6730: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  b")==0 ){.    p1
6740: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6750: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6760: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6770: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6780: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6790: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
67a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
67b0: 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[2]);.  if( z
67c0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
67d0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
67e0: 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29  md,"bytes")==0 )
67f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
6800: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
6810: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
6820: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6830: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6840: 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22  (zCmd, "bytes16"
6850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
6860: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31  te3_value_bytes1
6870: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6880: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6890: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f  trcmp(zCmd, "noo
68a0: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  p")==0 ){.    /*
68b0: 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   do nothing */. 
68c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
68d0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  rn;.  }.  zCmd =
68e0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
68f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6900: 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (argv[3]);.  if(
6910: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
6920: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
6930: 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20  zCmd,"text")==0 
6940: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
6950: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
6960: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6970: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6980: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6990: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
69a0: 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36  mp(zCmd, "text16
69b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20  ")==0 ){.    p2 
69c0: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
69d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
69e0: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  t16(argv[0]);.#e
69f0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
6a00: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62   strcmp(zCmd, "b
6a10: 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lob")==0 ){.    
6a20: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
6a30: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6a40: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
6a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6a60: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
6a70: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6a80: 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d  text, p1!=p2);.}
6a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c  ../*.** This SQL
6aa0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6ab0: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e  s a different an
6ac0: 73 77 65 72 20 65 61 63 68 20 74 69 6d 65 20 69  swer each time i
6ad0: 74 20 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65  t is called, eve
6ae0: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75  n if.** the argu
6af0: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 73 61  ments are the sa
6b00: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
6b10: 69 64 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73  id nondeterminis
6b20: 74 69 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ticFunction(.  s
6b30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6b40: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6b50: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
6b60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6b70: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  {.  static int c
6b80: 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  nt = 0;.  sqlite
6b90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6ba0: 74 65 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a  text, cnt++);.}.
6bb0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
6bc0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6bd0: 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20  nction DB.**.** 
6be0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
6bf0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6c00: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
6c10: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
6c20: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
6c30: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
6c40: 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20  d "x_coalesce". 
6c50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
6c60: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69  oes the same thi
6c70: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f  ng.** as the "co
6c80: 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e  alesce" function
6c90: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
6ca0: 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20   also registers 
6cb0: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a  an SQL function.
6cc0: 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69  ** named "x_sqli
6cd0: 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e  te_exec" that in
6ce0: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78  vokes sqlite3_ex
6cf0: 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20  ec().  Invoking 
6d00: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
6d10: 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73  * in this way is
6d20: 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69   illegal recursi
6d30: 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61  on and should ra
6d40: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
6d50: 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54  SUSE error..** T
6d60: 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d  he effect is sim
6d70: 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74  ilar to trying t
6d80: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
6d90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6da0: 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74  on from.** two t
6db0: 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61  hreads at the sa
6dc0: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  me time..**.** T
6dd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
6de0: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
6df0: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
6e00: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
6e10: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
6e20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75  eate_function fu
6e30: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
6e40: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
6e50: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
6e60: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
6e70: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
6e80: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ion logic..*/.st
6e90: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
6ea0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
6eb0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
6ec0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6ed0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
6ee0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
6ef0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
6f00: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
6f10: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
6f20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f30: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
6f40: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
6f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
6f60: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
6f70: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
6f80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
6f90: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
6fa0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6fb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6fc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
6fd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
6fe0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
6ff0: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
7000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7010: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
7020: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7030: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
7040: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7050: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7060: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7070: 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65  (db, "x_coalesce
7080: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7090: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  F8, 0, .        
70a0: 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30  t1_ifnullFunc, 0
70b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
70c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
70d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
70e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
70f0: 2c 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c  , "hex8", 1, SQL
7100: 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
7110: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
7120: 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 68 65  .          0, he
7130: 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  x8Func, 0, 0);. 
7140: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
7150: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
7160: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7170: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7180: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7190: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22  tion(db, "hex16"
71a0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
71b0: 36 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  6 | SQLITE_DETER
71c0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
71d0: 20 20 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63      0, hex16Func
71e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
71f0: 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
7200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7210: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7220: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7230: 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31  "tkt2213func", 1
7240: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7250: 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32   .          tkt2
7260: 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  213Function, 0, 
7270: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
7280: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7290: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
72a0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
72b0: 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61  db, "pointer_cha
72c0: 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  nge", 4, SQLITE_
72d0: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
72e0: 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69     ptrChngFuncti
72f0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  on, 0, 0);.  }..
7300: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63    /* Functions c
7310: 6f 75 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f  ounter1() and co
7320: 75 6e 74 65 72 32 28 29 20 68 61 76 65 20 74 68  unter2() have th
7330: 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74  e same implement
7340: 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a  ation - they.  *
7350: 2a 20 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e  * both return an
7360: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67   ascending integ
7370: 65 72 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  er with each cal
7380: 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31  l.  But counter1
7390: 28 29 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a  () is marked.  *
73a0: 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  * as non-determi
73b0: 6e 69 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74  nistic and count
73c0: 65 72 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20  er2() is marked 
73d0: 61 73 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  as deterministic
73e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
73f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7410: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7420: 62 2c 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d  b, "counter1", -
7430: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
7440: 20 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e            0, non
7450: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e  deterministicFun
7460: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7470: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
7480: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7490: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
74a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63  _function(db, "c
74b0: 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51  ounter2", -1, SQ
74c0: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
74d0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
74e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e            0, non
74f0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e  deterministicFun
7500: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7510: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7520: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
7530: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
7540: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7550: 6e 31 36 28 29 20 41 50 49 20 68 65 72 65 2e 20  n16() API here. 
7560: 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20  Mainly for fun, 
7570: 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62  but also .  ** b
7580: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
7590: 20 74 65 73 74 65 64 20 61 6e 79 77 68 65 72 65   tested anywhere
75a0: 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20   else. */.  if( 
75b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
75c0: 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
75d0: 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c  *zUtf16;.    sql
75e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
75f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7600: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7610: 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
7620: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
7630: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
7640: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
7650: 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65  l, -1, "x_sqlite
7660: 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55  _exec", SQLITE_U
7670: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7680: 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20  IC);.    zUtf16 
7690: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
76a0: 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
76b0: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
76c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
76d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
76e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
76f0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
7700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7710: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7720: 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a  16(db, zUtf16, .
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  1, SQLITE_UTF16,
7750: 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63   db, sqlite3Exec
7760: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
7770: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
7780: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
7790: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
77a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
77b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
77c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
77d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
77e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
77f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
7800: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
7810: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
7820: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
7830: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
7850: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
7860: 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61   the x_count() a
7870: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7880: 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74  n..**.** x_count
7890: 28 29 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75  () counts the nu
78a0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c  mber of non-null
78b0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74   arguments.  But
78c0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f   there are.** so
78d0: 6d 65 20 74 77 69 73 74 73 20 66 6f 72 20 74 65  me twists for te
78e0: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
78f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67  **.** If the arg
7900: 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74  ument to x_count
7910: 28 29 20 69 73 20 34 30 20 74 68 65 6e 20 61 20  () is 40 then a 
7920: 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72  UTF-8 error is r
7930: 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68  eported.** on th
7940: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
7950: 20 20 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29    If x_count(41)
7960: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61   is seen, then a
7970: 20 55 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a   UTF-16 error.**
7980: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
7990: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
79a0: 6e 2e 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c  n.  If the total
79b0: 20 63 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68   count is 42, th
79c0: 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72  en.** a UTF-8 er
79d0: 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20  ror is reported 
79e0: 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20  on the finalize 
79f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
7a00: 65 64 65 66 20 73 74 72 75 63 74 20 74 31 43 6f  edef struct t1Co
7a10: 75 6e 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74  untCtx t1CountCt
7a20: 78 3b 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e  x;.struct t1Coun
7a30: 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  tCtx {.  int n;.
7a40: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  };.static void t
7a50: 31 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  1CountStep(.  sq
7a60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7a70: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7a80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7a90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7aa0: 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20  t1CountCtx *p;. 
7ab0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
7ac0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
7ad0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
7ae0: 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63  p));.  if( (argc
7af0: 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  ==0 || SQLITE_NU
7b00: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
7b10: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
7b20: 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d  ) && p ){.    p-
7b30: 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >n++;.  }.  if( 
7b40: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  argc>0 ){.    in
7b50: 74 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t v = sqlite3_va
7b60: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
7b70: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20  ;.    if( v==40 
7b80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7b90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
7ba0: 6e 74 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66  ntext, "value of
7bb0: 20 34 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f   40 handed to x_
7bc0: 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66  count", -1);.#if
7bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7be0: 5f 55 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65  _UTF16.    }else
7bf0: 20 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20   if( v==41 ){.  
7c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a      const char z
7c10: 55 74 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20  Utf16ErrMsg[] = 
7c20: 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78  { 0, 0x61, 0, 0x
7c30: 36 32 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20  62, 0, 0x63, 0, 
7c40: 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0};.      sql
7c50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
7c60: 72 31 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55  r16(context, &zU
7c70: 74 66 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c  tf16ErrMsg[1-SQL
7c80: 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20  ITE_BIGENDIAN], 
7c90: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
7ca0: 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69  }.  }.}   .stati
7cb0: 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69  c void t1CountFi
7cc0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
7cd0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
7ce0: 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a  {.  t1CountCtx *
7cf0: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
7d00: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
7d10: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
7d20: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
7d30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
7d40: 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ==42 ){.      sq
7d50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7d60: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63  or(context, "x_c
7d70: 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34  ount totals to 4
7d80: 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  2", -1);.    }el
7d90: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7da0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7db0: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a  text, p ? p->n :
7dc0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   0);.    }.  }.}
7dd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7de0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
7df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
7e00: 61 63 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20  acyCountStep(.  
7e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7e20: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7e30: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7e40: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7e50: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a    /* no-op */.}.
7e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
7e70: 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  acyCountFinalize
7e80: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7e90: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71   *context){.  sq
7ea0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
7eb0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
7ec0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
7ed0: 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23  t(context));.}.#
7ee0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
7ef0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ge:  sqlite3_cre
7f00: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
7f10: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
7f20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7f30: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
7f40: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
7f50: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
7f60: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
7f70: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
7f80: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
7f90: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  on is similar.**
7fa0: 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   to the built-in
7fb0: 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f   count() functio
7fc0: 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20 73 70  n, with a few sp
7fd0: 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20  ecial quirks.** 
7fe0: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
7ff0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8000: 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a  rror() APIs..**.
8010: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
8020: 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74  motivation for t
8030: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
8040: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61  to be able to ca
8050: 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ll the.** sqlite
8060: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
8070: 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  te function whil
8080: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
8090: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
80a0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
80b0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
80c0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20  etection logic. 
80d0: 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74   See misuse.test
80e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
80f0: 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65  tine was later e
8100: 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20  xtended to test 
8110: 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74  the use of sqlit
8120: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8130: 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72  ).** within aggr
8140: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
8150: 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74  .**.** Later: It
8160: 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74   is now also ext
8170: 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73 74 65  ended to registe
8180: 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  r the aggregate 
8190: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67  function.** "leg
81a0: 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74  acy_count()" wit
81b0: 68 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 64  h the supplied d
81c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
81d0: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
81e0: 74 6f 20 74 65 73 74 20 74 68 65 20 64 65 70 72  to test the depr
81f0: 65 63 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61  ecated sqlite3_a
8200: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
8210: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
8220: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
8230: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
8240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
82a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
82b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
82c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
82d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
82e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
82f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8310: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
8320: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
8330: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8340: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8350: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8360: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8370: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
8380: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
8390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
83a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
83b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
83c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
83d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
83e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
83f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8400: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
8410: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8420: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43   0, 0,.      t1C
8430: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
8440: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28  Finalize);.  if(
8450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8460: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8470: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8480: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
8490: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
84a0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
84b0: 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f  t1CountStep,t1Co
84c0: 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  untFinalize);.  
84d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
84e0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
84f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8510: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8520: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65  function(db, "le
8530: 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  gacy_count", 0, 
8540: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30  SQLITE_ANY, 0, 0
8550: 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63 79  ,.        legacy
8560: 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63  CountStep, legac
8570: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20  yCountFinalize. 
8580: 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66     );.  }.#endif
8590: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
85a0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
85b0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
85c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
85d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
85e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
85f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
8600: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8610: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
8620: 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58  age:  printf TEX
8630: 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74  T.**.** Send out
8640: 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20  put to printf.  
8650: 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72 20  Use this rather 
8660: 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72  than puts to mer
8670: 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  ge the output.**
8680: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
8690: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64 65  sequence with de
86a0: 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20  bugging printfs 
86b0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20  inserted into C 
86c0: 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73  code..** Puts us
86d0: 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62 75  es a separate bu
86e0: 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67 69  ffer and debuggi
86f0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69  ng statements wi
8700: 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20  ll be out of.** 
8710: 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20 69  sequence if it i
8720: 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  s used..*/.stati
8730: 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74  c int test_print
8740: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
8750: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8760: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8770: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8780: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8790: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
87a0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
87b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
87c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
87d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
87e0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
87f0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8800: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66  ument */.){.  if
8810: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
8820: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8830: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8840: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8850: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8860: 0a 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22  .       " TEXT\"
8870: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8890: 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22  .  printf("%s\n"
88a0: 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65  , argv[1]);.  re
88b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
88c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
88d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
88e0: 69 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  int FORMAT INTEG
88f0: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8900: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8910: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8920: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
8930: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
8940: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8950: 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _int(.  void *No
8960: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
8970: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8980: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8990: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
89a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
89b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
89e0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
89f0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
8a00: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
8a10: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
8a20: 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20   int a[3], i;.  
8a30: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8a40: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
8a50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8a60: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8a70: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8a80: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8a90: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
8aa0: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
8ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8ac0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
8ad0: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
8ae0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
8af0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
8b00: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
8b10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8b20: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
8b30: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
8b40: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
8b50: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
8b60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8b70: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
8b80: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
8b90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8ba0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
8bb0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8bc0: 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54  int64 FORMAT INT
8bd0: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
8be0: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
8bf0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
8c00: 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ee 64-bit intege
8c10: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
8c20: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8c30: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28  3_mprintf_int64(
8c40: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8c50: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8c60: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8c70: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8c80: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8c90: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8ca0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8cc0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8cd0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8cf0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8d00: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
8d10: 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  i;.  sqlite_int6
8d20: 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  4 a[3];.  char *
8d30: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
8d40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8d50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8d70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8d80: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8d90: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
8da0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
8db0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8dc0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
8dd0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
8de0: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
8df0: 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  4(argv[i], &a[i-
8e00: 32 5d 2c 20 31 30 30 30 30 30 30 2c 20 53 51 4c  2], 1000000, SQL
8e10: 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20  ITE_UTF8) ){.   
8e20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8e30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67  ult(interp, "arg
8e40: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76  ument is not a v
8e50: 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65  alid 64-bit inte
8e60: 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ger", 0);.      
8e70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8e80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20  ;.    }.  }.  z 
8e90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8ea0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8eb0: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
8ec0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8ed0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8ee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8ef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8f00: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
8f10: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
8f20: 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54  intf_long FORMAT
8f30: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8f40: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
8f50: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
8f60: 20 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65   three long inte
8f70: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ger arguments.  
8f80: 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74   This might be t
8f90: 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71  he.** same as sq
8fa0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8fb0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72  t or sqlite3_mpr
8fc0: 69 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65  intf_int64, depe
8fd0: 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74  nding on.** plat
8fe0: 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  form..*/.static 
8ff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9000: 6e 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64  ntf_long(.  void
9010: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9020: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9030: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9040: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9050: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9060: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9070: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9090: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
90a0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
90b0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
90c0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
90d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f  ){.  int i;.  lo
90e0: 6e 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69  ng int a[3];.  i
90f0: 6e 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20  nt b[3];.  char 
9100: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
9110: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9130: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9140: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9150: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9160: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
9170: 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20   INT\"", 0);.   
9180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9190: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
91a0: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
91b0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
91c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
91d0: 20 26 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &b[i-2]) ) retu
91e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
91f0: 20 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67    a[i-2] = (long
9200: 20 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20   int)b[i-2];.   
9210: 20 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36   a[i-2] &= (((u6
9220: 34 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e  4)1)<<(sizeof(in
9230: 74 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20  t)*8))-1;.  }.  
9240: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9250: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9260: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
9270: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9280: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9290: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
92a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
92b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
92c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
92d0: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
92e0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
92f0: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
9300: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
9310: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
9320: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
9330: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
9340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9350: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
9360: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9370: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9380: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9390: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
93a0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
93b0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
93c0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
93d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
93e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
93f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9410: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9420: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9430: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
9440: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
9450: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
9460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9480: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9490: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
94a0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
94b0: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
94c0: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
94d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
94e0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
94f0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
9500: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9510: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9520: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
9530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9540: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9550: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9560: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
9570: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
9580: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
9590: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
95a0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
95b0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
95c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
95d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
95e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
95f0: 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54  r INTEGER FORMAT
9600: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9610: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9620: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9630: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9640: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9650: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9660: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9670: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
9680: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9690: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
96a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
96b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
96c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
96d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
96e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
96f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9700: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9710: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9730: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9740: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9750: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20   a[3], i;.  int 
9760: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  n;.  char *z;.  
9770: 69 66 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72  if( argc<5 || ar
9780: 67 63 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>6 ){.    Tcl_
9790: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
97a0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
97b0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
97c0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
97d0: 20 20 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20     " INT FORMAT 
97e0: 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f  INT INT ?STRING?
97f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9810: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
9820: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
9830: 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [1], &n) ) retur
9840: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9850: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63  f( n<0 ){.    Tc
9860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9870: 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62  nterp, "N must b
9880: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c  e non-negative",
9890: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
98a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
98b0: 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69   for(i=3; i<5; i
98c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
98d0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
98e0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d  argv[i], &a[i-3]
98f0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9900: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9910: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
9920: 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  n+1 );.  sqlite3
9930: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20  _snprintf(n, z, 
9940: 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61  argv[2], a[0], a
9950: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9960: 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[5] : NULL);. 
9970: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9980: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9990: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
99a0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
99b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
99c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
99d0: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52  rintf_double FOR
99e0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
99f0: 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a  GER DOUBLE.**.**
9a00: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9a10: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
9a20: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
9a30: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
9a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9a50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9a60: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ouble(.  void *N
9a70: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9a90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9aa0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9ab0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9ac0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ae0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9af0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9b00: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9b10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9b20: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9b30: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
9b40: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
9b50: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9b60: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9b70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9b80: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9b90: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9ba0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9bb0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9bc0: 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29  NT DOUBLE\"", 0)
9bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9be0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9bf0: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
9c00: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
9c10: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
9c20: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
9c30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9c40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
9c50: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
9c60: 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20  p, argv[4], &r) 
9c70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9c80: 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  OR;.  z = sqlite
9c90: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
9ca0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72  ], a[0], a[1], r
9cb0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
9cc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
9cd0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
9ce0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
9cf0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9d00: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
9d10: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
9d20: 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44   FORMAT DOUBLE D
9d30: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
9d40: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
9d50: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
9d60: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
9d70: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
9d80: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
9d90: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
9da0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
9db0: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
9dc0: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
9dd0: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
9de0: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
9df0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
9e00: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
9e10: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
9e20: 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76  intf_scaled(.  v
9e30: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
9e40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9e50: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9e60: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9e70: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9e80: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9e90: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
9ea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9eb0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9ec0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
9ed0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
9ee0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
9ef0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
9f00: 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20   double r[2];.  
9f10: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
9f20: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
9f30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9f40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9f50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9f60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
9f70: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f       " FORMAT DO
9f80: 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20  UBLE DOUBLE\"", 
9f90: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9fa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9fb0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
9fc0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9fd0: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
9fe0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d  , argv[i], &r[i-
9ff0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
a000: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
a010: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a020: 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a  f(argv[1], r[0]*
a030: 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  r[1]);.  Tcl_App
a040: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a050: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a060: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a070: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a080: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a090: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
a0a0: 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52  ronly FORMAT STR
a0b0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
a0c0: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
a0d0: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
a0e0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
a0f0: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
a100: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
a110: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
a120: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
a130: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
a140: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
a150: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
a160: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
a170: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
a180: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
a190: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
a1a0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a1b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a1c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a1d0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a1e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a1f0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a200: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a210: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a230: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a240: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a250: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a260: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a270: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a280: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a290: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a2a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a2b0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a2c0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a2d0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a2e0: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a2f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a300: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a310: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a320: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a330: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a340: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a350: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a360: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a370: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a3a0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a3b0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a3c0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a3d0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a3e0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a3f0: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a400: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a410: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a420: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a430: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
a440: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a450: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
a460: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
a470: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
a480: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a490: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
a4a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
a4b0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a4d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a4e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a500: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
a510: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
a520: 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72  r *z;.  double r
a530: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
a540: 20 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74   x1, x2;.  sqlit
a550: 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66  e_uint64 d;.  if
a560: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
a570: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a580: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
a590: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
a5a0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
a5b0: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
a5c0: 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a   STRING\"", 0);.
a5d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a5e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
a5f0: 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20  sscanf(argv[2], 
a600: 22 25 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c  "%08x%08x", &x2,
a610: 20 26 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20   &x1)!=2 ){.    
a620: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a630: 28 69 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72  (interp, "2nd ar
a640: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
a650: 20 31 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f   16-characters o
a660: 66 20 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20  f hex", 0);.    
a670: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a680: 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a  ;.  }.  d = x2;.
a690: 20 20 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20    d = (d<<32) + 
a6a0: 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c  x1;.  memcpy(&r,
a6b0: 20 26 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b   &d, sizeof(r));
a6c0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
a6d0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
a6e0: 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  r);.  Tcl_Append
a6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a700: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a710: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a720: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a730: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
a740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
a750: 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  cache ?BOOLEAN?.
a760: 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  **.*/.#if !defin
a770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a780: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61  HARED_CACHE).sta
a790: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61  tic int test_ena
a7a0: 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c  ble_shared(.  Cl
a7b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a7c0: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
a7d0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
a7e0: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
a7f0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
a800: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a810: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a820: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a830: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a840: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
a850: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a860: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a870: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
a880: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
a890: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
a8a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a8b0: 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20    int enable;.  
a8c0: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20  int ret = 0;..  
a8d0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
a8e0: 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
a8f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a900: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
a910: 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20  "?BOOLEAN?");.  
a920: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a930: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20  OR;.  }.  ret = 
a940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
a950: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
a960: 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f  nabled;..  if( o
a970: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
a980: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
a990: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a9a0: 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65  objv[1], &enable
a9b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
a9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a9d0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a9e0: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
a9f0: 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b  d_cache(enable);
aa00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
aa10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
aa20: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
aa30: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
aa40: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
aa50: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
aa60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
aa70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
aa80: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
aa90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
aaa0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74  ewBooleanObj(ret
aab0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
aac0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
aad0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
aae0: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
aaf0: 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42  esult_codes   DB
ab00: 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a      BOOLEAN.**.*
ab10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
ab20: 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  t_extended_resul
ab30: 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e  t_codes(.  Clien
ab40: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
ab50: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
ab60: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
ab70: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
ab80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ab90: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
aba0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
abb0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
abc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
abd0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
abe0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
abf0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
ac00: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
ac10: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
ac20: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
ac30: 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b  ){.  int enable;
ac40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
ac50: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
ac60: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ac70: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ac80: 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c  , objv, "DB BOOL
ac90: 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
aca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
acb0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
acc0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
acd0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ace0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
acf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ad00: 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
ad10: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
ad20: 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c   objv[2], &enabl
ad30: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
ad40: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
ad50: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ad60: 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c  _codes(db, enabl
ad70: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
ad80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ad90: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62  age: sqlite3_lib
ada0: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a  version_number.*
adb0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
adc0: 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
add0: 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74  number(.  Client
ade0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
adf0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
ae00: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
ae10: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
ae20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ae30: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
ae40: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
ae50: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
ae60: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
ae70: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
ae80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae90: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aea0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aeb0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aec0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aed0: 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {.  Tcl_SetObjRe
aee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
aef0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
af00: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
af10: 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75  mber()));.  retu
af20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
af30: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
af40: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
af50: 6d 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61  metadata DB dbna
af60: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
af70: 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  me.**.*/.static 
af80: 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  int test_table_c
af90: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
afa0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
afb0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
afc0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
afd0: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
afe0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
aff0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b000: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b010: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b020: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b030: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b050: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b060: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b070: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b080: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b090: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
b0a0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
b0b0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
b0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a  nst char *zTbl;.
b0d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b0e0: 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ol;.  int rc;.  
b0f0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
b100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
b110: 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74  atatype;.  const
b120: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b   char *zCollseq;
b130: 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a  .  int notnull;.
b140: 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
b150: 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72  ;.  int autoincr
b160: 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62  ement;..  if( ob
b170: 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
b180: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b190: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b1a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62   1, objv, "DB db
b1b0: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
b1c0: 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75  name");.    retu
b1d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b1e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
b1f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
b200: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b210: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
b220: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b230: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
b240: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
b250: 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zTbl = Tcl_GetSt
b260: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
b270: 20 7a 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20   zCol = objc==5 
b280: 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
b290: 6f 62 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20  objv[4]) : 0;.. 
b2a0: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29   if( strlen(zDb)
b2b0: 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a  ==0 ) zDb = 0;..
b2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
b2d0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b2e0: 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54  data(db, zDb, zT
b2f0: 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20  bl, zCol, .     
b300: 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43   &zDatatype, &zC
b310: 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c  ollseq, &notnull
b320: 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26  , &primarykey, &
b330: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a  autoincrement);.
b340: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
b360: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b370: 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
b380: 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
b390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b3a0: 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
b3b0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
b3c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b3d0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b3e0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b3f0: 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d  Obj(zDatatype, -
b400: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
b410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b420: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b430: 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73  StringObj(zColls
b440: 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  eq, -1));.  Tcl_
b450: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b460: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b470: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e  l_NewIntObj(notn
b480: 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ull));.  Tcl_Lis
b490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b4a0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
b4b0: 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79  ewIntObj(primary
b4c0: 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  key));.  Tcl_Lis
b4d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b4e0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
b4f0: 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63  ewIntObj(autoinc
b500: 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f  rement));.  Tcl_
b510: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b520: 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72  erp, pRet);..  r
b530: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b550: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73  OMIT_INCRBLOB..s
b560: 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61  tatic int blobHa
b570: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54  ndleFromObj(.  T
b580: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b590: 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  p, .  Tcl_Obj *p
b5a0: 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  Obj,.  sqlite3_b
b5b0: 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a  lob **ppBlob.){.
b5c0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
b5d0: 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47   n;..  z = Tcl_G
b5e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b5f0: 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28  pObj, &n);.  if(
b600: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70   n==0 ){.    *pp
b610: 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Blob = 0;.  }els
b620: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  e{.    int notUs
b630: 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ed;.    Tcl_Chan
b640: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20  nel channel;.   
b650: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
b660: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20  anceData;.    . 
b670: 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c     channel = Tcl
b680: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
b690: 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29  rp, z, &notUsed)
b6a0: 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e  ;.    if( !chann
b6b0: 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  el ) return TCL_
b6c0: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f  ERROR;..    Tcl_
b6d0: 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a  Flush(channel);.
b6e0: 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61      Tcl_Seek(cha
b6f0: 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45  nnel, 0, SEEK_SE
b700: 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63  T);..    instanc
b710: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
b720: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
b730: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20  ta(channel);.   
b740: 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71   *ppBlob = *((sq
b750: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
b760: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d  stanceData);.  }
b770: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b780: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
b790: 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
b7a0: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
b7b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
b7c0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
b7d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b7e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b7f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b800: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b810: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b820: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b830: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b840: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b850: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b860: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b870: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b880: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
b890: 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  wid;.  sqlite3_b
b8a0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
b8b0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
b8c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
b8d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
b8e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
b8f0: 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a  HANNEL ROWID");.
b900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b910: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
b920: 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f   blobHandleFromO
b930: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b940: 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65  1], &pBlob) ) re
b950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b960: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
b970: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
b980: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52  rp, objv[2], &iR
b990: 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54  owid) ) return T
b9a0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
b9b0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
b9c0: 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f  eopen(pBlob, iRo
b9d0: 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  wid);.  if( rc!=
b9e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b9f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ba00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
ba10: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
ba20: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
ba30: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ba40: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
ba50: 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
ba60: 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  ROR);.}..#endif.
ba70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ba80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
ba90: 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e  lation_v2 DB-HAN
baa0: 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f  DLE NAME CMP-PRO
bab0: 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a  C DEL-PROC.**.**
bac0: 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63     This Tcl proc
bad0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bae0: 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d  ting the experim
baf0: 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74  ental.**   sqlit
bb00: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
bb10: 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61  ion_v2() interfa
bb20: 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65  ce..*/.struct Te
bb30: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20  stCollationX {. 
bb40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bb50: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
bb60: 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCmp;.  Tcl_Obj 
bb70: 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65  *pDel;.};.typede
bb80: 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c  f struct TestCol
bb90: 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c  lationX TestColl
bba0: 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76  ationX;.static v
bbb0: 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f  oid testCreateCo
bbc0: 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20  llationDel(void 
bbd0: 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f  *pCtx){.  TestCo
bbe0: 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54  llationX *p = (T
bbf0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29  estCollationX *)
bc00: 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20  pCtx;..  int rc 
bc10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
bc20: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44  p->interp, p->pD
bc30: 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  el, TCL_EVAL_DIR
bc40: 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  ECT|TCL_EVAL_GLO
bc50: 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  BAL);.  if( rc!=
bc60: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  TCL_OK ){.    Tc
bc70: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
bc80: 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  r(p->interp);.  
bc90: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
bca0: 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a  Count(p->pCmp);.
bcb0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
bcc0: 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73  nt(p->pDel);.  s
bcd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69  qlite3_free((voi
bce0: 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63  d *)p);.}.static
bcf0: 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43   int testCreateC
bd00: 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76  ollationCmp(.  v
bd10: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
bd20: 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20   nLeft,.  const 
bd30: 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69  void *zLeft,.  i
bd40: 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e  nt nRight,.  con
bd50: 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a  st void *zRight.
bd60: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
bd70: 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f  onX *p = (TestCo
bd80: 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b  llationX *)pCtx;
bd90: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
bda0: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
bdb0: 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b  ateObj(p->pCmp);
bdc0: 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b  .  int iRes = 0;
bdd0: 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ..  Tcl_IncrRefC
bde0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
bdf0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
be00: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
be10: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
be20: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a  ingObj((char *)z
be30: 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20  Left, nLeft));. 
be40: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
be50: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
be60: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
be70: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a  ingObj((char *)z
be80: 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a  Right,nRight));.
be90: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
bea0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
beb0: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
bec0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
bed0: 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  |TCL_EVAL_GLOBAL
bee0: 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  ).   || TCL_OK!=
bef0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
bf00: 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  j(p->interp, Tcl
bf10: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
bf20: 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29  >interp), &iRes)
bf30: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
bf40: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
bf50: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20  >interp);.  }.  
bf60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bf70: 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65  (pScript);..  re
bf80: 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61  turn iRes;.}.sta
bf90: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
bfa0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
bfb0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
bfc0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
bfd0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
bfe0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
bff0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c000: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c010: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c020: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c030: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c040: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c050: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c060: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c070: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c080: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c090: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c0a0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c0b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c0c0: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c0d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c0e0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c0f0: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c100: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c110: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c120: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c130: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c140: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c150: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c160: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c180: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c190: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c1a0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c1b0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c1c0: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c1d0: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c1e0: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c1f0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c200: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c210: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c220: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c230: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c240: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c250: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c260: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c270: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c280: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c290: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c2a0: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c2b0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c2c0: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c2d0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c2e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c2f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c300: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c310: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c320: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c330: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c340: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c350: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c360: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c370: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c380: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c390: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c3a0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c3b0: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c3c0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c3d0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c3e0: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c3f0: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c400: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c420: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c430: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c440: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c450: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c460: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c470: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c480: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c490: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c4a0: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c4b0: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c4c0: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c4d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c4e0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c4f0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c500: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c510: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c530: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c540: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c550: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c560: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c570: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c580: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c5a0: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c5b0: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c5c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c5d0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c5e0: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c5f0: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c600: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c610: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c620: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c630: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c640: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c650: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c660: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c670: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c680: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c690: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c6a0: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c6b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c6c0: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c6d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c6e0: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c6f0: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c700: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c710: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c720: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c730: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c740: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c750: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c760: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
c770: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
c780: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
c790: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
c7a0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
c7b0: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
c7c0: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
c7d0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
c7e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
c7f0: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
c800: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
c810: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
c820: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
c830: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
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 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
c860: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
c870: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c880: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
c890: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
c8a0: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
c8b0: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
c8c0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
c8d0: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
c8e0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
c8f0: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69  nction_v2(.  Cli
c900: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
c910: 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta,          /* 
c920: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
c950: 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43   The invoking TC
c960: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  L interpreter */
c970: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c9a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
c9b0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
c9c0: 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f  jv[]           /
c9d0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c9e0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
c9f0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
ca00: 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20   char *zFunc;.  
ca10: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20  int nArg;.  int 
ca20: 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e  enc;.  CreateFun
ca30: 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e  ctionV2 *p;.  in
ca40: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
ca50: 20 20 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c    struct EncTabl
ca60: 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  e {.    const ch
ca70: 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e  ar *zEnc;.    in
ca80: 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b  t enc;.  } aEnc[
ca90: 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38  ] = {.    {"utf8
caa0: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
cab0: 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  8 },.    {"utf16
cac0: 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31  ",   SQLITE_UTF1
cad0: 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  6 },.    {"utf16
cae0: 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  le", SQLITE_UTF1
caf0: 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  6LE },.    {"utf
cb00: 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16be", SQLITE_UT
cb10: 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61  F16BE },.    {"a
cb20: 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ny",     SQLITE_
cb30: 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c  ANY },.    {"0",
cb40: 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28   0 }.  };..  if(
cb50: 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63   objc<5 || (objc
cb60: 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  %2)==0 ){.    Tc
cb70: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cb80: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
cb90: 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e  "DB NAME NARG EN
cba0: 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b  C SWITCHES...");
cbb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cbc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
cbd0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
cbe0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
cbf0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
cc00: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
cc10: 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20  _ERROR;.  zFunc 
cc20: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
cc30: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
cc40: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
cc50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
cc60: 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75  ], &nArg) ) retu
cc70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cc80: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
cc90: 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e  FromObjStruct(in
cca0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61  terp, objv[4], a
ccb0: 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63  Enc, sizeof(aEnc
ccc0: 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20  [0]), .         
ccd0: 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20   "encoding", 0, 
cce0: 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72  &enc).  ){.    r
ccf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cd00: 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e  .  }.  enc = aEn
cd10: 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70  c[enc].enc;..  p
cd20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
cd30: 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46  c(sizeof(CreateF
cd40: 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61  unctionV2));.  a
cd50: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65  ssert( p );.  me
cd60: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
cd70: 66 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  f(CreateFunction
cd80: 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  V2));.  p->inter
cd90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66  p = interp;..  f
cda0: 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20  or(i=5; i<objc; 
cdb0: 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  i+=2){.    int i
cdc0: 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73  Switch;.    cons
cdd0: 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68  t char *azSwitch
cde0: 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22  [] = {"-func", "
cdf0: 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22  -step", "-final"
ce00: 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d  , "-destroy", 0}
ce10: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
ce20: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
ce30: 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61  terp, objv[i], a
ce40: 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74 63 68  zSwitch, "switch
ce50: 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29 20  ", 0, &iSwitch) 
ce60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ce70: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
ce80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ce90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
cea0: 74 63 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a  tch( iSwitch ){.
ceb0: 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d        case 0: p-
cec0: 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b  >pFunc = objv[i+
ced0: 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1];      break;.
cee0: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d        case 1: p-
cef0: 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b  >pStep = objv[i+
cf00: 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1];      break;.
cf10: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d        case 2: p-
cf20: 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69  >pFinal = objv[i
cf30: 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  +1];     break;.
cf40: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d        case 3: p-
cf50: 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76  >pDestroy = objv
cf60: 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a  [i+1];   break;.
cf70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
cf80: 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46  p->pFunc ) p->pF
cf90: 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  unc = Tcl_Duplic
cfa0: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29  ateObj(p->pFunc)
cfb0: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65  ; .  if( p->pSte
cfc0: 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54  p ) p->pStep = T
cfd0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
cfe0: 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66  p->pStep); .  if
cff0: 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d  ( p->pFinal ) p-
d000: 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75  >pFinal = Tcl_Du
d010: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46  plicateObj(p->pF
d020: 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d  inal); .  if( p-
d030: 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70  >pDestroy ) p->p
d040: 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75  Destroy = Tcl_Du
d050: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44  plicateObj(p->pD
d060: 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28  estroy); ..  if(
d070: 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f   p->pFunc ) Tcl_
d080: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
d090: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
d0a0: 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e  ->pStep ) Tcl_In
d0b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
d0c0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
d0d0: 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63  pFinal ) Tcl_Inc
d0e0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69  rRefCount(p->pFi
d0f0: 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  nal); .  if( p->
d100: 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49  pDestroy ) Tcl_I
d110: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
d120: 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63  Destroy); ..  rc
d130: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
d140: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
d150: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
d160: 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a  nc, (void *)p, .
d170: 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20        (p->pFunc 
d180: 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a  ? cf2Func : 0),.
d190: 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20        (p->pStep 
d1a0: 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a  ? cf2Step : 0),.
d1b0: 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c        (p->pFinal
d1c0: 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29   ? cf2Final : 0)
d1d0: 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73 74 72  ,.      cf2Destr
d1e0: 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  oy.  );.  if( rc
d1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d200: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
d210: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
d220: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d230: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
d240: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
d250: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d260: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
d270: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d280: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
d290: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
d2a0: 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  on DB-HANDLE FIL
d2b0: 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74  E ?PROC?.*/.stat
d2c0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64  ic int test_load
d2d0: 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c  _extension(.  Cl
d2e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
d2f0: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
d300: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
d310: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
d320: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
d330: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
d340: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
d350: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
d360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d370: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d380: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
d390: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
d3a0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
d3b0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
d3c0: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
d3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d3e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
d3f0: 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  zDb;.  char *zFi
d400: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f  le;.  char *zPro
d410: 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  c = 0;.  char *z
d420: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Err = 0;..  if( 
d430: 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21  objc!=4 && objc!
d440: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
d450: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d460: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
d470: 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f  HANDLE FILE ?PRO
d480: 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  C?");.    return
d490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d4a0: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
d4b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
d4c0: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
d4d0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
d4e0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ;.  if( objc==4 
d4f0: 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54  ){.    zProc = T
d500: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d510: 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  v[3]);.  }..  /*
d520: 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64   Extract the C d
d530: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66  atabase handle f
d540: 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  rom the Tcl comm
d550: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66  and name */.  if
d560: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
d570: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
d580: 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
d590: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d5a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
d5b0: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
d5c0: 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29   ", zDb, (char*)
d5d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d5e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d5f0: 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
d600: 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
d610: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
d620: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29  db;.  assert(db)
d630: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  ;..  /* Call the
d640: 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75   underlying C fu
d650: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  nction. If an er
d660: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d670: 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f  rc to .  ** TCL_
d680: 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61  ERROR and load a
d690: 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20  ny error string 
d6a0: 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  into the interpr
d6b0: 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a  eter. If no .  *
d6c0: 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
d6d0: 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b  set rc to TCL_OK
d6e0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
d6f0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
d700: 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20  XTENSION.  rc = 
d710: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d720: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
d730: 70 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69  printf("this bui
d740: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
d750: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
d760: 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  )");.#else.  rc 
d770: 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
d780: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69  xtension(db, zFi
d790: 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
d7a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
d7b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d7c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
d7d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20  lt(interp, zErr 
d7e0: 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c  ? zErr : "", TCL
d7f0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
d800: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
d810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d820: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  = TCL_OK;.  }.  
d830: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
d840: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  r);..  return rc
d850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d860: 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  : sqlite3_enable
d870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
d880: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a  DB-HANDLE ONOFF.
d890: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d8a0: 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a  st_enable_load(.
d8b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
d8c0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
d8d0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
d8e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
d8f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
d900: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
d910: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
d920: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d940: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d950: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d960: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d970: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
d980: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
d990: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
d9a0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
d9b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
d9c0: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69   int onoff;..  i
d9d0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
d9e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d9f0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
da00: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f  jv, "DB-HANDLE O
da10: 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75  NOFF");.    retu
da20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
da30: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
da40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
da50: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
da60: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
da70: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
da80: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
da90: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
daa0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
dab0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
dac0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
dad0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dae0: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
daf0: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
db00: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
db10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
db20: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
db30: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
db40: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
db50: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
db60: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  ert(db);..  /* G
db70: 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72  et the onoff par
db80: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  ameter */.  if( 
db90: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
dba0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
dbb0: 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
dbc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
dbd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66  _ERROR;.  }..#if
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
dc00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dc10: 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20  t(interp, "this 
dc20: 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69  build omits sqli
dc30: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
dc40: 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e  on()");.  return
dc50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
dc60: 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  e.  sqlite3_enab
dc70: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
dc80: 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  n(db, onoff);.  
dc90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23  return TCL_OK;.#
dca0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
dcb0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62  sage:  sqlite_ab
dcc0: 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f  ort.**.** Shutdo
dcd0: 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  wn the process i
dce0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69  mmediately.  Thi
dcf0: 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e  s is not a clean
dd00: 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68   shutdown..** Th
dd10: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
dd20: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 72  ed to test the r
dd30: 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66  ecoverability of
dd40: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a   a database in.*
dd50: 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  * the event of a
dd60: 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a   program crash..
dd70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
dd80: 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f  lite_abort(.  vo
dd90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
dda0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ddb0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ddc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ddd0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
dde0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
ddf0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
de00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
de10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
de20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
de30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
de40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
de50: 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  /.){.#if defined
de60: 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20  (_MSC_VER).  /* 
de70: 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74 68 65  We do this, othe
de80: 72 77 69 73 65 20 74 68 65 20 74 65 73 74 20 77  rwise the test w
de90: 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20 61 20  ill halt with a 
dea0: 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a 20 20  popup message.  
deb0: 20 2a 20 74 68 61 74 20 77 65 20 68 61 76 65 20   * that we have 
dec0: 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20 62 65  to click away be
ded0: 66 6f 72 65 20 74 68 65 20 74 65 73 74 20 77 69  fore the test wi
dee0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20  ll continue..   
def0: 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f  */.  _set_abort_
df00: 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f 43 41  behavior( 0, _CA
df10: 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54 20 29  LL_REPORTFAULT )
df20: 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69 74 28  ;.#endif.  exit(
df30: 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20  255);.  assert( 
df40: 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f  interp==0 );   /
df50: 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61  * This will alwa
df60: 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74  ys fail */.  ret
df70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
df80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
df90: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ng routine is a 
dfa0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c  user-defined SQL
dfb0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20   function whose 
dfc0: 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f  purpose.** is to
dfd0: 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   test the sqlite
dfe0: 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50  _set_result() AP
dff0: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  I..*/.static voi
e000: 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74  d testFunc(sqlit
e010: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
e020: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
e030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
e040: 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61  rgv){.  while( a
e050: 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f  rgc>=2 ){.    co
e060: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20  nst char *zArg0 
e070: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
e080: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
e090: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41  [0]);.    if( zA
e0a0: 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rg0 ){.      if(
e0b0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
e0c0: 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29  mp(zArg0, "int")
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e0e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
e0f0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
e100: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
e110: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
e120: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e130: 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34  Cmp(zArg0,"int64
e140: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e150: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e160: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73  int64(context, s
e170: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
e180: 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  64(argv[1]));.  
e190: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
e1a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
e1b0: 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20  g0,"string")==0 
e1c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e1d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
e1e0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
e1f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e200: 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a  t(argv[1]), -1,.
e210: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e220: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
e230: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e240: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
e250: 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  rg0,"double")==0
e260: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e270: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
e280: 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  e(context, sqlit
e290: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
e2a0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e2b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e2c0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e2d0: 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
e2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e2f0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
e300: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
e310: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e320: 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22  mp(zArg0,"value"
e330: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e340: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
e350: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
e360: 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  gv[sqlite3_value
e370: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b  _int(argv[1])]);
e380: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e390: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
e3a0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
e3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
e3c0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e3d0: 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d     }.    argc -=
e3e0: 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20   2;.    argv += 
e3f0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  2;.  }.  return;
e400: 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
e410: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
e420: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72  ror(context,"fir
e430: 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  st argument shou
e440: 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a  ld be one of: ".
e450: 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34        "int int64
e460: 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e   string double n
e470: 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b  ull value", -1);
e480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e490: 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74     sqlite_regist
e4a0: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
e4b0: 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a    DB  NAME.**.**
e4c0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 74 65   Register the te
e4d0: 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  st SQL function 
e4e0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e4f0: 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d  DB under the nam
e500: 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69  e NAME..*/.stati
e510: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73  c int test_regis
e520: 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ter_func(.  void
e530: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
e540: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e550: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e560: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e570: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e580: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
e590: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
e5a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e5b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
e5c0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
e5d0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
e5e0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
e5f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e600: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
e610: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
e620: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e630: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e640: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e650: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
e660: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 55   .       " DB FU
e670: 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29  NCTION-NAME", 0)
e680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
e6a0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
e6b0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
e6c0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
e6d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
e6e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e6f0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  unction(db, argv
e700: 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [2], -1, SQLITE_
e710: 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20  UTF8, 0, .      
e720: 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  testFunc, 0, 0);
e730: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
e740: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e750: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
e760: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
e770: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
e790: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
e7a0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
e7b0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
e7c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
e7d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
e7e0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
e7f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53  ite3_finalize  S
e800: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  TMT .**.** Final
e810: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ize a statement 
e820: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
e830: 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c  c int test_final
e840: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
e850: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e860: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e870: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e880: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e890: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
e8a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
e8b0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
e8c0: 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66  3 *db = 0;..  if
e8d0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
e8e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e8f0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e900: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e910: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
e920: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e930: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
e940: 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
e950: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e960: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e970: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e980: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e990: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e9a0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
e9c0: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
e9d0: 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70   db = StmtToDb(p
e9e0: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  Stmt);.  }.  rc 
e9f0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
ea00: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ze(pStmt);.  Tcl
ea10: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ea20: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
ea30: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
ea40: 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64  STATIC);.  if( d
ea50: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74  b && sqlite3Test
ea60: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
ea70: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
ea80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
ea90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
eaa0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
eab0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
eac0: 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52  s  STMT  CODE  R
ead0: 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47  ESETFLAG.**.** G
eae0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
eaf0: 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72  a status counter
eb00: 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e   from a statemen
eb10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
eb20: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
eb30: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
eb40: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
eb50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
eb60: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
eb70: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
eb80: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eb90: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eba0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
ebb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
ebc0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
ebd0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
ebe0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ebf0: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ec00: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ec10: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ec20: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ec30: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ec40: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ec50: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ec60: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ec70: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ec80: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ec90: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
eca0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ecb0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
ecc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
ecd0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ece0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
ecf0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ed00: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
ed10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
ed20: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ed30: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
ed40: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ed50: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
ed60: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
ed70: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
ed80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ed90: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
eda0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
edb0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
edc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
edd0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ede0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
edf0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ee00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ee10: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
ee20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
ee30: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
ee40: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
ee50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
ee60: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
ee70: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
ee80: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
ee90: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
eea0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
eeb0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
eec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
eed0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
eee0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
eef0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ef00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
ef10: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
ef20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ef30: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
ef40: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
ef50: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
ef60: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
ef70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
ef80: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
ef90: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
efa0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
efb0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
efc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
efd0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
efe0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
eff0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f000: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f010: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f020: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f030: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f040: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
f060: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a  tmt_scanstatus(.
f070: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f080: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f090: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f0a0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f0b0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f0c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f0d0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
f0e0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
f0f0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ument */.  int i
f100: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
f110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
f120: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f  cond argument */
f130: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
f140: 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zName;.  const c
f150: 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20  har *zExplain;. 
f160: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
f170: 4c 6f 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Loop;.  sqlite3_
f180: 69 6e 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20  int64 nVisit;.  
f190: 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69  double rEst;.  i
f1a0: 6e 74 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f  nt res;..  if( o
f1b0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f1c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f1d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f1e0: 22 53 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20  "STMT IDX");.   
f1f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f200: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f210: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f220: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f230: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f240: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f250: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
f260: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f270: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f280: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
f290: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65  TCL_ERROR;..  re
f2a0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  s = sqlite3_stmt
f2b0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f2c0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f2d0: 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28  CANSTAT_NLOOP, (
f2e0: 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20  void*)&nLoop);. 
f2f0: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
f300: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
f310: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
f320: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f340: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
f350: 72 69 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c  ringObj("nLoop",
f360: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
f370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f380: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f390: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e  _NewWideIntObj(n
f3a0: 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69  Loop));.    sqli
f3b0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f3c0: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f3d0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f3e0: 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
f3f0: 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c  nVisit);.    Tcl
f400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f410: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
f420: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f430: 22 6e 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a  "nVisit", -1));.
f440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f460: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pRet, Tcl_NewWid
f470: 65 49 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29  eIntObj(nVisit))
f480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f490: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f4a0: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f4b0: 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
f4c0: 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
f4d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f4e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f4f0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f500: 67 4f 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29  gObj("nEst", -1)
f510: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f520: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f530: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f540: 44 6f 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29  DoubleObj(rEst))
f550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f560: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f570: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f580: 5f 53 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20  _SCANSTAT_NAME, 
f590: 28 76 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a  (void*)&zName);.
f5a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f5b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f5c0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
f5d0: 69 6e 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20  ingObj("zName", 
f5e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
f5f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f600: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f610: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
f620: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71  me, -1));.    sq
f630: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f640: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f650: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f660: 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
f670: 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
f680: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f690: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f6a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f6b0: 67 4f 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c  gObj("zExplain",
f6c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
f6d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f6e0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f6f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
f700: 78 70 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20  xplain, -1));.  
f710: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
f720: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
f730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
f740: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
f750: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nterp);.  }.  re
f760: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f770: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f780: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f790: 74 61 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d  tatus_reset  STM
f7a0: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
f7b0: 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
f7c0: 61 74 75 73 5f 72 65 73 65 74 28 0a 20 20 76 6f  atus_reset(.  vo
f7d0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
f7e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f7f0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
f800: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
f810: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
f820: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
f830: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
f840: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
f850: 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 6a 63 21  t */.  if( objc!
f860: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
f870: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f880: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
f890: 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
f8a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f8b0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f8c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f8d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f8e0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f8f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f900: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
f910: 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28  canstatus_reset(
f920: 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
f930: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
f940: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
f950: 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
f960: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
f970: 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c  ite3_config_sqll
f980: 6f 67 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68  og.**.** Zero th
f990: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
f9a0: 53 51 4c 4c 4f 47 20 63 6f 6e 66 69 67 75 72 61  SQLLOG configura
f9b0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
f9c0: 6e 74 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73  nt test_config_s
f9d0: 71 6c 6c 6f 67 28 0a 20 20 76 6f 69 64 20 2a 20  qllog(.  void * 
f9e0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f9f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
fa00: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
fa10: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
fa20: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
fa30: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
fa40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
fa50: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  rst argument */.
fa60: 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
fa70: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
fa80: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
fa90: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
faa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fab0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
fac0: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
fad0: 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20 30 2c 20  NFIG_SQLLOG, 0, 
fae0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
faf0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
fb00: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fb10: 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20  ite3_next_stmt  
fb20: 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  DB  STMT.**.** R
fb30: 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73  eturn the next s
fb40: 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65  tatment in seque
fb50: 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a  nce after STMT..
fb60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
fb70: 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20  st_next_stmt(.  
fb80: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fb90: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fba0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fbb0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fbc0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fbd0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fbe0: 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33  pStmt;.  sqlite3
fbf0: 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72   *db = 0;.  char
fc00: 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66   zBuf[50];..  if
fc10: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
fc20: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
fc30: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
fc40: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
fc50: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
fc60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
fc70: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
fc80: 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29  , " DB STMT", 0)
fc90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fca0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
fcb0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
fcc0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fcd0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fce0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
fcf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
fd00: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
fd10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
fd20: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
fd30: 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
fd40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d  CL_ERROR;.  pStm
fd50: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
fd60: 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29  _stmt(db, pStmt)
fd70: 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ;.  if( pStmt ){
fd80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
fd90: 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
fda0: 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
fdb0: 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
fdc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fdd0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fde0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
fdf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fe00: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
fe10: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fe20: 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20  _stmt_readonly  
fe30: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
fe40: 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69  n true if STMT i
fe50: 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
fe60: 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
fe70: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
fe80: 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
fe90: 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  ed to leave the 
fea0: 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66  database unmodif
feb0: 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
fec0: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61  nt test_stmt_rea
fed0: 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
fee0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
fef0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ff00: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
ff10: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
ff20: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
ff30: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ff40: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
ff50: 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
ff60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ff70: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
ff80: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
ff90: 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
ffa0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ffb0: 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
ffc0: 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
ffd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ffe0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
fff0: 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
10000 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10010 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
10020 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
10040 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
10050 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
10060 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10070 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10080 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29  wBooleanObj(rc))
10090 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
100a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
100b0 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
100c0 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  _busy  STMT.**.*
100d0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
100e0 20 53 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e   STMT is a non-N
100f0 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  ULL pointer to a
10100 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68   statement.** th
10110 61 74 20 68 61 73 20 62 65 65 6e 20 73 74 65 70  at has been step
10120 70 65 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63  ped but not to c
10130 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ompletion..*/.st
10140 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
10150 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64 20  mt_busy(.  void 
10160 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10170 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10180 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10190 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
101a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
101b0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
101c0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
101d0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
101e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
101f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10200 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10210 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10220 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10230 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10240 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
10250 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10260 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
10270 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10280 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10290 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
102a0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
102b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
102c0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
102d0 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20 54  busy(pStmt);.  T
102e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
102f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
10300 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a  ooleanObj(rc));.
10310 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10330 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72    uses_stmt_jour
10340 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  nal  STMT.**.** 
10350 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
10360 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74 65  TMT uses a state
10370 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
10380 0a 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 73  .static int uses
10390 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20  _stmt_journal(. 
103a0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
103b0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
103c0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
103d0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
103e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
103f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10400 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
10410 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
10420 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10430 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10440 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10450 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10460 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10470 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10480 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
10490 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
104a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
104b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
104c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
104d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
104e0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
104f0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
10500 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28  3_stmt_readonly(
10510 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
10520 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10530 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
10540 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53  nObj(((Vdbe *)pS
10550 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  tmt)->usesStmtJo
10560 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  urnal));.  retur
10570 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
10580 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10590 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20  te3_reset  STMT 
105a0 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73  .**.** Reset a s
105b0 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
105c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
105d0 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
105e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
105f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10600 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10610 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10620 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10630 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10640 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
10650 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10660 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10670 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10680 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10690 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
106a0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
106b0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
106c0 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
106d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
106e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
106f0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10700 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10710 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10720 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
10730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10740 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
10750 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
10760 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
10770 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
10780 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
10790 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
107a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
107b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
107c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
107d0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
107e0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
107f0 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
10800 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
10810 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10820 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
10830 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10840 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
10850 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
10860 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
10870 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
10880 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
10890 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
108a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
108b0 74 65 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20  test_expired(.  
108c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
108d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
108e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
108f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10900 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10910 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10920 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
10930 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10940 53 74 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Stmt;.  if( objc
10950 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10960 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10970 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10980 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10990 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
109a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
109b0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
109c0 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
109d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
109e0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
109f0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
10a00 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10a10 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
10a20 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10a30 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10a40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10a50 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
10a60 62 6a 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72  bj(sqlite3_expir
10a70 65 64 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e  ed(pStmt)));.#en
10a80 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
10a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10aa0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72  age:  sqlite3_tr
10ab0 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20  ansfer_bindings 
10ac0 46 52 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a  FROMSTMT TOSTMT.
10ad0 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61  **.** Transfer a
10ae0 6c 6c 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d  ll bindings from
10af0 20 46 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74   FROMSTMT over t
10b00 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74  o TOSTMT.*/.stat
10b10 69 63 20 69 6e 74 20 74 65 73 74 5f 74 72 61 6e  ic int test_tran
10b20 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69  sfer_bind(.  voi
10b30 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10b40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10b50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10b60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10b70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
10b80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10b90 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
10ba0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
10bb0 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69  t1, *pStmt2;.  i
10bc0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10bd0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10be0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10bf0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10c00 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
10c10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10c20 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10c30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54  ), " FROM-STMT T
10c40 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  O-STMT", 0);.   
10c50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10c60 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
10c70 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
10c80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10c90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
10ca0 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54 43 4c  mt1)) return TCL
10cb0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65  _ERROR;.  if( ge
10cc0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10cd0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10ce0 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53  ng(objv[2]), &pS
10cf0 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20 54 43  tmt2)) return TC
10d00 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
10d10 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10d20 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65  rp, .     Tcl_Ne
10d30 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
10d40 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
10d50 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74 32 29  s(pStmt1,pStmt2)
10d60 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
10d70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10d80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10d90 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44 42 0a  ite3_changes DB.
10da0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
10db0 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
10dc0 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  es made to the d
10dd0 61 74 61 62 61 73 65 20 62 79 20 74 68 65 20 6c  atabase by the l
10de0 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75  ast SQL.** execu
10df0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
10e00 69 6e 74 20 74 65 73 74 5f 63 68 61 6e 67 65 73  int test_changes
10e10 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10e20 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10e30 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10e40 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10e50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10e60 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
10e70 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
10e80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10e90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10ea0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10eb0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
10ec0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10ed0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
10ee0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
10ef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10f00 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
10f10 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10f20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10f30 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10f40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
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 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
10f80 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
10f90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
10fb0 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
10fc0 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
10fd0 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
10fe0 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
10ff0 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
11000 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
11010 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
11020 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
11030 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11040 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
11050 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
11060 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
11070 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
11080 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
11090 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
110a0 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
110b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
110c0 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65  DX-th occurrence
110d0 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
110e0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
110f0 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
11100 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
11110 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
11120 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
11130 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
11140 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
11150 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
11160 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
11170 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
11180 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
11190 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
111a0 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
111b0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
111c0 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
111d0 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
111e0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
111f0 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
11200 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
11210 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
11220 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
11230 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
11240 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
11250 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
11260 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
11270 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 28 0a   int test_bind(.
11280 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
11290 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
112a0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
112b0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
112c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
112d0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
112e0 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
112f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11300 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
11310 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
11320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
11330 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
11340 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
11350 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
11360 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
11370 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
11380 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
11390 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
113a0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
113b0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
113c0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
113d0 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
113e0 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
113f0 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
11400 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11410 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
11420 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
11430 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
11440 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
11450 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
11460 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
11470 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
11480 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11490 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
114a0 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
114b0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
114c0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
114d0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
114e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
114f0 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
11500 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
11510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
11520 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
11530 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
11540 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
11550 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
11560 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
11570 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
11580 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
11590 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
115a0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
115b0 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
115c0 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
115f0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11600 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
11610 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11620 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
11630 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
11640 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11650 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
11660 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
11670 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
11680 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11690 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
116a0 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
116b0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
116c0 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
116d0 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
116e0 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
116f0 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
11700 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11710 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11720 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
11730 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
11740 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
11750 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
11760 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
11770 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11780 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
11790 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
117a0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
117b0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
117c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
117d0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
117e0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
117f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11800 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
11810 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
11820 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
11830 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11840 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
11850 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
11860 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11870 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
11880 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
11890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
118a0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
118b0 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
118c0 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
118d0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
118e0 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
118f0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11900 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
11910 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
11920 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
11930 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
11940 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
11950 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
11960 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
11970 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
11980 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
11990 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
119a0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
119b0 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
119c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
119d0 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
119e0 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
119f0 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
11a00 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11a10 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
11a20 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
11a30 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
11a40 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
11a50 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
11a60 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
11a70 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
11a80 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
11a90 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
11aa0 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
11ab0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
11ac0 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
11ad0 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
11ae0 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
11af0 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
11b00 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
11b10 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
11b20 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
11b30 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
11b40 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
11b50 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
11b60 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
11b70 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
11b80 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
11b90 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
11ba0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
11bb0 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
11bc0 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
11bd0 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
11be0 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
11bf0 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
11c00 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
11c10 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
11c20 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
11c30 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
11c40 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
11c50 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
11c60 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
11c70 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
11c80 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
11c90 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
11ca0 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
11cb0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
11cc0 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
11cd0 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72  k with one inter
11ce0 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65  preter at a time
11cf0 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  , as the.** inte
11d00 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73  rp pointer to us
11d10 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e  e when evaluatin
11d20 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  g the TCL script
11d30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
11d40 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
11d50 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  erp..*/.static T
11d60 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74  cl_Interp* pTest
11d70 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73  CollateInterp;.s
11d80 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
11d90 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76  ollate_func(.  v
11da0 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  oid *pCtx, .  in
11db0 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nA, const void
11dc0 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20   *zA,.  int nB, 
11dd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
11de0 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
11df0 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  i = pTestCollate
11e00 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e  Interp;.  int en
11e10 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  cin = SQLITE_PTR
11e20 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20  _TO_INT(pCtx);. 
11e30 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
11e40 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  n;..  sqlite3_va
11e50 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c  lue *pVal;.  Tcl
11e60 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20  _Obj *pX;..  pX 
11e70 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
11e80 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  bj("test_collate
11e90 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
11ea0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
11eb0 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e  .  switch( encin
11ec0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
11ed0 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20  ITE_UTF8:.      
11ee0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11ef0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
11f00 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11f10 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20  UTF-8",-1));.   
11f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11f30 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  se SQLITE_UTF16L
11f40 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
11f50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11f60 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
11f70 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c  ringObj("UTF-16L
11f80 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
11f90 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
11fa0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20  QLITE_UTF16BE:. 
11fb0 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
11fc0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
11fd0 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
11fe0 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d  Obj("UTF-16BE",-
11ff0 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
12000 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
12010 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
12020 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65    }..  sqlite3Be
12030 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
12040 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
12050 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
12060 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
12070 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12080 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a  tStr(pVal, nA, z
12090 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  A, encin, SQLITE
120a0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
120b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
120c0 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
120d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
120e0 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
120f0 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
12100 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
12110 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
12120 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
12130 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12140 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a  tStr(pVal, nB, z
12150 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  B, encin, SQLITE
12160 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
12170 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
12180 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
12190 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
121a0 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
121b0 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
121c0 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
121d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
121e0 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
121f0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12200 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ee(pVal);.  }.  
12210 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
12220 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c  Malloc();..  Tcl
12230 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58  _EvalObjEx(i, pX
12240 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
12250 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
12260 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
12270 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  j(i, Tcl_GetObjR
12280 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b  esult(i), &res);
12290 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
122a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
122b0 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  _collate(.  void
122c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
122d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
122e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
122f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
12300 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
12310 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
12320 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f   val;.  sqlite3_
12330 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
12340 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
12350 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64  jc!=5 ) goto bad
12360 5f 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f  _args;.  pTestCo
12370 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e  llateInterp = in
12380 74 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44  terp;.  if( getD
12390 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
123a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
123b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
123c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
123d0 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
123e0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
123f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12400 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[2], &val) ) 
12410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12420 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12430 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12440 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
12450 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
12460 38 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76  8, .          (v
12470 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
12480 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  8, val?test_coll
12490 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69  ate_func:0);.  i
124a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
124b0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
124c0 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
124d0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
124e0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
124f0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
12500 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
12510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
12530 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
12540 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
12550 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
12560 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
12570 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
12580 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74  TF16LE, val?test
12590 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
125a0 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b  ;.    if( TCL_OK
125b0 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
125c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
125d0 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29  objv[4], &val) )
125e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
125f0 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66  R;..#if 0.    if
12600 28 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f  ( sqlite3_iMallo
12610 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20  cFail>0 ){.     
12620 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
12630 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65  Fail++;.    }.#e
12640 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
12650 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
12660 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
12670 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
12680 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
12690 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
126a0 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f  pVal, -1, "test_
126b0 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
126c0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
126d0 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31  ATIC);.    zUtf1
126e0 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  6 = sqlite3Value
126f0 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
12700 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
12710 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
12720 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
12730 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
12740 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
12750 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12760 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12770 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
12780 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
12790 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
127a0 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31  id *)SQLITE_UTF1
127b0 36 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  6BE, val?test_co
127c0 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
127d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
127e0 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
127f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
12800 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
12810 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  ex);.  }.  if( s
12820 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
12830 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
12840 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12850 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72  RROR;.  .  if( r
12860 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12870 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
12880 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
12890 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
128a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
128b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
128c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
128d0 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
128e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
128f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
12900 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
12910 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
12920 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12930 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
12940 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
12950 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
12960 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
12970 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
12980 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
12990 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
129a0 65 20 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a  e <db ptr>.**.**
129b0 20 41 64 64 20 61 20 75 74 66 2d 31 36 20 63 6f   Add a utf-16 co
129c0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
129d0 20 6e 61 6d 65 64 20 22 75 74 66 31 36 62 69 6e   named "utf16bin
129e0 22 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  " to the databas
129f0 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69  e.** handle. Thi
12a00 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  s collation sequ
12a10 65 6e 63 65 20 63 6f 6d 70 61 72 65 73 20 61 72  ence compares ar
12a20 67 75 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73  guments in the s
12a30 61 6d 65 20 77 61 79 20 61 73 20 74 68 65 0a 2a  ame way as the.*
12a40 2a 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61  * built-in colla
12a50 74 69 6f 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a  tion "binary"..*
12a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
12a70 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
12a80 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20  te_func(.  void 
12a90 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
12aa0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41  , const void *zA
12ab0 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73  ,.  int nB, cons
12ac0 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20  t void *zB.){.  
12ad0 69 6e 74 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e  int nCmp = (nA>n
12ae0 42 20 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20  B ? nB : nA);.  
12af0 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
12b00 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a  (zA, zB, nCmp);.
12b10 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
12b20 65 73 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20  es = nA - nB;.  
12b30 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
12b40 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 74  atic int test_ut
12b50 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a  f16bin_collate(.
12b60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12b70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12b80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12b90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12ba0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12bb0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
12bc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12bd0 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f  ( objc!=2 ) goto
12be0 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
12bf0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12c00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12c10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12c20 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12c30 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
12c40 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
12c50 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
12c60 31 36 62 69 6e 22 2c 20 53 51 4c 49 54 45 5f 55  16bin", SQLITE_U
12c70 54 46 31 36 2c 20 30 2c 20 0a 20 20 20 20 20 20  TF16, 0, .      
12c80 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
12c90 6c 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29 3b 0a  llate_func.  );.
12ca0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
12cb0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
12cc0 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
12cd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
12ce0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
12cf0 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57  ad_args:.  Tcl_W
12d00 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
12d10 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
12d20 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
12d30 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
12d40 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74   When the collat
12d50 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62  ion needed callb
12d60 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ack is invoked, 
12d70 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20  record the name 
12d80 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  of .** the reque
12d90 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66  sted collating f
12da0 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54  unction here.  T
12db0 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65  he recorded name
12dc0 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f   is linked.** to
12dd0 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20   a TCL variable 
12de0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65  and used to make
12df0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72   sure that the r
12e00 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
12e10 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f  on.** name is co
12e20 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrect..*/.static
12e30 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c   char zNeededCol
12e40 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61  lation[200];.sta
12e50 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64  tic char *pzNeed
12e60 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e  edCollation = zN
12e70 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a  eededCollation;.
12e80 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77  ../*.** Called w
12e90 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  hen a collating 
12ea0 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64  sequence is need
12eb0 65 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20  ed.  Registered 
12ec0 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
12ed0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
12ee0 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  d16()..*/.static
12ef0 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61   void test_colla
12f00 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20  te_needed_cb(.  
12f10 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73  void *pCtx, .  s
12f20 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
12f30 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f  t eTextRep,.  co
12f40 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a  nst void *pName.
12f50 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45  ){.  int enc = E
12f60 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b  NC(db);.  int i;
12f70 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f  .  char *z;.  fo
12f80 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61  r(z = (char*)pNa
12f90 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a  me, i=0; *z || z
12fa0 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  [1]; z++){.    i
12fb0 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43  f( *z ) zNeededC
12fc0 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20  ollation[i++] = 
12fd0 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65  *z;.  }.  zNeede
12fe0 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20  dCollation[i] = 
12ff0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  0;.  sqlite3_cre
13000 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
13010 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63       db, "test_c
13020 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29  ollate", ENC(db)
13030 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
13040 50 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63  PTR(enc), test_c
13050 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a  ollate_func);.}.
13060 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
13070 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
13080 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74  eeded DB.*/.stat
13090 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
130a0 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f  ate_needed(.  vo
130b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
130c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
130d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
130e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
130f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13100 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
13110 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
13120 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64  jc!=2 ) goto bad
13130 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
13140 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
13150 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13160 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
13170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13180 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
13190 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
131a0 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74  ed16(db, 0, test
131b0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f  _collate_needed_
131c0 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f  cb);.  zNeededCo
131d0 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a  llation[0] = 0;.
131e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
131f0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
13200 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
13210 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
13220 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
13230 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57  ad_args:.  Tcl_W
13240 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13250 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
13260 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
13270 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
13280 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61   tclcmd:   add_a
13290 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
132a0 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a  llations  DB.**.
132b0 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63  ** Add two new c
132c0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
132d0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
132e0 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20  se DB.**.**     
132f0 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a  utf16_aligned.**
13300 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69       utf16_unali
13310 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  gned.**.** Both 
13320 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
13330 63 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ces use the same
13340 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42   sort order as B
13350 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e  INARY..** The on
13360 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  ly difference is
13370 20 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f   that the utf16_
13380 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e  aligned collatin
13390 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73  g.** sequence is
133a0 20 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74   declared with t
133b0 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  he SQLITE_UTF16_
133c0 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a  ALIGNED flag..**
133d0 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20   Both collating 
133e0 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d  functions increm
133f0 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  ent the unaligne
13400 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a  d utf16 counter.
13410 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79  ** whenever they
13420 20 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68   see a string th
13430 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20  at begins on an 
13440 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72  odd byte boundar
13450 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
13460 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e   unaligned_strin
13470 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73  g_counter = 0;.s
13480 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d  tatic int alignm
13490 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76  entCollFunc(.  v
134a0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
134b0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
134c0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
134d0 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
134e0 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
134f0 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e    int rc, n;.  n
13500 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f   = nKey1<nKey2 ?
13510 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a   nKey1 : nKey2;.
13520 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26    if( nKey1>0 &&
13530 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
13540 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29  TR_TO_INT(pKey1)
13550 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
13560 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
13570 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26  .  if( nKey2>0 &
13580 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f  & 1==(1&(SQLITE_
13590 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32  PTR_TO_INT(pKey2
135a0 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f  ))) ) unaligned_
135b0 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b  string_counter++
135c0 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
135d0 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
135e0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
135f0 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20  .    rc = nKey1 
13600 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72  - nKey2;.  }.  r
13610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
13620 69 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e  ic int add_align
13630 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
13640 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ions(.  void * c
13650 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
13660 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13670 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
13680 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
13690 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
136a0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
136b0 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=2 ){.    if( 
136c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
136d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
136e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
136f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13700 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
13710 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13720 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e  on(db, "utf16_un
13730 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45  aligned", SQLITE
13740 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20  _UTF16, .       
13750 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
13760 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69  lFunc);.    sqli
13770 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13780 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f  tion(db, "utf16_
13790 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45  aligned", SQLITE
137a0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20  _UTF16_ALIGNED, 
137b0 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
137c0 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
137d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
137e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
137f0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
13800 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20  ITE_OMIT_UTF16) 
13810 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  */../*.** Usage:
13820 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69   add_test_functi
13830 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  on <db ptr> <utf
13840 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
13850 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
13860 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
13870 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
13880 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
13890 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a  he correct user.
138a0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** function call
138b0 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
138c0 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
138d0 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
138e0 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
138f0 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
13900 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
13910 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
13920 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65  s up to three ve
13930 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73  rsions of the us
13940 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  er function.** "
13950 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77  test_function" w
13960 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
13970 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68  dle <db>.  If th
13980 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13990 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  t is.** true, th
139a0 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
139b0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73  test_function is
139c0 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
139d0 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a  UTF-8, if the.**
139e0 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
139f0 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
13a00 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
13a10 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75  16le, if the fou
13a20 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  rth is.** true, 
13a30 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
13a40 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
13a50 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69    Previous versi
13a60 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66  ons of.** test_f
13a70 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65  unction are dele
13a80 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  ted..**.** The u
13a90 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ser function is 
13aa0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
13ab0 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  alling the follo
13ac0 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
13ad0 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66  .**.**   "test_f
13ae0 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61  unction <enc> <a
13af0 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  rg>".**.** Where
13b00 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66   <enc> is one of
13b10 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45   UTF-8, UTF-16LE
13b20 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64   or UTF16BE, and
13b30 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a   <arg> is the.**
13b40 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
13b50 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53   passed to the S
13b60 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  QL function. The
13b70 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
13b80 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63  by.** the TCL sc
13b90 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20  ript is used as 
13ba0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
13bb0 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
13bc0 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70  tion. It.** is p
13bd0 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20  assed to SQLite 
13be0 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66  using UTF-16BE f
13bf0 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f  or a UTF-8 test_
13c00 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d  function(), UTF-
13c10 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31  8.** for a UTF-1
13c20 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  6LE test_functio
13c30 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c  n(), and UTF-16L
13c40 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65  E for an impleme
13c50 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
13c60 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45  prefers UTF-16BE
13c70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
13c80 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
13c90 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
13ca0 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20  function_utf8(. 
13cb0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
13cc0 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
13cd0 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
13ce0 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
13cf0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13d00 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
13d10 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
13d20 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
13d30 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
13d40 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
13d50 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
13d60 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
13d70 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
13d80 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
13d90 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
13da0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
13db0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13dc0 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
13dd0 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
13de0 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  8", -1));.  Tcl_
13df0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13e00 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
13e10 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
13e20 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
13e30 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13e40 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
13e50 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
13e60 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
13e70 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
13e80 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
13e90 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
13ea0 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
13eb0 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
13ec0 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
13ed0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
13ee0 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
13ef0 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
13f00 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
13f10 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
13f20 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
13f30 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
13f40 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
13f50 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
13f60 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
13f70 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
13f80 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70  value_text16be(p
13f90 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
13fa0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
13fb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
13fc0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
13fd0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
13fe0 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65  function_utf16le
13ff0 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
14000 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
14010 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
14020 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
14030 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
14040 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
14050 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
14060 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
14070 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
14080 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
14090 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
140a0 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
140b0 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
140c0 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
140d0 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
140e0 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
140f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14100 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
14110 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
14120 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a  TF-16LE", -1));.
14130 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14140 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14150 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
14160 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
14170 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
14180 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
14190 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
141a0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
141b0 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
141c0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
141d0 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
141e0 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
141f0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14200 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
14210 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
14220 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
14230 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
14240 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14250 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14260 65 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29  ext(pCtx,(char*)
14270 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
14280 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49  xt(pVal),-1,SQLI
14290 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
142a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
142b0 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
142c0 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
142d0 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20  tion_utf16be(.  
142e0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
142f0 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
14300 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
14310 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
14320 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
14330 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
14340 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
14350 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
14360 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
14370 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
14380 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
14390 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
143a0 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
143b0 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
143c0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
143d0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
143e0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
143f0 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
14400 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
14410 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6BE", -1));.  Tc
14420 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14430 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
14440 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
14450 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
14460 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
14470 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d  text(argv[0]), -
14480 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
14490 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c  bjEx(interp, pX,
144a0 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
144b0 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70  efCount(pX);.  p
144c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
144d0 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
144e0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
144f0 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74  Val, -1, Tcl_Get
14500 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
14510 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c  erp), .      SQL
14520 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
14530 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
14540 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
14550 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  6(pCtx, sqlite3_
14560 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
14570 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
14580 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14590 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
145a0 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74  ult_text16be(pCt
145b0 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
145c0 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
145d0 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
145e0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
145f0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14600 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71  ext16le(pCtx, sq
14610 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14620 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
14630 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
14640 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
14650 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
14660 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
14670 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
14680 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74   */.static int t
14690 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  est_function(.  
146a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
146b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
146c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
146d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
146e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
146f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14700 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
14710 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
14720 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
14730 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
14740 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
14750 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
14760 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
14770 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
14780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14790 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
147a0 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
147b0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
147c0 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
147d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
147e0 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
147f0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
14800 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
14810 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
14820 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20   SQLITE_UTF8, . 
14830 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
14840 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14850 38 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  8, 0, 0);.  }.  
14860 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
14870 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
14880 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
14890 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
148a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
148b0 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
148c0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
148d0 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
148e0 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
148f0 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20  LITE_UTF16LE, . 
14900 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
14910 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
14920 31 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16le, 0, 0);.  }
14930 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
14940 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
14950 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14960 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[4], &val) ) re
14970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14980 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20    if( val ){.   
14990 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
149a0 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65  function(db, "te
149b0 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c  st_function", 1,
149c0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
149d0 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70   .        interp
149e0 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f  , test_function_
149f0 75 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a  utf16be, 0, 0);.
14a00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
14a10 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a  L_OK;.bad_args:.
14a20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
14a30 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
14a40 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
14a50 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
14a60 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
14a70 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
14a80 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c   " <DB> <utf8> <
14a90 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
14aa0 65 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  e>", 0);.#endif 
14ab0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
14ac0 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
14ad0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
14ae0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20  *.** Usage:     
14af0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
14b00 5f 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64  _errstr <err cod
14b10 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  e>.**.** Test th
14b20 61 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c  at the english l
14b30 61 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65  anguage string e
14b40 71 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73  quivalents for s
14b50 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
14b60 73 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54  s.** are sane. T
14b70 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
14b80 61 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65  an integer repre
14b90 73 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74  senting an sqlit
14ba0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a  e error code..**
14bb0 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61   The result is a
14bc0 20 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65   list of two ele
14bd0 6d 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e  ments, the strin
14be0 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
14bf0 20 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72   of the.** error
14c00 20 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e   code and the en
14c10 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
14c20 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  xplanation..*/.s
14c30 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
14c40 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20  rrstr(.  void * 
14c50 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
14c60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14c70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
14c80 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
14c90 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20  bjv[].){.  char 
14ca0 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b  *zCode;.  int i;
14cb0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
14cc0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
14cd0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
14ce0 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20  , objv, "<error 
14cf0 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20  code>");.  }..  
14d00 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53  zCode = Tcl_GetS
14d10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
14d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30    for(i=0; i<200
14d30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
14d40 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f  0==strcmp(t1Erro
14d50 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29  rName(i), zCode)
14d60 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14d70 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14d80 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
14d90 6c 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20  lite3ErrStr(i), 
14da0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
14db0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14dc0 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69  age:    breakpoi
14dd0 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  nt.**.** This ro
14de0 75 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72  utine exists for
14df0 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74   one purpose - t
14e00 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63  o provide a plac
14e10 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72  e to put a.** br
14e20 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44  eakpoint with GD
14e30 42 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72  B that can be tr
14e40 69 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43  iggered using TC
14e50 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65  L code.  The use
14e60 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20  .** for this is 
14e70 77 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61  when a particula
14e80 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20  r test fails on 
14e90 28 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68  (say) the 1485th
14ea0 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49   iteration..** I
14eb0 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73  n the TCL test s
14ec0 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64  cript, we can ad
14ed0 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73  d code like this
14ee0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b  :.**.**     if {
14ef0 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70  $i==1485} breakp
14f00 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  oint.**.** Then 
14f10 72 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20  run testfixture 
14f20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20  in the debugger 
14f30 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65  and wait for the
14f40 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a   breakpoint to.*
14f50 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64  * fire.  Then ad
14f60 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f  ditional breakpo
14f70 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20  ints can be set 
14f80 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68  to trace down th
14f90 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  e bug..*/.static
14fa0 20 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70   int test_breakp
14fb0 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  oint(.  void *No
14fc0 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
14fd0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
14fe0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
14ff0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
15000 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
15010 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15030 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
15040 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
15050 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
15060 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
15070 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
15080 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
15090 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
150a0 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
150b0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
150c0 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
150d0 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a    STMT IDX N.**.
150e0 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
150f0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
15100 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  b interface.  ST
15110 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15120 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
15130 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
15140 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
15150 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
15160 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
15170 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
15180 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
15190 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
151a0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
151b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
151c0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76  nd_zeroblob(.  v
151d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
151e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
151f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15200 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15210 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15220 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15230 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15240 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
15250 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
15260 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
15270 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15280 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
15290 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72  T IDX N");.    r
152a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
152b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
152c0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
152d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
152e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
152f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
15300 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15310 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15320 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
15330 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
15340 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15350 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15360 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
15370 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
15380 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
15390 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
153a0 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  zeroblob(pStmt, 
153b0 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
153c0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
153d0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
153e0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
153f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15400 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
15410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
15420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15430 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
15440 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
15450 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
15460 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20  bind_zeroblob64 
15470 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
15480 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15490 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
154a0 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
154b0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
154c0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
154d0 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
154e0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
154f0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
15500 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
15510 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
15520 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
15530 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
15540 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
15550 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
15560 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a  ind_zeroblob64(.
15570 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
15580 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
15590 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
155a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
155b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
155c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
155d0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
155e0 64 78 3b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69  dx;.  i64 n;.  i
155f0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
15600 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
15610 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15620 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15630 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20  STMT IDX N");.  
15640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15650 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
15660 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
15670 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15680 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15690 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
156a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
156b0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
156c0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
156d0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
156e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
156f0 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e  f( Tcl_GetWideIn
15700 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15710 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20   objv[3], &n) ) 
15720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15730 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15740 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  3_bind_zeroblob6
15750 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29  4(pStmt, idx, n)
15760 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15770 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15780 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
15790 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
157a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
157b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
157c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
157d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
157e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
157f0 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
15800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15810 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
15820 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
15830 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15840 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56  nd_int  STMT N V
15850 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15860 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15870 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20  _int interface. 
15880 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
15890 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
158a0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
158b0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
158c0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
158d0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
158e0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
158f0 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
15900 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
15910 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15920 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15930 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  d_int(.  void * 
15940 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
15950 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
15960 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
15970 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
15980 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15990 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
159a0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
159b0 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63   value;.  int rc
159c0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
159d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
159e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
159f0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15a00 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15a10 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
15a20 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
15a30 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
15a40 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  N VALUE", 0);.  
15a50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15a60 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
15a70 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
15a80 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
15a90 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
15aa0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
15ab0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15ac0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
15ad0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15ae0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
15af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15b00 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
15b10 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15b20 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
15b30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15b40 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
15b50 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d 74  3_bind_int(pStmt
15b60 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20  , idx, value);. 
15b70 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15b80 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15b90 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
15ba0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
15bb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
15bc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15bd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15be0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
15bf0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
15c00 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
15c10 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15c20 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  4  STMT N VALUE.
15c30 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
15c40 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
15c50 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  4 interface.  ST
15c60 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
15c70 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15c80 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15c90 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15ca0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15cb0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
15cc0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
15cd0 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
15ce0 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
15cf0 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
15d00 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 69   int test_bind_i
15d10 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
15d20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15d30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15d40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15d50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15d60 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15d70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
15d80 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f   int idx;.  Tcl_
15d90 57 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a 20  WideInt value;. 
15da0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
15db0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
15dc0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15dd0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
15de0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
15df0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
15e00 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15e10 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
15e20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
15e30 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15e50 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
15e60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15e70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15e80 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
15e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15ea0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
15eb0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15ec0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
15ed0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15ee0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15ef0 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
15f00 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
15f10 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72   &value) ) retur
15f20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
15f30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
15f40 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69  d_int64(pStmt, i
15f50 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66  dx, value);.  if
15f60 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
15f70 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
15f80 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
15f90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15fa0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
15fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15fc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15fd0 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
15fe0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
15ff0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
16000 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
16010 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a   STMT N VALUE.**
16020 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16030 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
16040 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
16050 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
16060 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20  statement..** N 
16070 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
16080 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
16090 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
160a0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
160b0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36  and.** binds a 6
160c0 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41  4-bit integer VA
160d0 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64  LUE to that wild
160e0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
160f0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f  int test_bind_do
16100 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
16110 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
16120 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
16130 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
16140 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
16150 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
16160 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
16170 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62   int idx;.  doub
16180 6c 65 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20  le value = 0;.  
16190 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
161a0 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e  char *zVal;.  in
161b0 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
161c0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
161d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
161e0 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
161f0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  of the special f
16200 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
16210 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  lue */.    unsig
16220 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20  ned int iUpper; 
16230 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69    /* Upper 32 bi
16240 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ts */.    unsign
16250 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20  ed int iLower;  
16260 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74   /* Lower 32 bit
16270 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61  s */.  } aSpecia
16280 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  lFp[] = {.    { 
16290 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37   "NaN",      0x7
162a0 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
162b0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53  fff },.    {  "S
162c0 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37  NaN",     0x7ff7
162d0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
162e0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
162f0 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66  ",     0xfffffff
16300 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
16310 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c  .    {  "-SNaN",
16320 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20      0xfff7ffff, 
16330 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
16340 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20    {  "+Inf",    
16350 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30   0x7ff00000, 0x0
16360 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
16370 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78    "-Inf",     0x
16380 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  fff00000, 0x0000
16390 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
163a0 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30  Epsilon",  0x000
163b0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
163c0 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70  1 },.    {  "-Ep
163d0 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30  silon", 0x800000
163e0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
163f0 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c  ,.    {  "NaN0",
16400 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c       0x7ff80000,
16410 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
16420 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20     {  "-NaN0",  
16430 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78    0xfff80000, 0x
16440 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
16450 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
16460 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16480 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16490 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
164a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
164b0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
164c0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
164d0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
164e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
164f0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
16500 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
16510 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16520 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
16530 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
16540 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16550 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
16560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
16570 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
16580 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f   TCL_ERROR;..  /
16590 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20  * Intercept the 
165a0 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64  string "NaN" and
165b0 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20   generate a NaN 
165c0 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20  value for it..  
165d0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72  ** All other str
165e0 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20  ings are passed 
165f0 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47  through to Tcl_G
16600 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
16610 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44  )..  ** Tcl_GetD
16620 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73  oubleFromObj() s
16630 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64  hould understand
16640 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20   "NaN" but some 
16650 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f  versions.  ** co
16660 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a  ntain a bug..  *
16670 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47  /.  zVal = Tcl_G
16680 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
16690 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
166a0 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
166b0 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69  p)/sizeof(aSpeci
166c0 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  alFp[0]); i++){.
166d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
166e0 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61  SpecialFp[i].zNa
166f0 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a  me, zVal)==0 ){.
16700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
16710 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20  nt64 x;.      x 
16720 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
16730 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20  iUpper;.      x 
16740 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20  <<= 32;.      x 
16750 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  |= aSpecialFp[i]
16760 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61  .iLower;.      a
16770 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61  ssert( sizeof(va
16780 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  lue)==8 );.     
16790 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
167a0 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d  x)==8 );.      m
167b0 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78  emcpy(&value, &x
167c0 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 8);.      brea
167d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
167e0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70  f( i>=sizeof(aSp
167f0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
16800 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26  aSpecialFp[0]) &
16810 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  &.         Tcl_G
16820 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
16830 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
16840 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   &value) ){.    
16850 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16860 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
16870 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
16880 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
16890 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
168a0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
168b0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
168c0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
168d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
168e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
168f0 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
16900 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
16910 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16920 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16930 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16940 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a  _null  STMT N.**
16950 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16960 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69  ite3_bind_null i
16970 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16980 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16990 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
169a0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
169b0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
169c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
169d0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
169e0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c  d.** binds a NUL
169f0 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  L to the wildcar
16a00 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16a10 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28   test_bind_null(
16a20 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16a30 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16a40 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
16a50 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16a60 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16a70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
16a80 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
16a90 69 64 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  idx;.  int rc;..
16aa0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
16ab0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
16ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
16ad0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
16ae0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
16af0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
16b00 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
16b10 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c  , 0), " STMT N",
16b20 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
16b30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16b40 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
16b50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
16b60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
16b70 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
16b80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16b90 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16ba0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16bb0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
16bc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16bd0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
16be0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53  te3_bind_null(pS
16bf0 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28  tmt, idx);.  if(
16c00 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
16c10 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
16c20 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16c30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16c40 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
16c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16c60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16c70 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16c80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16c90 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16ca0 33 5f 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d  3_bind_text  STM
16cb0 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
16cc0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
16cd0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16ce0 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  t interface.  ST
16cf0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16d00 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16d10 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16d20 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
16d30 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
16d40 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
16d50 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
16d60 55 54 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52  UTF-8 string STR
16d70 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63  ING to the wildc
16d80 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67  ard.  The string
16d90 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 0a   is BYTES bytes.
16da0 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ** long..*/.stat
16db0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16dc0 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20 2a 20  _text(.  void * 
16dd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16de0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16df0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16e00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16e10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16e20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16e30 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16e40 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16e50 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16e60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
16e70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
16e80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
16e90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
16ea0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
16eb0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
16ec0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
16ed0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
16ee0 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
16ef0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16f00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16f10 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
16f20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
16f30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16f40 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16f60 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16f70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16f80 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16f90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16fa0 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
16fb0 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
16fc0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
16fd0 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20 20 69  3], &bytes);.  i
16fe0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
16ff0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
17000 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[4], &bytes) ) 
17010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17020 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
17030 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
17040 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
17050 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54 52 41  ytes, SQLITE_TRA
17060 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28 20 73  NSIENT);.  if( s
17070 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
17080 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
17090 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
170a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
170b0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
170c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
170d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
170e0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
170f0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
17100 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17110 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
17120 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17130 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17140 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
17150 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20   ?-static? STMT 
17160 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
17170 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
17180 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
17190 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  6 interface.  ST
171a0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
171b0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
171c0 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
171d0 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
171e0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
171f0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
17200 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
17210 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20 53 54  UTF-16 string ST
17220 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69 6c 64  RING to the wild
17230 63 61 72 64 2e 20 20 54 68 65 20 73 74 72 69 6e  card.  The strin
17240 67 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73  g is BYTES bytes
17250 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  .** long..*/.sta
17260 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17270 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64  d_text16(.  void
17280 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17290 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
172a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
172b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
172c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
172d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
172e0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
172f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
17300 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
17310 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
17320 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
17330 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
17340 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f  id*) = (objc==6?
17350 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51  SQLITE_STATIC:SQ
17360 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
17370 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d  .  Tcl_Obj *oStm
17380 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  t    = objv[objc
17390 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -4];.  Tcl_Obj *
173a0 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b  oN       = objv[
173b0 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-3];.  Tcl_O
173c0 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f  bj *oString  = o
173d0 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54  bjv[objc-2];.  T
173e0 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20  cl_Obj *oBytes  
173f0 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
17400 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
17410 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20  && objc!=6){.   
17420 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
17430 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
17440 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
17450 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
17460 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
17470 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
17480 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
17490 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
174a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
174b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
174c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
174d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
174e0 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d  ng(oStmt), &pStm
174f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
17500 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
17510 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
17520 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29  nterp, oN, &idx)
17530 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17540 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
17550 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
17560 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53  eArrayFromObj(oS
17570 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28  tring, 0);.  if(
17580 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17590 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65  bj(interp, oByte
175a0 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  s, &bytes) ) ret
175b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
175c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
175d0 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74  ind_text16(pStmt
175e0 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76  , idx, (void *)v
175f0 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17600 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l);.  if( sqlite
17610 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
17620 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
17630 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
17640 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17660 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
17670 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17680 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
17690 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
176a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
176b0 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
176c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
176d0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
176e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
176f0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
17700 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
17710 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
17720 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17730 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17740 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
17750 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
17760 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17770 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17780 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17790 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
177a0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
177b0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
177c0 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
177d0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
177e0 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
177f0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
17800 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
17810 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
17820 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
17830 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17840 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17850 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17860 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17870 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17880 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
17890 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
178a0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
178b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 65  rc;.  sqlite3_de
178c0 73 74 72 75 63 74 6f 72 5f 74 79 70 65 20 78 44  structor_type xD
178d0 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
178e0 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20  TE_TRANSIENT;.. 
178f0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
17900 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 54  objc!=6 ){.    T
17910 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17920 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
17930 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
17940 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
17950 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
17960 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
17970 22 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59  " STMT N DATA BY
17980 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
17990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
179a0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
179b0 3d 36 20 29 7b 0a 20 20 20 20 78 44 65 73 74 72  =6 ){.    xDestr
179c0 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53  uctor = SQLITE_S
179d0 54 41 54 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b  TATIC;.    objv+
179e0 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  +;.  }..  if( ge
179f0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
17a00 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
17a10 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
17a20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
17a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
17a40 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
17a50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
17a60 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
17a70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
17a80 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  lue = Tcl_GetStr
17a90 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
17aa0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17ab0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17ac0 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[4], &bytes) )
17ad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17ae0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17af0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74  e3_bind_blob(pSt
17b00 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20  mt, idx, value, 
17b10 62 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74  bytes, xDestruct
17b20 6f 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  or);.  if( sqlit
17b30 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
17b40 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
17b50 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
17b60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17b70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17b80 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17b90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17ba0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
17bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
17bc0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
17bd0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
17be0 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
17bf0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
17c00 66 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74  f wildcards in t
17c10 68 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65  he given stateme
17c20 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
17c30 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61  t test_bind_para
17c40 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76  meter_count(.  v
17c50 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17c60 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17c70 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17c80 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17c90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17ca0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17cb0 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
17cc0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
17cd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17ce0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17cf0 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
17d00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17d10 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
17d20 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17d30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17d40 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17d50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17d60 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17d70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17d80 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
17d90 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17da0 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  r_count(pStmt)))
17db0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17dc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17dd0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17de0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
17df0 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20    STMT  N.**.** 
17e00 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
17e10 6f 66 20 74 68 65 20 4e 74 68 20 77 69 6c 64 63  of the Nth wildc
17e20 61 72 64 2e 20 20 54 68 65 20 66 69 72 73 74 20  ard.  The first 
17e30 77 69 6c 64 63 61 72 64 20 69 73 20 31 2e 0a 2a  wildcard is 1..*
17e40 2a 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  * An empty strin
17e50 67 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  g is returned if
17e60 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
17e70 67 65 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c  ge or if the wil
17e80 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65  dcard.** is name
17e90 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  less..*/.static 
17ea0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  int test_bind_pa
17eb0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20  rameter_name(.  
17ec0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17ed0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17ee0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17ef0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17f00 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17f10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
17f20 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  pStmt;.  int i;.
17f30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
17f40 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17f50 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17f60 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22  , objv, "STMT N"
17f70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17f80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
17f90 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17fa0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17fb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17fc0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17fd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17fe0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17ff0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
18000 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65 74  jv[2], &i) ) ret
18010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18020 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18030 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
18040 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
18050 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
18060 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53 74  rameter_name(pSt
18070 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20  mt,i),-1).  );. 
18080 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18090 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
180a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
180b0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20 20  arameter_index  
180c0 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a  STMT  NAME.**.**
180d0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
180e0 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  x of the wildcar
180f0 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20  d called NAME.  
18100 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  Return 0 if ther
18110 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20  e is.** no such 
18120 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
18130 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
18140 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
18150 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  x(.  void * clie
18160 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18170 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18180 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18190 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
181a0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
181b0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
181c0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
181d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
181e0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
181f0 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29  jv, "STMT NAME")
18200 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18210 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18220 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
18230 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
18240 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
18250 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
18260 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
18270 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
18280 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
18290 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20  l_NewIntObj(.   
182a0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
182b0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
182c0 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74  (pStmt,Tcl_GetSt
182d0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20  ring(objv[2])). 
182e0 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74      ).  );.  ret
182f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18300 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
18310 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
18320 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a  ings STMT.**.*/.
18330 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18340 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a  clear_bindings(.
18350 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18360 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18370 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18380 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18390 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
183a0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
183b0 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
183c0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
183d0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
183e0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
183f0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
18400 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18410 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
18420 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18430 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18440 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18450 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18460 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
18470 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18480 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
18490 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
184a0 69 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20  ings(pStmt)));. 
184b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
184c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
184d0 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20    sqlite3_sleep 
184e0 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a  MILLISECONDS.*/.
184f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
18500 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  sleep(.  void * 
18510 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18520 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18530 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18540 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18550 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d  bjv[].){.  int m
18560 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  s;..  if( objc!=
18570 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
18580 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
18590 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c  , 1, objv, "MILL
185a0 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20  ISECONDS");.    
185b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
185c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
185d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
185e0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
185f0 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ms) ){.    retur
18600 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18610 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18620 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18630 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
18640 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20  3_sleep(ms)));. 
18650 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18660 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18670 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
18680 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
18690 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
186a0 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
186b0 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
186c0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
186d0 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
186e0 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
186f0 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
18700 63 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72  c int test_ex_er
18710 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
18720 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18730 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18740 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18750 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18760 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18770 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
18780 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18790 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
187a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
187b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
187c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
187d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
187e0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
187f0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
18800 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18810 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18820 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18830 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18840 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18850 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18870 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
18880 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18890 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
188a0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
188b0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
188c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
188d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
188e0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
188f0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
18900 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
18910 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18920 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18930 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18940 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18950 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
18960 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18970 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
18980 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18990 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
189a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
189b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
189c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
189d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
189e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
189f0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
18a00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18a10 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18a20 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18a30 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
18a40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
18a50 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
18a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18a70 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
18a80 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
18a90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18aa0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
18ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18ac0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
18ad0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
18ae0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18af0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
18b00 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
18b10 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
18b20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18b30 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18b40 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a  3_errmsg DB.**.*
18b50 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54  * Returns the UT
18b60 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69  F-8 representati
18b70 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20  on of the error 
18b80 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66  message string f
18b90 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  or the.** most r
18ba0 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
18bb0 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  API call..*/.sta
18bc0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
18bd0 6d 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  msg(.  void * cl
18be0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18bf0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18c00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18c10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18c20 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18c30 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
18c40 61 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28  ar *zErr;..  if(
18c50 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
18c60 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
18c70 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
18c80 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
18c90 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
18ca0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18cb0 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
18cc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18cd0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18ce0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
18cf0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
18d00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
18d10 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
18d20 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
18d30 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
18d40 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  (db);.  Tcl_SetO
18d50 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
18d60 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
18d70 6a 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20  j(zErr, -1));.  
18d80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18d90 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
18da0 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44   test_errmsg16 D
18db0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18dc0 74 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65  the UTF-16 repre
18dd0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
18de0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
18df0 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
18e00 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
18e10 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
18e20 20 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20   This is a byte 
18e30 61 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20  array object at 
18e40 74 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65  the TCL .** leve
18e50 6c 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64  l, and it includ
18e60 65 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30  es the 0x00 0x00
18e70 20 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65   terminator byte
18e80 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
18e90 74 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74  the.** UTF-16 st
18ea0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
18eb0 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31  int test_errmsg1
18ec0 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
18ed0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18ee0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18ef0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18f00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18f10 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
18f20 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
18f30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18f40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72  const void *zErr
18f50 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
18f60 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d  z;.  int bytes =
18f70 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
18f80 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
18f90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
18fa0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
18fb0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
18fc0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
18fd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
18fe0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
18ff0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
19010 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
19020 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19030 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
19040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19050 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69  ;..  zErr = sqli
19060 74 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29  te3_errmsg16(db)
19070 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a  ;.  if( zErr ){.
19080 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20      z = zErr;.  
19090 20 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a    for(bytes=0; z
190a0 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74  [bytes] || z[byt
190b0 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29  es+1]; bytes+=2)
190c0 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  {}.  }.  Tcl_Set
190d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
190e0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
190f0 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65  ayObj(zErr, byte
19100 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  s));.#endif /* S
19110 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
19120 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
19130 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19140 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
19150 70 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65  pare DB sql byte
19160 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
19170 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
19180 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
19190 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
191a0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
191b0 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
191c0 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
191d0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
191e0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
191f0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
19200 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
19210 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
19220 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
19230 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
19240 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
19250 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
19260 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19270 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20  prepare(.  void 
19280 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
19290 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
192a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
192b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
192c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
192d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
192e0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
192f0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e  int bytes;.  con
19300 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d  st char *zTail =
19310 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
19320 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
19330 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
19340 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19350 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
19360 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
19370 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19380 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19390 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
193a0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
193b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
193c0 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
193d0 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
193e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
193f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
19400 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
19410 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
19420 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
19430 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
19440 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
19450 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19460 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
19470 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
19480 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
19490 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
194a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
194b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
194c0 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62  pare(db, zSql, b
194d0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
194e0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
194f0 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74   0);.  Tcl_Reset
19500 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
19510 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
19520 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
19530 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
19540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19550 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  f( zTail && objc
19560 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=5 ){.    if( b
19570 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
19580 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
19590 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71   (int)(zTail-zSq
195a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
195b0 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  ( (int)strlen(zT
195c0 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20  ail)<bytes ){.  
195d0 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74      bytes = (int
195e0 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a  )strlen(zTail);.
195f0 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62      }.    Tcl_Ob
19600 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
19610 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c   objv[4], 0, Tcl
19620 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54  _NewStringObj(zT
19630 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b  ail, bytes), 0);
19640 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19650 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19660 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30  assert( pStmt==0
19670 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
19680 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
19690 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25  zBuf), zBuf, "(%
196a0 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
196b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
196c0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
196d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
196e0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
196f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19700 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
19710 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
19720 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
19730 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
19740 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
19750 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54  TCL_ERROR;.    T
19760 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19770 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
19780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
19790 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
197a0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
197b0 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c  repare_v2 DB sql
197c0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
197d0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
197e0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
197f0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
19800 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
19810 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
19820 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
19830 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
19840 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
19850 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
19860 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
19870 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
19880 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
19890 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
198a0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
198b0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
198c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
198d0 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28  test_prepare_v2(
198e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
198f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19900 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19910 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19920 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19930 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19940 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
19950 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43  zSql;.  char *zC
19960 6f 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  opy = 0;        
19970 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f          /* mallo
19980 63 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c  c() copy of zSql
19990 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b   */.  int bytes;
199a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
199b0 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
199c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
199d0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
199e0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
199f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
19a00 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
19a10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19a20 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19a30 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19a40 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19a50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19a60 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19a70 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
19a80 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19a90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19aa0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
19ab0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
19ac0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19ad0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
19ae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
19af0 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
19b00 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
19b10 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
19b20 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
19b30 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
19b40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19b50 0a 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f  ..  /* Instead o
19b60 66 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72  f using zSql dir
19b70 65 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f  ectly, make a co
19b80 70 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  py into a buffer
19b90 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64   obtained.  ** d
19ba0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c  irectly from mal
19bb0 6c 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20  loc(). The idea 
19bc0 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  is to make it ea
19bd0 73 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e  sier for valgrin
19be0 64 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62  d.  ** to spot b
19bf0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e  uffer overreads.
19c00 20 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73    */.  if( bytes
19c10 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79  >=0 ){.    zCopy
19c20 20 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29   = malloc(bytes)
19c30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
19c40 70 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29  py, zSql, bytes)
19c50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
19c60 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
19c70 65 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20  en(zSql) + 1;.  
19c80 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
19c90 28 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (n);.    memcpy(
19ca0 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b  zCopy, zSql, n);
19cb0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
19cc0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
19cd0 62 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c  b, zCopy, bytes,
19ce0 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35   &pStmt, objc>=5
19cf0 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a   ? &zTail : 0);.
19d00 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20    free(zCopy);. 
19d10 20 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28   zTail = &zSql[(
19d20 7a 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b  zTail - zCopy)];
19d30 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ..  assert(rc==S
19d40 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
19d50 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73  t==0);.  Tcl_Res
19d60 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
19d70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
19d80 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
19d90 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
19da0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19db0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19dc0 4f 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f  OK && zTail && o
19dd0 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
19de0 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
19df0 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
19e00 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
19e10 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
19e20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
19e30 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
19e40 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
19e50 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
19e60 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
19e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19e80 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19e90 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
19ea0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
19eb0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
19ec0 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
19ed0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19ee0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19ef0 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
19f00 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
19f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19f20 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
19f30 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
19f40 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
19f50 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
19f60 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
19f70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19f80 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
19f90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
19fa0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
19fb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19fc0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
19fd0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
19fe0 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47  t3134 DB.**.** G
19ff0 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72  enerate a prepar
1a000 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72  ed statement for
1a010 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72   a zero-byte str
1a020 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a  ing as a test.**
1a030 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33   for ticket #313
1a040 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73  4.  The string s
1a050 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65  hould be precede
1a060 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65  d by a zero byte
1a070 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1a080 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74  test_prepare_tkt
1a090 33 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  3134(.  void * c
1a0a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1a0b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1a0c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1a0d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1a0e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1a0f0 33 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20  3 *db;.  static 
1a100 63 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b  const char zSql[
1a110 5d 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20  ] = "\000SELECT 
1a120 31 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  1";.  sqlite3_st
1a130 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1a140 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
1a150 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a160 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1a170 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a180 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a190 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a1a0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a1b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a1c0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a1d0 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
1a1e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a1f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a200 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a210 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a220 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a230 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1a250 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1a260 5f 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d  _v2(db, &zSql[1]
1a270 2c 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b  , 0, &pStmt, 0);
1a280 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1a290 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1a2a0 3d 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ==0);.  if( sqli
1a2b0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a2c0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
1a2d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a2e0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
1a2f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1a300 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
1a310 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
1a320 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
1a330 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29  uf), zBuf, "(%d)
1a340 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
1a350 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a360 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
1a370 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
1a380 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a390 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1a3a0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1a3b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a3c0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1a3d0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1a3e0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a3f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
1a400 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a410 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1a420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1a430 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1a440 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1a450 70 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79  pare16 DB sql by
1a460 74 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a  tes tailvar.**.*
1a470 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
1a480 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
1a490 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
1a4a0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
1a4b0 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
1a4c0 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
1a4d0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
1a4e0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
1a4f0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
1a500 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
1a510 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
1a520 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
1a530 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
1a540 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
1a550 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1a560 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a570 70 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69  prepare16(.  voi
1a580 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1a590 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1a5a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1a5b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1a5c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1a5d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a5e0 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
1a5f0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f   *db;.  const vo
1a600 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73  id *zSql;.  cons
1a610 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20  t void *zTail = 
1a620 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54  0;.  Tcl_Obj *pT
1a630 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1a640 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1a650 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1a660 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  50]; .  int rc;.
1a670 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20    int bytes;    
1a680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a690 68 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69  he integer speci
1a6a0 66 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f  fied as arg 3 */
1a6b0 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20  .  int objlen;  
1a6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a6d0 54 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c  The byte-array l
1a6e0 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a  ength of arg 2 *
1a6f0 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  /..  if( objc!=5
1a700 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
1a710 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a720 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a730 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a740 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1a750 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1a760 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
1a770 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1a780 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
1a790 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a7a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1a7b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1a7c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1a7d0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1a7e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a7f0 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42   zSql = Tcl_GetB
1a800 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1a810 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e  objv[2], &objlen
1a820 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1a830 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1a840 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1a850 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1a860 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
1a870 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1a880 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  6(db, zSql, byte
1a890 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
1a8a0 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
1a8b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1a8c0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1a8d0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1a8e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a8f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1a900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a910 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
1a920 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
1a930 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
1a940 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
1a950 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69  (int)((u8 *)zTai
1a960 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1a970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a980 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1a990 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1a9a0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1a9b0 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1a9c0 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1a9d0 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1a9e0 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1a9f0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1aa00 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1aa10 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1aa20 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1aa30 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1aa40 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1aa50 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1aa60 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1aa70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1aa80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1aa90 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1aaa0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1aab0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1aac0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1aad0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1aae0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1aaf0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1ab00 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32  te3_prepare16_v2
1ab10 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1ab20 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
1ab30 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1ab40 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1ab50 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1ab60 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1ab70 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1ab80 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61  dle <DB>. The pa
1ab90 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c  rameter <tailval
1aba0 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  > is the name of
1abb0 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72   a global.** var
1abc0 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65  iable that is se
1abd0 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20  t to the unused 
1abe0 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e  portion of <sql>
1abf0 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20   (if any). A.** 
1ac00 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72  STMT handle is r
1ac10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1ac20 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70  ic int test_prep
1ac30 61 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64  are16_v2(.  void
1ac40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1ac50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ac60 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ac70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ac80 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1ac90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1aca0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1acb0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1acc0 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74  d *zSql;.  const
1acd0 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30   void *zTail = 0
1ace0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61  ;.  Tcl_Obj *pTa
1acf0 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
1ad00 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1ad10 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
1ad20 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20  0]; .  int rc;. 
1ad30 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20   int bytes;     
1ad40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1ad50 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66  e integer specif
1ad60 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a  ied as arg 3 */.
1ad70 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20    int objlen;   
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ad90 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65  he byte-array le
1ada0 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f  ngth of arg 2 */
1adb0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1adc0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1add0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ade0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1adf0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1ae00 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1ae10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ae20 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1ae30 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1ae40 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1ae50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ae60 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1ae70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1ae80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ae90 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1aea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1aeb0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
1aec0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1aed0 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
1aee0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1aef0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1af00 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
1af10 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1af20 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
1af30 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1af40 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
1af50 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
1af60 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1af70 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1af80 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1af90 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1afa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1afb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1afc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1afd0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
1afe0 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1aff0 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20   zTail ){.      
1b000 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
1b010 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54  - (int)((u8 *)zT
1b020 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
1b030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b040 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
1b050 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20    }.    pTail = 
1b060 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1b070 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c  Obj((u8 *)zTail,
1b080 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63   objlen);.    Tc
1b090 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1b0a0 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  Tail);.    Tcl_O
1b0b0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1b0c0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
1b0d0 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ail, 0);.    Tcl
1b0e0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
1b0f0 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ail);.  }..  if(
1b100 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
1b110 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1b120 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1b130 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1b140 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b150 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
1b160 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1b170 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1b180 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b190 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1b1a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b1b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1b1c0 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
1b1d0 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
1b1e0 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
1b1f0 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f   test_open(.  vo
1b200 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b210 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b220 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b230 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b240 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b250 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1b260 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
1b270 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
1b280 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
1b290 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d  bjc!=3 && objc!=
1b2a0 32 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  2 && objc!=1 ){.
1b2b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b2c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1b2d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1b2e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1b2f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1b300 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c  (objv[0]), " fil
1b310 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69  ename options-li
1b320 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  st", 0);.    ret
1b330 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b340 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   }..  zFilename 
1b350 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47  = objc>1 ? Tcl_G
1b360 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b370 29 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ) : 0;.  sqlite3
1b380 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c  _open(zFilename,
1b390 20 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20   &db);.  .  if( 
1b3a0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1b3b0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1b3c0 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
1b3d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b3e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b3f0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1b400 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1b410 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b420 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
1b430 65 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46  en_v2 FILENAME F
1b440 4c 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74  LAGS VFS.*/.stat
1b450 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e  ic int test_open
1b460 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
1b470 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b480 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b490 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b4a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b4b0 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
1b4c0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
1b4d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
1b4e0 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  fs;.  int flags 
1b4f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
1b500 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
1b510 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
1b520 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20  .  int nFlag;.  
1b530 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67  Tcl_Obj **apFlag
1b540 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1b550 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
1b560 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1b570 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1b580 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41  v, "FILENAME FLA
1b590 47 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65  GS VFS");.    re
1b5a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b5b0 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20    }.  zFilename 
1b5c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1b5d0 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73  objv[1]);.  zVfs
1b5e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1b5f0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
1b600 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29   zVfs[0]==0x00 )
1b610 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63   zVfs = 0;..  rc
1b620 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65   = Tcl_ListObjGe
1b630 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
1b640 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61  , objv[2], &nFla
1b650 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69  g, &apFlag);.  i
1b660 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
1b670 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72  return rc;.  for
1b680 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69  (i=0; i<nFlag; i
1b690 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c  ++){.    int iFl
1b6a0 61 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f  ag;.    struct O
1b6b0 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20  penFlag {.      
1b6c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61  const char *zFla
1b6d0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61  g;.      int fla
1b6e0 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d  g;.    } aFlag[]
1b6f0 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51   = {.      { "SQ
1b700 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1b710 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY", SQLITE_OPEN
1b720 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20  _READONLY },.   
1b730 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b740 4e 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51  N_READWRITE", SQ
1b750 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b760 49 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ITE },.      { "
1b770 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1b780 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1b790 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
1b7a0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b7b0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20  DELETEONCLOSE", 
1b7c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1b7d0 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20  TEONCLOSE },.   
1b7e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b7f0 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51  N_EXCLUSIVE", SQ
1b800 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1b810 49 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  IVE },.      { "
1b820 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
1b830 50 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f  PROXY", SQLITE_O
1b840 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c  PEN_AUTOPROXY },
1b850 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b860 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20  _OPEN_MAIN_DB", 
1b870 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1b880 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  _DB },.      { "
1b890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1b8a0 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1b8b0 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20  N_TEMP_DB },.   
1b8c0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b8d0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c  N_TRANSIENT_DB",
1b8e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
1b8f0 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20  NSIENT_DB },.   
1b900 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b910 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c  N_MAIN_JOURNAL",
1b920 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
1b930 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  N_JOURNAL },.   
1b940 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b950 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c  N_TEMP_JOURNAL",
1b960 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1b970 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  P_JOURNAL },.   
1b980 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b990 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53  N_SUBJOURNAL", S
1b9a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1b9b0 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  URNAL },.      {
1b9c0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   "SQLITE_OPEN_MA
1b9d0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53  STER_JOURNAL", S
1b9e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1b9f0 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  R_JOURNAL },.   
1ba00 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ba10 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49  N_NOMUTEX", SQLI
1ba20 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
1ba30 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ba40 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
1ba50 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  X", SQLITE_OPEN_
1ba60 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20  FULLMUTEX },.   
1ba70 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ba80 4e 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20  N_SHAREDCACHE", 
1ba90 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
1baa0 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
1bab0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1bac0 50 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53  PRIVATECACHE", S
1bad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
1bae0 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  TECACHE },.     
1baf0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1bb00 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL", SQLITE_OPE
1bb10 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  N_WAL },.      {
1bb20 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52   "SQLITE_OPEN_UR
1bb30 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  I", SQLITE_OPEN_
1bb40 55 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30  URI },.      { 0
1bb50 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20  , 0 }.    };.   
1bb60 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
1bb70 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
1bb80 69 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69  interp, apFlag[i
1bb90 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66  ], aFlag, sizeof
1bba0 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20  (aFlag[0]), .   
1bbb0 20 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20       "flag", 0, 
1bbc0 26 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20  &iFlag.    );.  
1bbd0 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
1bbe0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1bbf0 20 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67    flags |= aFlag
1bc00 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20  [iFlag].flag;.  
1bc10 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1bc20 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e  3_open_v2(zFilen
1bc30 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c  ame, &db, flags,
1bc40 20 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71   zVfs);.  if( sq
1bc50 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1bc60 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1bc70 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1bc80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bc90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bca0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1bcb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bcc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bcd0 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1bce0 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69  16 filename opti
1bcf0 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ons.*/.static in
1bd00 74 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20  t test_open16(. 
1bd10 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1bd20 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1bd30 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1bd40 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1bd50 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1bd60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1bd70 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e  OMIT_UTF16.  con
1bd80 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
1bd90 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1bda0 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1bdb0 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1bdc0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1bdd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1bde0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1bdf0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1be00 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1be10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1be20 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1be30 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1be40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1be50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1be60 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1be70 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
1be80 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1be90 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a  sqlite3_open16(z
1bea0 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
1beb0 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
1bec0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1bed0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1bee0 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
1bef0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
1bf00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1bf10 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1bf20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1bf30 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1bf40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1bf50 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1bf60 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
1bf70 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e   <UTF-16 string>
1bf80 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
1bf90 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  if the supplied 
1bfa0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f  argument is a co
1bfb0 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
1bfc0 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ment, or zero.**
1bfd0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1bfe0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1bff0 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69  omplete16(.  voi
1c000 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c010 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c020 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c030 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c040 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1c050 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1c060 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20  _OMIT_COMPLETE) 
1c070 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
1c080 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20  TE_OMIT_UTF16). 
1c090 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20   char *zBuf;..  
1c0a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c0b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1c0c0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1c0d0 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71  bjv, "<utf-16 sq
1c0e0 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  l>");.    return
1c0f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c100 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a  .  zBuf = (char*
1c110 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
1c120 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
1c130 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  , 0);.  Tcl_SetO
1c140 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1c150 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1c160 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
1c170 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69  6(zBuf)));.#endi
1c180 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1c190 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c  _COMPLETE && SQL
1c1a0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1c1b0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1c1c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c1d0 65 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20  e: sqlite3_step 
1c1e0 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e  STMT.**.** Advan
1c1f0 63 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ce the statement
1c200 20 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77   to the next row
1c210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c220 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69  test_step(.  voi
1c230 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c240 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c250 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c260 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c270 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c280 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c290 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
1c2a0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c2b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c2c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c2d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c2e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1c2f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1c300 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1c310 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
1c320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c330 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1c340 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c350 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c360 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1c370 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c380 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1c390 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
1c3a0 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51  .  /* if( rc!=SQ
1c3b0 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21  LITE_DONE && rc!
1c3c0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65  =SQLITE_ROW ) re
1c3d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20  turn TCL_ERROR; 
1c3e0 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  */.  Tcl_SetResu
1c3f0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1c400 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1c410 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1c420 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1c430 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28  ic int test_sql(
1c440 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c450 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c460 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c470 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c480 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c490 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1c4a0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1c4b0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1c4c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1c4d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1c4e0 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
1c4f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c500 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1c510 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1c520 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c530 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1c540 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1c550 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1c560 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1c570 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73  char *)sqlite3_s
1c580 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56  ql(pStmt), TCL_V
1c590 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
1c5a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c5b0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1c5c0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  e3_column_count 
1c5d0 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
1c5e0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1c5f0 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
1c600 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
1c610 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
1c620 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c630 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20  column_count(.  
1c640 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c650 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c660 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c670 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1c680 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1c690 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c6a0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1c6b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1c6c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1c6d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1c6e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1c6f0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1c700 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1c710 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1c720 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1c730 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c740 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1c750 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c760 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c770 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1c780 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c790 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1c7a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c7b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1c7c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
1c7d0 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72  nt(pStmt)));.  r
1c7e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c7f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1c800 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
1c810 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
1c820 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
1c830 79 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20  ype of the data 
1c840 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1c850 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1c860 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
1c870 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1c880 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20  _type(.  void * 
1c890 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c8a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c8b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c8c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c8d0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1c8e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1c8f0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
1c900 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   tp;..  if( objc
1c910 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1c920 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c930 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c940 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c950 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c960 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c970 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1c980 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c990 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c9a0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1c9b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c9c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c9d0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1c9e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c9f0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1ca00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1ca10 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1ca20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ca30 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c  ROR;..  tp = sql
1ca40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1ca50 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
1ca60 73 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20  switch( tp ){.  
1ca70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
1ca80 54 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63  TEGER: .      Tc
1ca90 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1caa0 72 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54  rp, "INTEGER", T
1cab0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1cac0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1cad0 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a  se SQLITE_NULL:.
1cae0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1caf0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c  ult(interp, "NUL
1cb00 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  L", TCL_STATIC);
1cb10 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1cb20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1cb30 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  LOAT:.      Tcl_
1cb40 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1cb50 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53  , "FLOAT", TCL_S
1cb60 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1cb70 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1cb80 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20  QLITE_TEXT:.    
1cb90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1cba0 69 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20  interp, "TEXT", 
1cbb0 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1cbc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1cbd0 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
1cbe0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1cbf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c  sult(interp, "BL
1cc00 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  OB", TCL_STATIC)
1cc10 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1cc20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1cc30 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
1cc40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
1cc50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1cc60 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1cc70 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f  mn_int64 STMT co
1cc80 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1cc90 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
1cca0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
1ccb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1ccc0 20 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77   cast as an.** w
1ccd0 69 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74  ide (64-bit) int
1cce0 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
1ccf0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1cd00 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
1cd10 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cd20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cd30 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cd40 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1cd50 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1cd60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1cd70 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34    int col;.  i64
1cd80 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   iVal;..  if( ob
1cd90 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1cda0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1cdb0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1cdc0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1cdd0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1cde0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1cdf0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1ce00 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1ce10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ce20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1ce30 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1ce40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ce50 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1ce60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ce70 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1ce80 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1ce90 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1cea0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1ceb0 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d  ERROR;..  iVal =
1cec0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ced0 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c  int64(pStmt, col
1cee0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1cef0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1cf00 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
1cf10 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  iVal));.  return
1cf20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cf30 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1cf40 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d  _column_blob STM
1cf50 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74  T column.*/.stat
1cf60 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1cf70 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  mn_blob(.  void 
1cf80 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1cf90 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1cfa0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1cfb0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1cfc0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1cfd0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1cfe0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20  ;.  int col;..  
1cff0 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74  int len;.  const
1d000 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20   void *pBlob;.. 
1d010 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1d020 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d030 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d040 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d050 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d060 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d070 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d080 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d090 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d0a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d0b0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d0c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d0d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d0e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d0f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d100 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d110 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d120 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1d130 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d140 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63   len = sqlite3_c
1d150 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1d160 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62  t, col);.  pBlob
1d170 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1d180 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f  n_blob(pStmt, co
1d190 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
1d1a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d1b0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1d1c0 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b  bj(pBlob, len));
1d1d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d1e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1d1f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d200 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c  _double STMT col
1d210 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1d220 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1d230 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1d240 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1d250 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65  cast as a double
1d260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d270 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
1d280 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  le(.  void * cli
1d290 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1d2a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1d2b0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1d2c0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1d2d0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1d2e0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1d2f0 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65  nt col;.  double
1d300 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62   rVal;..  if( ob
1d310 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d320 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d330 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d340 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d350 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d360 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d370 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d380 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d3a0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d3b0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d3c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d3d0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d3e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d3f0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1d400 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1d410 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1d420 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1d430 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d  ERROR;..  rVal =
1d440 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d450 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f  double(pStmt, co
1d460 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
1d470 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d480 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
1d490 72 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rVal));.  return
1d4a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d4b0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d4c0 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54  _data_count STMT
1d4d0 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74   .**.** Return t
1d4e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
1d4f0 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79  umns returned by
1d500 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65   the sql stateme
1d510 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74  nt STMT..*/.stat
1d520 69 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61  ic int test_data
1d530 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a  _count(.  void *
1d540 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d550 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d560 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d570 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d580 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d590 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d5a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1d5b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1d5c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1d5d0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1d5e0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1d5f0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1d600 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1d610 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1d620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d630 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1d640 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1d650 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1d660 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1d670 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1d680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d690 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1d6a0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d6b0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1d6c0 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74  data_count(pStmt
1d6d0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
1d6e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d6f0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1d700 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
1d710 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1d720 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d730 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
1d740 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1d750 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d760 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
1d770 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
1d780 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  t test_stmt_utf8
1d790 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d7a0 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
1d7b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
1d7c0 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
1d7d0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
1d7e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d7f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d800 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d810 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1d820 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1d830 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1d840 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
1d850 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
1d860 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e  mt*, int);.  con
1d870 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
1d880 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
1d890 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74   char *(*)(sqlit
1d8a0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
1d8b0 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1d8c0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1d8d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d8e0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1d8f0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1d900 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1d910 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d920 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1d930 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1d940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d950 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1d960 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1d970 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1d980 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1d990 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1d9a0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1d9b0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1d9c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1d9d0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1d9e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
1d9f0 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
1da00 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
1da10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
1da20 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1da30 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
1da40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
1da50 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
1da60 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72  nt test_global_r
1da70 65 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a  ecover(.  void *
1da80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1da90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1daa0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1dab0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1dac0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1dad0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
1dae0 50 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72  PRECATED.  int r
1daf0 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  c;.  if( objc!=1
1db00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1db10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1db20 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
1db30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1db40 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
1db50 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
1db60 65 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f  ecover();.  Tcl_
1db70 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1db80 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1db90 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
1dba0 54 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20  TATIC);.#endif. 
1dbb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1dbc0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1dbd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1dbe0 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ext STMT column.
1dbf0 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1dc00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
1dc10 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
1dc20 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1dc30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
1dc40 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f  e STMT column.*/
1dc50 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1dc60 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76  _stmt_utf16(.  v
1dc70 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1dc80 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ,     /* Pointer
1dc90 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66   to SQLite API f
1dca0 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e  unction to be in
1dcb0 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  voked */.  Tcl_I
1dcc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1dcd0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1dce0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1dcf0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1dd00 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1dd10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1dd20 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1dd30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
1dd40 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  t;.  const void 
1dd50 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73  *zName16;.  cons
1dd60 74 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29  t void *(*xFunc)
1dd70 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1dd80 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
1dd90 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a   (const void *(*
1dda0 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1ddb0 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61   int))clientData
1ddc0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
1ddd0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1dde0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ddf0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1de00 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1de10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1de20 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1de30 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1de40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1de50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1de60 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1de70 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1de80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1de90 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1dea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1deb0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1dec0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1ded0 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1dee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1def0 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46  ..  zName16 = xF
1df00 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  unc(pStmt, col);
1df10 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29  .  if( zName16 )
1df20 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
1df30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1df40 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f   zName16;.    fo
1df50 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a  r(n=0; z[n] || z
1df60 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20  [n+1]; n+=2){}. 
1df70 20 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65     pRet = Tcl_Ne
1df80 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e  wByteArrayObj(zN
1df90 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20  ame16, n+2);.   
1dfa0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1dfb0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
1dfc0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
1dfd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1dfe0 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   */..  return TC
1dff0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e000 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1e010 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f  lumn_int STMT co
1e020 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1e030 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e040 5f 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75  _bytes STMT colu
1e050 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1e060 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1e070 79 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75  ytes16 STMT colu
1e080 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  mn.**.*/.static 
1e090 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  int test_stmt_in
1e0a0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1e0b0 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f  ntData,    /* Po
1e0c0 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
1e0d0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
1e0e0 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
1e0f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e100 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1e110 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1e120 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1e130 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1e140 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69  ;.  int col;.  i
1e150 6e 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  nt (*xFunc)(sqli
1e160 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
1e170 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74  ..  xFunc = (int
1e180 20 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d   (*)(sqlite3_stm
1e190 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
1e1a0 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
1e1b0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1e1c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1e1d0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1e1e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1e1f0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1e200 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1e210 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1e220 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e230 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1e240 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1e250 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1e260 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e270 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1e280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e290 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1e2a0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1e2b0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1e2c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e2d0 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1e2e0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1e2f0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46  Tcl_NewIntObj(xF
1e300 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29  unc(pStmt, col))
1e310 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e320 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e330 67 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f  ge:  sqlite_set_
1e340 6d 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43  magic  DB  MAGIC
1e350 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65  -NUMBER.**.** Se
1e360 74 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20  t the db->magic 
1e370 76 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20  value.  This is 
1e380 75 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72  used to test err
1e390 6f 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69  or recovery logi
1e3a0 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
1e3b0 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69   sqlite_set_magi
1e3c0 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  c(.  void * clie
1e3d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e3e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e3f0 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1e400 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1e410 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1e420 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1e430 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e440 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e450 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e460 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1e470 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47          " DB MAG
1e480 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  IC", 0);.    ret
1e490 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e4a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1e4b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1e4c0 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1e4d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e4e0 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1e4f0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1e500 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b  GIC_OPEN")==0 ){
1e510 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e520 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50   SQLITE_MAGIC_OP
1e530 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  EN;.  }else if( 
1e540 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
1e550 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c  "SQLITE_MAGIC_CL
1e560 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20  OSED")==0 ){.   
1e570 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1e580 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44  ITE_MAGIC_CLOSED
1e590 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1e5a0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1e5b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
1e5c0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
1e5d0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
1e5e0 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65  MAGIC_BUSY;.  }e
1e5f0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
1e600 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
1e610 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30  MAGIC_ERROR")==0
1e620 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1e630 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1e640 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20  _ERROR;.  }else 
1e650 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
1e660 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
1e670 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63  (int*)&db->magic
1e680 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1e690 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e6a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e6b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e6c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
1e6d0 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72  pt  DB .**.** Tr
1e6e0 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75  igger an interru
1e6f0 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74  pt on DB.*/.stat
1e700 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65  ic int test_inte
1e710 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20  rrupt(.  void * 
1e720 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e730 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e740 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1e750 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1e760 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e770 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
1e780 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e790 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e7a0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e7b0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1e7c0 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ], " DB", 0);.  
1e7d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e7e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e7f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e800 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1e810 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e820 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ROR;.  sqlite3_i
1e830 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20  nterrupt(db);.  
1e840 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e850 0a 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c  ..static u8 *sql
1e860 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1e870 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ine = 0;../*.** 
1e880 46 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77  Fill the stack w
1e890 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70  ith a known bitp
1e8a0 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69  attern..*/.stati
1e8b0 63 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b  c void prepStack
1e8c0 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b  (void){.  int i;
1e8d0 0a 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35  .  u32 bigBuf[65
1e8e0 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  536];.  for(i=0;
1e8f0 20 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66   i<sizeof(bigBuf
1e900 29 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b  )/sizeof(bigBuf[
1e910 30 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66  0]); i++) bigBuf
1e920 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66  [i] = 0xdeadbeef
1e930 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63  ;.  sqlite3_stac
1e940 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38  k_baseline = (u8
1e950 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d  *)&bigBuf[65536]
1e960 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74  ;.}../*.** Get t
1e970 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b  he current stack
1e980 20 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f   depth.  Used fo
1e990 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  r debugging only
1e9a0 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
1e9b0 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29  StackDepth(void)
1e9c0 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75  {.  u8 x;.  retu
1e9d0 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33  rn (u64)(sqlite3
1e9e0 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20  _stack_baseline 
1e9f0 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  - &x);.}../*.** 
1ea00 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1ea10 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51  stack_used DB SQ
1ea20 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d  L.**.** Try to m
1ea30 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e  easure the amoun
1ea40 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65  t of stack space
1ea50 20 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20   used by a call 
1ea60 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a  to sqlite3_exec.
1ea70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1ea80 73 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20  st_stack_used(. 
1ea90 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1eaa0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1eab0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1eac0 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1ead0 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  rgv.){.  sqlite3
1eae0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   *db;.  int i;. 
1eaf0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1eb00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1eb10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1eb20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1eb30 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1eb40 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1eb50 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20  B SQL", 0);.    
1eb60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1eb70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1eb80 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1eb90 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1eba0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ebb0 52 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29  R;.  prepStack()
1ebc0 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
1ebd0 33 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b  3_exec(db, argv[
1ebe0 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  2], 0, 0, 0);.  
1ebf0 66 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d  for(i=65535; i>=
1ec00 30 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69  0 && ((u32*)sqli
1ec10 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1ec20 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62  ne)[-i]==0xdeadb
1ec30 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63  eef; i--){}.  Tc
1ec40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1ec50 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1ec60 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65  tObj(i*4));.  re
1ec70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ec80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1ec90 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
1eca0 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d  ion DB function-
1ecb0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74  name.**.** Delet
1ecc0 65 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  e the user funct
1ecd0 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61  ion 'function-na
1ece0 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1ecf0 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a  e handle DB. It.
1ed00 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  ** is assumed th
1ed10 61 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  at the user func
1ed20 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64  tion was created
1ed30 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75   as UTF8, any nu
1ed40 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d  mber of.** argum
1ed50 65 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68  ents (the way th
1ed60 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20  e TCL interface 
1ed70 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61  does it)..*/.sta
1ed80 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66  tic int delete_f
1ed90 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
1eda0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1edb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1edc0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1edd0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1ede0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1edf0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
1ee00 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
1ee10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ee20 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1ee30 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1ee40 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
1ee50 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e          " DB fun
1ee60 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b  ction-name", 0);
1ee70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ee80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1ee90 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1eea0 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1eeb0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1eec0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1eed0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1eee0 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  nction(db, argv[
1eef0 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  2], -1, SQLITE_U
1ef00 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  TF8, 0, 0, 0, 0)
1ef10 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1ef20 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1ef30 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1ef40 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1ef50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ef60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ef70 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63   sqlite_delete_c
1ef80 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c  ollation DB coll
1ef90 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ation-name.**.**
1efa0 20 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c   Delete the coll
1efb0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27  ation sequence '
1efc0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20  collation-name' 
1efd0 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61  from database ha
1efe0 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20  ndle .** DB. It 
1eff0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
1f000 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1f010 71 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74  quence was creat
1f020 65 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20  ed as UTF8 (the 
1f030 0a 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20  .** way the TCL 
1f040 69 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69  interface does i
1f050 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  t)..*/.static in
1f060 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69  t delete_collati
1f070 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
1f080 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1f090 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1f0a0 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
1f0b0 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
1f0c0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20  t rc;.  sqlite3 
1f0d0 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1f0e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1f0f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f100 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1f110 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1f120 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1f130 20 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e     " DB function
1f140 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20  -name", 0);.    
1f150 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f160 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f170 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f180 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f1a0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f1b0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
1f1c0 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20  on(db, argv[2], 
1f1d0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
1f1e0 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  0);.  Tcl_SetRes
1f1f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1f200 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1f210 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
1f220 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f240 65 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  e: sqlite3_get_a
1f250 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a  utocommit DB.**.
1f260 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1f270 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44  f the database D
1f280 42 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69  B is currently i
1f290 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f  n auto-commit mo
1f2a0 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  de..** Return fa
1f2b0 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  lse if not..*/.s
1f2c0 74 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75  tatic int get_au
1f2d0 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64  tocommit(.  void
1f2e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f2f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f300 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1f310 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1f320 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  {.  char zBuf[30
1f330 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ];.  sqlite3 *db
1f340 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1f350 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f360 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f370 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1f380 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1f390 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1f3a0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f3b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f3c0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f3d0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f3e0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f3f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f400 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1f410 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1f420 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 73  ), zBuf, "%d", s
1f430 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
1f440 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63  ommit(db));.  Tc
1f450 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f460 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1f470 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1f490 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  : sqlite3_busy_t
1f4a0 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a  imeout DB MS.**.
1f4b0 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
1f4c0 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69  timeout.  This i
1f4d0 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f  s more easily do
1f4e0 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d  ne using the tim
1f4f0 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f  eout.** method o
1f500 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  f the TCL interf
1f510 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ace.  But we nee
1f520 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74 20  d a way to test 
1f530 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72  the case.** wher
1f540 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  e it returns SQL
1f550 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73  ITE_MISUSE..*/.s
1f560 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
1f570 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76  usy_timeout(.  v
1f580 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1f590 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1f5a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1f5b0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1f5c0 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d  v.){.  int rc, m
1f5d0 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s;.  sqlite3 *db
1f5e0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1f5f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1f600 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1f610 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1f620 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1f630 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1f640 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1f650 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f660 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f670 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f680 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f6a0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1f6b0 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1f6c0 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
1f6d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1f6e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79  c = sqlite3_busy
1f6f0 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29  _timeout(db, ms)
1f700 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1f710 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
1f720 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
1f730 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1f740 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f750 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61  sage:  tcl_varia
1f760 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c  ble_type VARIABL
1f770 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ENAME.**.** Retu
1f780 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
1f790 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
1f7a0 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
1f7b0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  he.** value of t
1f7c0 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c  he given variabl
1f7d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f7e0 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79   tcl_variable_ty
1f7f0 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  pe(.  void * cli
1f800 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1f810 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1f820 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1f830 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1f840 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  [].){.  Tcl_Obj 
1f850 2a 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a  *pVar;.  if( obj
1f860 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1f870 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1f880 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56  erp, 1, objv, "V
1f890 41 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72  ARIABLE");.    r
1f8a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f8b0 0a 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63  .  }.  pVar = Tc
1f8c0 6c 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65  l_GetVar2Ex(inte
1f8d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1f8e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54  g(objv[1]), 0, T
1f8f0 43 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47  CL_LEAVE_ERR_MSG
1f900 29 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30  );.  if( pVar==0
1f910 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f920 52 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d  ROR;.  if( pVar-
1f930 3e 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20  >typePtr ){.    
1f940 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1f950 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1f960 53 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e  StringObj(pVar->
1f970 74 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d  typePtr->name, -
1f980 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  1));.  }.  retur
1f990 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f9a0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1f9b0 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
1f9c0 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65  y ?N?.**.** Atte
1f9d0 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  mpt to release m
1f9e0 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20  emory currently 
1f9f0 68 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74  held but not act
1fa00 75 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a  ually required..
1fa10 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e  ** The integer N
1fa20 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1fa30 66 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74  f bytes we are t
1fa40 72 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65  rying to release
1fa50 2e 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72  .  The .** retur
1fa60 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61  n value is the a
1fa70 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20  mount of memory 
1fa80 61 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  actually release
1fa90 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1faa0 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
1fab0 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  mory(.  void * c
1fac0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1fad0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fae0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1faf0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fb00 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69  jv[].){.#if defi
1fb10 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
1fb20 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
1fb30 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  ENT) && !defined
1fb40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
1fb50 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20  KIO).  int N;.  
1fb60 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f  int amt;.  if( o
1fb70 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1fb80 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1fb90 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1fba0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1fbb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fbc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fbd0 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
1fbe0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1fbf0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1fc00 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72  objv[1], &N) ) r
1fc10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fc20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20  .  }else{.    N 
1fc30 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  = -1;.  }.  amt 
1fc40 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73  = sqlite3_releas
1fc50 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54  e_memory(N);.  T
1fc60 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1fc70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1fc80 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e  ntObj(amt));.#en
1fc90 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
1fca0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
1fcb0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
1fcc0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
1fcd0 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70   DB.**.** Attemp
1fce0 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
1fcf0 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
1fd00 6c 64 20 62 79 20 64 61 74 61 62 61 73 65 20 44  ld by database D
1fd10 42 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a  B.  Return the.*
1fd20 2a 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77  * result code (w
1fd30 68 69 63 68 20 69 6e 20 74 68 65 20 63 75 72 72  hich in the curr
1fd40 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
1fd50 6f 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72  on is always zer
1fd60 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  o)..*/.static in
1fd70 74 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73  t test_db_releas
1fd80 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
1fd90 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1fda0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1fdb0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1fdc0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1fdd0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1fde0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1fdf0 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
1fe00 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1fe10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1fe20 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
1fe30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1fe40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1fe50 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1fe60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1fe70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1fe80 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1fe90 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1fea0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
1feb0 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20  se_memory(db);. 
1fec0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1fed0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1fee0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
1fef0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ff00 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1ff10 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
1ff20 66 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20 41  flush DB.**.** A
1ff30 74 74 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20  ttempt to flush 
1ff40 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20  any dirty pages 
1ff50 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
1ff60 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 63  ic int test_db_c
1ff70 61 63 68 65 66 6c 75 73 68 28 0a 20 20 76 6f 69  acheflush(.  voi
1ff80 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1ff90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1ffa0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1ffb0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1ffc0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1ffd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1ffe0 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
1fff0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
20000 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
20010 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
20020 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
20030 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20040 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20050 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20060 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20070 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
20090 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68   sqlite3_db_cach
200a0 65 66 6c 75 73 68 28 64 62 29 3b 0a 20 20 69 66  eflush(db);.  if
200b0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
200c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
200d0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
200e0 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
200f0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
20100 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20110 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74    }..  Tcl_Reset
20120 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
20130 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20150 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c    sqlite3_db_fil
20160 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a  ename DB DBNAME.
20170 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
20180 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20   name of a file 
20190 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
201a0 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  a database..*/.s
201b0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
201c0 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f  b_filename(.  vo
201d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
201e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
201f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
20200 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
20210 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
20220 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
20230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
20240 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  me;.  if( objc!=
20250 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
20260 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
20270 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
20280 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
20290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
202a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
202b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
202c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
202d0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
202e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
202f0 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
20300 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
20310 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
20320 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
20330 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
20340 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20  e(db, zDbName), 
20350 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74  (void*)0);.  ret
20360 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20370 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
20380 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
20390 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
203a0 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69   Return 1 or 0 i
203b0 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64  f DBNAME is read
203c0 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65  only or not.  Re
203d0 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d  turn -1 if DBNAM
203e0 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  E does.** not ex
203f0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
20400 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f  nt test_db_reado
20410 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nly(.  void * cl
20420 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
20430 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
20440 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20450 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20460 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
20470 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
20480 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
20490 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
204a0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
204b0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
204c0 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
204d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
204e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
204f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20500 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20510 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20520 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20530 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
20540 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
20550 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
20560 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
20570 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
20580 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f  tObj(sqlite3_db_
20590 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62  readonly(db, zDb
205a0 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72  Name)));.  retur
205b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
205c0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
205d0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
205e0 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65  it ?N?.**.** Que
205f0 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f  ry or set the so
20600 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f  ft heap limit fo
20610 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
20620 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69  read.  The.** li
20630 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  mit is only chan
20640 67 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20  ged if the N is 
20650 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72  present.  The pr
20660 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20  evious limit.** 
20670 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
20680 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20690 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28  soft_heap_limit(
206a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
206b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
206c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
206d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
206e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
206f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
20700 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69  64 amt;.  Tcl_Wi
20710 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20  deInt N = -1;.  
20720 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
20730 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
20740 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
20750 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
20760 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
20770 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20780 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
20790 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
207a0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
207b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
207c0 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54  , &N) ) return T
207d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
207e0 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f  amt = sqlite3_so
207f0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28  ft_heap_limit64(
20800 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  N);.  Tcl_SetObj
20810 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
20820 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
20830 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (amt));.  return
20840 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20850 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
20860 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
20870 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  p.**.** Call the
20880 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
20890 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a  cleanup API..*/.
208a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
208b0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a  thread_cleanup(.
208c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
208d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
208e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
208f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20900 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20910 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20920 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
20930 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  .  sqlite3_threa
20940 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e  d_cleanup();.#en
20950 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
20960 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20970 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70  age:   sqlite3_p
20980 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20  ager_refcounts  
20990 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
209a0 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72  a list of number
209b0 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
209c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f  PagerRefcount fo
209d0 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20  r all.** pagers 
209e0 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65  on each database
209f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
20a00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
20a10 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
20a20 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20a30 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20a40 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20a50 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20a60 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20a70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20a80 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
20a90 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
20aa0 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
20ab0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
20ac0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20ad0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20ae0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
20af0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
20b00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
20b10 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
20b20 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
20b30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20b40 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
20b50 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
20b60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
20b70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
20b80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20b90 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
20ba0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
20bb0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
20bc0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
20bd0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
20be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
20bf0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
20c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20c10 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
20c20 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
20c30 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
20c40 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
20c50 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
20c60 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
20c70 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
20c80 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
20c90 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20ca0 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
20cb0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
20cc0 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
20cd0 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
20ce0 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
20cf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
20d00 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
20d10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
20d20 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
20d30 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
20d40 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
20d50 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
20d60 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
20d70 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
20d80 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
20d90 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
20da0 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
20db0 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
20dc0 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
20dd0 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
20de0 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
20df0 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
20e00 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
20e10 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
20e20 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
20e30 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
20e40 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
20e50 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
20e60 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
20e70 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
20e80 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
20e90 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
20ea0 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
20eb0 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
20ec0 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
20ed0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
20ee0 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
20ef0 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
20f00 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
20f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20f20 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74  orking_64bit_int
20f30 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
20f40 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
20f50 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
20f60 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
20f70 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
20f80 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
20f90 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
20fa0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
20fb0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
20fc0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fe0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
20ff0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
21000 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
21010 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
21020 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
21030 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b  l_Obj *pTestObj;
21040 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d  .  int working =
21050 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20   0;..  pTestObj 
21060 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  = Tcl_NewWideInt
21070 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34  Obj(1000000*(i64
21080 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20  )1234567890);.  
21090 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70  working = strcmp
210a0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70  (Tcl_GetString(p
210b0 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35  TestObj), "12345
210c0 36 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30  67890000000")==0
210d0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
210e0 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a  ount(pTestObj);.
210f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21100 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21110 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72  ewBooleanObj(wor
21120 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  king));.  return
21130 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
21140 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73  ** tclcmd:   vfs
21150 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a  _unlink_test.**.
21160 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
21170 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20  and unregisters 
21180 74 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20  the primary VFS 
21190 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65  and then registe
211a0 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67  rs.** it back ag
211b0 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73  ain.  This is us
211c0 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61  ed to test the a
211d0 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74  bility to regist
211e0 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e  er a.** VFS when
211f0 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f   none are previo
21200 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c  usly registered,
21210 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79   and the ability
21220 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74   to .** unregist
21230 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69  er the only avai
21240 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b  lable VFS.  Tick
21250 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74  et #2738.*/.stat
21260 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e  ic int vfs_unlin
21270 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  k_test(.  Client
21280 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
21290 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
212a0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
212b0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
212c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
212d0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
212e0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
212f0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
21300 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21310 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21320 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21330 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
21340 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21350 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
21360 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
21370 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
21380 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b  ite3_vfs *pMain;
21390 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
213a0 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c  apVfs[20];.  sql
213b0 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77  ite3_vfs one, tw
213c0 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  o;..  sqlite3_vf
213d0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b  s_unregister(0);
213e0 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72     /* Unregister
213f0 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d   of NULL is harm
21400 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e  less */.  one.zN
21410 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20  ame = "__one";. 
21420 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   two.zName = "__
21430 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  two";..  /* Call
21440 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ing sqlite3_vfs_
21450 72 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e  register with 2n
21460 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20  d argument of 0 
21470 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68  does not.  ** ch
21480 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74  ange the default
21490 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69   VFS.  */.  pMai
214a0 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  n = sqlite3_vfs_
214b0 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74  find(0);.  sqlit
214c0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
214d0 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65  &one, 0);.  asse
214e0 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
214f0 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
21500 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21510 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
21520 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20  ster(&two, 0);. 
21530 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d   assert( pMain==
21540 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69  0 || pMain==sqli
21550 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21560 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20  );..  /* We can 
21570 66 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74  find a VFS by it
21580 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65  s name */.  asse
21590 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
215a0 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
215b0 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
215c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
215d0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
215e0 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e   );..  /* Callin
215f0 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67  g sqlite_vfs_reg
21600 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a  ister with non-z
21610 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  ero second param
21620 65 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65  eter changes the
21630 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46  .  ** default VF
21640 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31  S, even if the 1
21650 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
21660 61 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74  an existig VFS t
21670 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76  hat is.  ** prev
21680 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
21690 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66  d as the non-def
216a0 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ault..  */.  sql
216b0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
216c0 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73  r(&one, 1);.  as
216d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
216e0 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
216f0 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
21700 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21710 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21720 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  wo );.  assert( 
21730 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21740 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73  (0)==&one );.  s
21750 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21760 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20  ter(&two, 1);.  
21770 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21780 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
21790 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
217a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
217b0 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
217c0 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
217d0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
217e0 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  nd(0)==&two );. 
217f0 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20   if( pMain ){.  
21800 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21810 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29  gister(pMain, 1)
21820 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21830 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21840 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
21850 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
21860 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
21870 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
21880 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
21890 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
218a0 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20  =pMain );.  }.  
218b0 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
218c0 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52   default VFS.  R
218d0 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72  epeat until ther
218e0 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46  e are no more VF
218f0 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65  Ses.  ** registe
21900 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  red..  */.  for(
21910 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70  i=0; i<sizeof(ap
21920 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
21930 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
21940 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69   apVfs[i] = sqli
21950 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
21960 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
21970 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ] ){.      asser
21980 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c  t( apVfs[i]==sql
21990 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
219a0 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
219b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
219c0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61  vfs_unregister(a
219d0 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pVfs[i]);.      
219e0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
219f0 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21a00 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21a10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
21a20 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
21a30 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20  fs_find(0) );.  
21a40 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
21a50 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e  he main VFS as n
21a60 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c  on-default (will
21a70 20 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74   be made default
21a80 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27  , since.  ** it'
21a90 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f  ll be the only o
21aa0 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29  ne in existence)
21ab0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21ac0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d  _vfs_register(pM
21ad0 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  ain, 0);.  asser
21ae0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21af0 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
21b00 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69  .  .  /* Un-regi
21b10 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
21b20 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f  S again to resto
21b30 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20  re an empty VFS 
21b40 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
21b50 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21b60 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72  (pMain);.  asser
21b70 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
21b80 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20  s_find(0) );..  
21b90 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46  /* Relink all VF
21ba0 53 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  Ses in reverse o
21bb0 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72  rder. */  .  for
21bc0 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29  (i=sizeof(apVfs)
21bd0 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
21be0 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  )-1; i>=0; i--){
21bf0 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
21c00 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ] ){.      sqlit
21c10 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21c20 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20  apVfs[i], 1);.  
21c30 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66      assert( apVf
21c40 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66  s[i]==sqlite3_vf
21c50 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20  s_find(0) );.   
21c60 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
21c70 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
21c80 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
21c90 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a  zName) );.    }.
21ca0 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69    }..  /* Unregi
21cb0 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20  ster out sample 
21cc0 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  VFSes. */.  sqli
21cd0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21ce0 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21cf0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21d00 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20  er(&two);..  /* 
21d10 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  Unregistering a 
21d20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20  VFS that is not 
21d30 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74  currently regist
21d40 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73  ered is harmless
21d50 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
21d60 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e  s_unregister(&on
21d70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e);.  sqlite3_vf
21d80 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77  s_unregister(&tw
21d90 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  o);.  assert( sq
21da0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21db0 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20  __one")==0 );.  
21dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21dd0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
21de0 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65  )==0 );..  /* We
21df0 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20   should be left 
21e00 77 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61  with the origina
21e10 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61  l default VFS ba
21e20 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f  ck as the.  ** o
21e30 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73  riginal */.  ass
21e40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21e50 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
21e60 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
21e70 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  _OK;.}../*.** tc
21e80 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74  lcmd:   vfs_init
21e90 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20  fail_test.**.** 
21ea0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21eb0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73   attempts to vfs
21ec0 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65  _find and vfs_re
21ed0 67 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a  gister when the.
21ee0 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  ** sqlite3_initi
21ef0 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63  alize() interfac
21f00 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41  e is failing.  A
21f10 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20  ll calls should 
21f20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fail..*/.static 
21f30 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  int vfs_initfail
21f40 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
21f50 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21f60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21f70 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21f80 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21f90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21fa0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21fb0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21fc0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21fd0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21fe0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21ff0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22000 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
22010 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22020 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
22030 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
22040 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
22050 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20  ne;.  one.zName 
22060 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66  = "__one";..  if
22070 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
22080 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
22090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
220a0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
220b0 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28  (&one, 0);.  if(
220c0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
220d0 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
220e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
220f0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
22100 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  &one, 1);.  if( 
22110 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22120 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
22130 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
22140 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
22150 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f  * Saved VFSes.*/
22160 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
22170 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a  vfs *apVfs[20];.
22180 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20  static int nVfs 
22190 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  = 0;../*.** tclc
221a0 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69  md:   vfs_unregi
221b0 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55  ster_all.**.** U
221c0 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46  nregister all VF
221d0 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
221e0 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  nt vfs_unregiste
221f0 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
22200 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
22210 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22220 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22230 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
22240 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22250 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22260 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22270 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22280 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22290 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
222a0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
222b0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
222c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
222d0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
222e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
222f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
22300 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
22310 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20  (apVfs); i++){. 
22320 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
22330 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
22340 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
22350 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
22360 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
22370 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
22380 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73  [i]);.  }.  nVfs
22390 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54   = i;.  return T
223a0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
223b0 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72  clcmd:   vfs_rer
223c0 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a  egister_all.**.*
223d0 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46  * Restore all VF
223e0 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65  Ses that were re
223f0 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f  moved using vfs_
22400 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
22410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
22420 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28  _reregister_all(
22430 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22440 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22450 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22460 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22470 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
22480 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22490 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
224a0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
224b0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
224c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
224e0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
224f0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
22500 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
22510 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
22520 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
22530 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
22540 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nVfs; i++){.   
22550 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
22560 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
22570 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
22580 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
22590 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
225a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
225b0 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
225c0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
225d0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
225e0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
225f0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22600 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22610 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
22620 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
22630 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
22640 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
22650 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
22660 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
22670 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
22680 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
22690 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
226a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
226b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
226c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
226d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
226e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
226f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22700 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22710 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22720 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
22730 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
22740 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
22750 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
22760 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
22770 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
22780 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22790 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
227a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
227b0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
227c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
227d0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
227e0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
227f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22800 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22810 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
22820 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22830 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
22840 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
22860 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30  le_control(db, 0
22870 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  , 0, &iArg);.  a
22880 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
22890 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20  E_NOTFOUND );.  
228a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
228b0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e  e_control(db, "n
228c0 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51  otadatabase", SQ
228d0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
228e0 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20  TATE, &iArg);.  
228f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
22900 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63  TE_ERROR );.  rc
22910 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22920 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69  control(db, "mai
22930 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  n", -1, &iArg);.
22940 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
22950 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
22960 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22970 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22980 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41   "temp", -1, &iA
22990 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  rg);.  assert( r
229a0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
229b0 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  ND || rc==SQLITE
229c0 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74  _ERROR );..  ret
229d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
229e0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
229f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
22a00 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a  terrno_test DB.*
22a10 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
22a20 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
22a30 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
22a40 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
22a50 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
22a60 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
22a70 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41  of the SQLITE_LA
22a80 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a  ST_ERRNO verb..*
22a90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
22aa0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
22ab0 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
22ac0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22ad0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22ae0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22af0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22b00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22b10 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22b20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
22b30 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
22b40 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
22b50 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
22b60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22b70 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
22b80 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
22b90 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
22ba0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
22bb0 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
22bc0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22bd0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22be0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22bf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22c00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22c10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22c20 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
22c30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
22c40 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
22c50 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
22c60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22c70 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22c80 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22c90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22ca0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
22cb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22ce0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
22cf0 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
22d00 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
22d10 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
22d20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
22d30 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
22d40 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
22d50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22d60 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
22d70 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
22d80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22d90 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
22da0 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
22db0 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22dd0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22de0 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
22df0 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
22e00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
22e20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
22e30 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
22e40 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
22e50 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44  chunksize_test D
22e60 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
22e70 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
22e80 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
22e90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22ea0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
22eb0 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
22ec0 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
22ed0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
22ee0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
22ef0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
22f00 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
22f10 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
22f20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
22f30 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28  _chunksize_test(
22f40 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
22f50 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
22f60 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
22f70 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
22f80 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
22f90 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
22fa0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
22fb0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
22fc0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
22fd0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
22fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ff0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
23000 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
23010 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
23020 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
23030 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
23040 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23060 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a  New chunk size *
23070 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23090 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
230a0 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
230b0 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
230c0 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
230d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
230e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
230f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
23100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23110 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
23120 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
23130 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
23140 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
23150 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
23160 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
23170 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
23180 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23190 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
231a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
231b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
231c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
231d0 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
231e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
231f0 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65   objv[3], &nSize
23200 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  ).  ){.   return
23210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23220 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
23230 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
23240 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c    if( zDb[0]=='\
23250 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b  0' ) zDb = NULL;
23260 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
23270 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
23280 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43  , zDb, SQLITE_FC
23290 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20  NTL_CHUNK_SIZE, 
232a0 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
232b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
232c0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
232d0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
232e0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
232f0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
23300 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23310 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
23320 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
23330 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
23340 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
23350 69 6e 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41  int_test DB DBNA
23360 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68  ME SIZE.**.** Th
23370 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
23380 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
23390 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
233a0 65 72 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20  erface .** with 
233b0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
233c0 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63  E_HINT.*/.static
233d0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
233e0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 28  l_sizehint_test(
233f0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
23400 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
23410 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
23420 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
23430 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
23440 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
23450 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
23460 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
23470 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
23480 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
23490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
234a0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
234b0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
234c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
234d0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
234e0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
234f0 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65 3b 20  _WideInt nSize; 
23500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23510 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f 0a 20  Hinted size */. 
23520 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
23530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23540 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61   /* Db name ("ma
23550 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e  in", "temp" etc.
23560 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  ) */.  sqlite3 *
23570 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
23580 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
23590 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  se handle */.  i
235a0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
235c0 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  * file_control()
235d0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
235e0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
235f0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
23600 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
23610 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
23620 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72  ME SIZE");.    r
23630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23640 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
23650 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
23660 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
23670 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20  jv[1]), &db) .  
23680 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64 65 49   || Tcl_GetWideI
23690 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
236a0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a  , objv[3], &nSiz
236b0 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75 72  e).  ){.   retur
236c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
236d0 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
236e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
236f0 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27  .  if( zDb[0]=='
23700 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c  \0' ) zDb = NULL
23710 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
23720 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
23730 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46  b, zDb, SQLITE_F
23740 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
23750 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b  (void *)&nSize);
23760 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
23770 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
23780 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
23790 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
237a0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
237b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
237c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
237d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
237e0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
237f0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
23800 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50 57 44  roxy_test DB PWD
23810 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
23820 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
23830 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23840 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
23850 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
23860 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
23870 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
23880 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
23890 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  E and.** SQLITE_
238a0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
238b0 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74  E verbs..*/.stat
238c0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
238d0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
238e0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
238f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
23900 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
23910 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
23920 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
23930 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
23940 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
23950 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
23960 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
23970 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
23980 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
23990 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
239a0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
239b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
239c0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
239d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
239e0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 0a  sqlite3 *db;.  .
239f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
23a00 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
23a10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
23a20 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
23a30 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
23a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
23a60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
23a70 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30 29  ), " DB PWD", 0)
23a80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23a90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
23aa0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
23ab0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
23ac0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
23ad0 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72 6e  db) ){.   return
23ae0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23af0 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
23b00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
23b10 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
23b20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
23b30 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
23b40 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
23b50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
23b60 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
23b70 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
23b80 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23b90 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
23ba0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
23bb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23bc0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
23bd0 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20 20  PPLE__).  {.    
23be0 63 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b 0a  char *testPath;.
23bf0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
23c00 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63 6f  int nPwd;.    co
23c10 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b 0a  nst char *zPwd;.
23c20 20 20 20 20 63 68 61 72 20 70 72 6f 78 79 50 61      char proxyPa
23c30 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20 20  th[400];.    .  
23c40 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65 74    zPwd = Tcl_Get
23c50 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
23c60 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a 20  jv[2], &nPwd);. 
23c70 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70 72     if( sizeof(pr
23c80 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32 30  oxyPath)<nPwd+20
23c90 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
23ca0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
23cb0 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67 22  p, "PWD too big"
23cc0 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 20  , (void*)0);.   
23cd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23ce0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
23cf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23d00 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68  sizeof(proxyPath
23d10 29 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 22 25  ), proxyPath, "%
23d20 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a  s/test.proxy", z
23d30 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Pwd);.    rc = s
23d40 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23d50 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
23d60 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
23d70 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74  XYFILE, proxyPat
23d80 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  h);.    if( rc )
23d90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
23da0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23db0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
23dc0 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75  c)); .      retu
23dd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23de0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
23df0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23e00 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
23e10 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
23e20 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29  FILE, &testPath)
23e30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
23e40 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74  p(proxyPath,test
23e50 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20  Path,11) ){.    
23e60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23e70 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b  lt(interp, "Lock
23e80 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20   proxy file did 
23e90 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a  not match the ".
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
23ec0 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67  previously assig
23ed0 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a  ned value", 0);.
23ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
23ef0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
23f00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
23f10 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
23f20 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
23f30 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
23f40 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
23f50 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
23f60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
23f70 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
23f80 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ULL, SQLITE_SET_
23f90 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70  LOCKPROXYFILE, p
23fa0 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69  roxyPath);.    i
23fb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
23fc0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23fd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23fe0 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20  ntObj(rc));.    
23ff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24000 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
24010 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
24020 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53  L_OK;  .}..#if S
24030 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a  QLITE_OS_WIN./*.
24040 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
24050 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
24060 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45  av_retry DB  NRE
24070 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a  TRY  DELAY.**.**
24080 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24090 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
240a0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
240b0 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
240c0 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
240d0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
240e0 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  Y opcode..*/.sta
240f0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
24100 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
24110 74 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  try(.  ClientDat
24120 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24130 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24140 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24150 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24160 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24170 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24180 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24190 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
241a0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
241b0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
241c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
241d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
241e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
241f0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24200 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24210 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24220 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b  int rc;.  int a[
24230 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  2];.  char z[100
24240 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
24250 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
24260 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24270 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24280 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
24290 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
242a0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
242b0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e  v[0], 0), " DB N
242c0 52 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29  RETRY DELAY", 0)
242d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
242e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
242f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24300 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24310 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24320 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
24330 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24340 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
24350 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
24360 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29   objv[2], &a[0])
24370 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
24380 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
24390 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
243a0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61  erp, objv[3], &a
243b0 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [1]) ) return TC
243c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
243d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
243e0 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
243f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
24400 32 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69  2_AV_RETRY, (voi
24410 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  d*)a);.  sqlite3
24420 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
24430 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25  (z), z, "%d %d %
24440 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b  d", rc, a[0], a[
24450 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
24460 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24470 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
24480 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
24490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
244a0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
244b0 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
244c0 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a  e DB HANDLE.**.*
244d0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
244e0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
244f0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24500 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
24510 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
24520 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41  NTL_WIN32_SET_HA
24530 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  NDLE opcode..*/.
24540 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
24550 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65  control_win32_se
24560 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65  t_handle(.  Clie
24570 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
24580 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
24590 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
245a0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
245b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
245c0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
245d0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
245e0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
245f0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
24600 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
24610 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24620 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
24630 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
24640 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
24650 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
24660 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24670 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48  b;.  int rc;.  H
24680 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55  ANDLE hFile = NU
24690 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  LL;.  char z[100
246a0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
246b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
246c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
246d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
246e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
246f0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
24700 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24710 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48  v[0], 0), " DB H
24720 41 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20  ANDLE", 0);.    
24730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
24750 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
24760 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24770 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
24780 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24790 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
247a0 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28   getWin32Handle(
247b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
247c0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
247d0 26 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &hFile) ){.    r
247e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
247f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
24800 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24810 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24820 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
24830 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20  T_HANDLE,.      
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46        (void*)&hF
24860 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
24870 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
24880 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20  z), z, "%d %p", 
24890 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65  rc, (void*)hFile
248a0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
248b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
248c0 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
248d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
248e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74  .#endif../*.** t
248f0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24900 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
24910 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41  l DB PERSIST-FLA
24920 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
24930 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
24940 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
24950 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
24960 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
24970 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
24980 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f  T_WAL opcode..*/
24990 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
249a0 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
249b0 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _wal(.  ClientDa
249c0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
249d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
249e0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
249f0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
24a00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
24a10 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
24a20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
24a30 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
24a40 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24a50 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24a60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24a70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24a80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24a90 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24aa0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24ab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24ac0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
24ad0 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20  Persist;.  char 
24ae0 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
24af0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
24b00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24b10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24b20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24b30 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
24b40 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
24b50 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
24b60 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20   DB FLAG", 0);. 
24b70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24b80 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
24b90 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
24ba0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
24bb0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
24bc0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
24bd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24be0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
24bf0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
24c00 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74  jv[2], &bPersist
24c10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
24c20 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
24c30 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24c40 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
24c50 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
24c60 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50  _WAL, (void*)&bP
24c70 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  ersist);.  sqlit
24c80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
24c90 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
24ca0 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29  ", rc, bPersist)
24cb0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
24cc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
24cd0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
24ce0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
24cf0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24d00 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f   file_control_po
24d10 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
24d20 65 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a  e DB PSOW-FLAG.*
24d30 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
24d40 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
24d50 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24d60 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69  rol interface wi
24d70 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  th.** the SQLITE
24d80 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
24d90 5f 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64  _OVERWRITE opcod
24da0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24db0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f   file_control_po
24dc0 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
24dd0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
24de0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
24df0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
24e00 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
24e10 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
24e20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
24e30 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
24e40 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
24e50 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
24e60 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
24e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
24e80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
24e90 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
24ea0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
24eb0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
24ec0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
24ed0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
24ee0 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20  t rc;.  int b;. 
24ef0 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20   char z[100];.. 
24f00 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
24f10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24f20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
24f30 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
24f40 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
24f50 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
24f60 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
24f70 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c   0), " DB FLAG",
24f80 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
24f90 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24fa0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
24fb0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
24fc0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
24fd0 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
24fe0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24ff0 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
25000 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
25010 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29  rp, objv[2], &b)
25020 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
25030 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
25040 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25050 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f  (db,NULL,SQLITE_
25060 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
25070 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a  OVERWRITE,(void*
25080 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  )&b);.  sqlite3_
25090 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
250a0 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20  z), z, "%d %d", 
250b0 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70  rc, b);.  Tcl_Ap
250c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
250d0 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
250e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
250f0 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  ;  .}.../*.** tc
25100 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
25110 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20  trol_vfsname DB 
25120 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65  ?AUXDB?.**.** Re
25130 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
25140 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
25150 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e   stack of VFSes.
25160 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
25170 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
25180 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ame(.  ClientDat
25190 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
251a0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
251b0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
251c0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
251d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
251e0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
251f0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25200 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25210 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25220 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25230 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25240 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25250 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25260 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25270 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25280 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
25290 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
252a0 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  ame = "main";.  
252b0 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d  char *zVfsName =
252c0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
252d0 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b  =2 && objc!=3 ){
252e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
252f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
25300 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
25310 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
25320 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
25330 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
25340 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44  , 0), " DB ?AUXD
25350 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  B?", 0);.    ret
25360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25370 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
25380 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
25390 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
253a0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
253b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
253c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
253d0 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62  jc==3 ){.    zDb
253e0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
253f0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
25400 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   }.  sqlite3_fil
25410 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
25420 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43  bName, SQLITE_FC
25430 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69  NTL_VFSNAME,(voi
25440 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  d*)&zVfsName);. 
25450 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25460 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61  t(interp, zVfsNa
25470 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
25480 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56   sqlite3_free(zV
25490 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  fsName);.  retur
254a0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
254b0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
254c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70  ile_control_temp
254d0 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58  filename DB ?AUX
254e0 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  DB?.**.** Return
254f0 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69   a string that i
25500 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
25510 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  lename.*/.static
25520 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
25530 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a  l_tempfilename(.
25540 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25550 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25560 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25570 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25580 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25590 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
255a0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
255b0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
255c0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
255d0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
255e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
255f0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25600 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25610 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25620 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25630 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25640 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
25650 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
25660 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20   "main";.  char 
25670 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  *zTName = 0;..  
25680 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
25690 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
256a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
256b0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
256c0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
256d0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
256e0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
256f0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
25700 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29   DB ?AUXDB?", 0)
25710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
25720 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
25730 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
25740 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
25750 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
25760 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
25770 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25780 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
25790 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20  {.    zDbName = 
257a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
257b0 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  jv[2]);.  }.  sq
257c0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
257d0 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ol(db, zDbName, 
257e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
257f0 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64  PFILENAME, (void
25800 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63  *)&zTName);.  Tc
25810 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
25820 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28  nterp, zTName, (
25830 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69  char*)0);.  sqli
25840 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29  te3_free(zTName)
25850 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25860 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
25870 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
25880 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20  _vfs_list.**.** 
25890 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c    Return a tcl l
258a0 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
258b0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
258c0 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73  registered vfs's
258d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
258e0 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65  vfs_list(.  Clie
258f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25900 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25910 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25920 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25930 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25940 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25950 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25960 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25970 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25980 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25990 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
259a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
259b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
259c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
259d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
259e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
259f0 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f  s *pVfs;.  Tcl_O
25a00 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
25a10 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f  ewObj();.  if( o
25a20 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
25a30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
25a40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
25a50 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
25a60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25a70 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65   for(pVfs=sqlite
25a80 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70  3_vfs_find(0); p
25a90 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e  Vfs; pVfs=pVfs->
25aa0 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f  pNext){.    Tcl_
25ab0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
25ac0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
25ad0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
25ae0 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  Obj(pVfs->zName,
25af0 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c   -1));.  }.  Tcl
25b00 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
25b10 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72  terp, pRet);.  r
25b20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
25b30 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
25b40 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
25b50 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a   DB ID VALUE.**.
25b60 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
25b70 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
25b80 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72  ite3_limit inter
25b90 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
25ba0 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
25bb0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
25bc0 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
25bd0 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20  t test_limit(.  
25be0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25bf0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25c00 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25c10 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25c20 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25c30 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25c40 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25c50 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25c60 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
25c70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
25c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25c90 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25ca0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25cb0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25cc0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25cd0 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
25ce0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
25cf0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
25d00 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
25d10 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
25d20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b  int id;.  } aId[
25d30 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c  ] = {.    { "SQL
25d40 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
25d50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
25d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
25d70 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20  GTH             
25d80 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25d90 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e  TE_LIMIT_SQL_LEN
25da0 47 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  GTH",          S
25db0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
25dc0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
25dd0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25de0 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c  E_LIMIT_COLUMN",
25df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
25e00 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
25e10 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N               
25e20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25e30 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
25e40 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
25e50 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44  ITE_LIMIT_EXPR_D
25e60 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  EPTH           }
25e70 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25e80 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
25e90 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49  ELECT",     SQLI
25ea0 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e  TE_LIMIT_COMPOUN
25eb0 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c  D_SELECT      },
25ec0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25ed0 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20  IMIT_VDBE_OP",  
25ee0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25ef0 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20  E_LIMIT_VDBE_OP 
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
25f10 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25f20 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
25f30 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
25f40 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f  _LIMIT_FUNCTION_
25f50 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ARG         },. 
25f60 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
25f70 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20  IT_ATTACHED",   
25f80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
25f90 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20  LIMIT_ATTACHED  
25fa0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
25fb0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25fc0 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
25fd0 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c  ENGTH", SQLITE_L
25fe0 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52  IMIT_LIKE_PATTER
25ff0 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20  N_LENGTH  },.   
26000 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
26010 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
26020 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ",     SQLITE_LI
26030 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
26040 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  BER      },.    
26050 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
26060 54 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20  TRIGGER_DEPTH", 
26070 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
26080 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
26090 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
260a0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57   "SQLITE_LIMIT_W
260b0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20  ORKER_THREADS", 
260c0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
260d0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
260e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20         },.    . 
260f0 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e     /* Out of ran
26100 67 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f  ge test cases */
26110 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
26120 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20  IMIT_TOOSMALL", 
26130 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20             -1,  
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
26160 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
26170 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20  MIT_TOOBIG",    
26180 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
26190 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
261a0 52 45 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20  READS+1     },. 
261b0 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20   };.  int i, id 
261c0 3d 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a  = 0;.  int val;.
261d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
261e0 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  d;..  if( objc!=
261f0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
26200 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
26210 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
26220 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
26230 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
26240 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
26250 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49  v[0], 0), " DB I
26260 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20  D VALUE", 0);.  
26270 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26280 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
26290 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
262a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
262b0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
262c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
262d0 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f  OR;.  zId = Tcl_
262e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
262f0 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
26300 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  <sizeof(aId)/siz
26310 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b  eof(aId[0]); i++
26320 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
26330 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e  p(zId, aId[i].zN
26340 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
26350 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b   id = aId[i].id;
26360 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
26370 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e    }.  }.  if( i>
26380 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a  =sizeof(aId)/siz
26390 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20  eof(aId[0]) ){. 
263a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
263b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b  ult(interp, "unk
263c0 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a  nown limit type:
263d0 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29   ", zId, (char*)
263e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
263f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26400 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
26410 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
26420 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
26430 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26440 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26450 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61  limit(db, id, va
26460 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
26470 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
26480 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
26490 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
264a0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
264b0 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e  clcmd:  save_prn
264c0 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61  g_state.**.** Sa
264d0 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ve the state of 
264e0 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f  the pseudo-rando
264f0 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
26500 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61  or..** At the sa
26510 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20  me time, verify 
26520 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73  that sqlite3_tes
26530 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20  t_control works 
26540 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c  even when.** cal
26550 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d  led with an out-
26560 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e  of-range opcode.
26570 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
26580 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
26590 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
265a0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
265b0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
265c0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
265d0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
265e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
265f0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26600 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26610 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26620 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26640 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26650 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26660 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26670 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26680 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
26690 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
266a0 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
266b0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
266c0 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
266d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
266e0 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
266f0 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
26700 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
26710 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
26720 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
26730 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
26740 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
26750 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
26760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
26770 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
26780 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26790 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
267a0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
267b0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
267c0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
267d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
267e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
267f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26800 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26810 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26830 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26840 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26850 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26860 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26870 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26880 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
26890 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
268a0 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29  RL_PRNG_RESTORE)
268b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
268c0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  K;.}./*.** tclcm
268d0 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73  d:  reset_prng_s
268e0 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
268f0 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  nt reset_prng_st
26900 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
26910 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26920 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26930 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26940 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26950 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26960 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26970 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26980 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26990 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
269a0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
269b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
269c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
269d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
269e0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
269f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26a00 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
26a10 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
26a20 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
26a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
26a40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
26a50 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d  cmd:  database_m
26a60 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a  ay_be_corrupt.**
26a70 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
26a80 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
26a90 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70   might be corrup
26aa0 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
26ab0 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d  ds, set the norm
26ac0 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f  al.** state of o
26ad0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
26ae0 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65  tic int database
26af0 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28  _may_be_corrupt(
26b00 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26b10 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
26b20 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
26b30 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
26b40 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
26b50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
26b60 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
26b70 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
26b80 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
26b90 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26bb0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
26bc0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
26bd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
26be0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
26bf0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
26c00 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
26c10 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
26c20 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
26c30 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
26c40 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
26c50 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f  lcmd:  database_
26c60 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a  never_corrupt.**
26c70 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
26c80 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
26c90 20 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c   are always well
26ca0 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65  -formed.  This e
26cb0 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61 73 73  nables extra ass
26cc0 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
26cd0 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f  nts that test co
26ce0 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72  nditions that ar
26cf0 65 20 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f  e always true fo
26d00 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  r well-formed da
26d10 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74  tabases..*/.stat
26d20 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f  ic int database_
26d30 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20  never_corrupt(. 
26d40 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26d50 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26d60 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26d70 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26d80 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26d90 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26da0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26db0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26dc0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26dd0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26df0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26e00 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26e10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
26e20 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
26e30 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
26e40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
26e50 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
26e60 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31  NEVER_CORRUPT, 1
26e70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
26e80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
26e90 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61  cmd:  pcache_sta
26ea0 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
26eb0 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
26ec0 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ts(.  ClientData
26ed0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
26ee0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
26ef0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
26f00 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
26f10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26f20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26f30 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26f40 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26f50 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26f60 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26f70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26f80 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26f90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26fa0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26fb0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26fc0 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20  int nMin;.  int 
26fd0 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72  nMax;.  int nCur
26fe0 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rent;.  int nRec
26ff0 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f  yclable;.  Tcl_O
27000 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c  bj *pRet;..  sql
27010 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28  ite3PcacheStats(
27020 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78  &nCurrent, &nMax
27030 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63  , &nMin, &nRecyc
27040 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20  lable);..  pRet 
27050 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
27060 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27070 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27080 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27090 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65  StringObj("curre
270a0 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  nt", -1));.  Tcl
270b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
270c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
270d0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
270e0 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  j(nCurrent));.  
270f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27100 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27110 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
27120 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d  ringObj("max", -
27130 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
27140 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27150 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27160 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78  l_NewIntObj(nMax
27170 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
27180 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27190 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
271a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
271b0 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  in", -1));.  Tcl
271c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
271d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
271e0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
271f0 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f  j(nMin));.  Tcl_
27200 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27210 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27220 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
27230 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22  Obj("recyclable"
27240 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
27250 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27260 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
27270 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
27280 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20  Recyclable));.. 
27290 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
272a0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
272b0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
272c0 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
272d0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
272e0 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
272f0 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  void test_unlock
27300 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20  _notify_cb(void 
27310 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  **aArg, int nArg
27320 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  ){.  int ii;.  f
27330 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67  or(ii=0; ii<nArg
27340 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ; ii++){.    Tcl
27350 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74  _EvalEx((Tcl_Int
27360 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20  erp *)aArg[ii], 
27370 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
27380 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
27390 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  OBAL);.  }.}.#en
273a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
273b0 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
273c0 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  FY */../*.** tcl
273d0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e  cmd:  sqlite3_un
273e0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a  lock_notify db.*
273f0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
27400 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
27410 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20  TIFY.static int 
27420 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
27430 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  fy(.  ClientData
27440 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27450 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
27460 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27470 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27480 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27490 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
274a0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
274b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
274c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
274d0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
274e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
274f0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27500 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27510 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
27520 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
27530 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
27540 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
27550 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
27560 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
27570 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27580 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
27590 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
275a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
275b0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
275c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
275d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
275e0 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
275f0 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f  fy(db, test_unlo
27600 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76  ck_notify_cb, (v
27610 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20  oid *)interp);. 
27620 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
27630 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
27640 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
27650 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
27660 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27670 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
27680 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
27690 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
276a0 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69   ?NAME?.*/.stati
276b0 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63  c int test_wal_c
276c0 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
276d0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
276e0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
276f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27700 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27710 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27720 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27730 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27740 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27750 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27760 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27770 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27780 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27790 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
277a0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
277b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
277c0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
277d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
277e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
277f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
27800 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
27810 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a  , "DB ?NAME?");.
27820 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27830 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
27840 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27850 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27860 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27870 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
27880 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27890 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
278a0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
278b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
278c0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
278d0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
278e0 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
278f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
27900 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
27910 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
27920 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
27930 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27940 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27950 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
27960 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44  kpoint_v2 db MOD
27970 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?NAME?.**.** T
27980 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c  his command call
27990 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70  s the wal_checkp
279a0 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69  oint_v2() functi
279b0 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63  on with the spec
279c0 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72  ified.** mode ar
279d0 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c  gument (passive,
279e0 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74   full or restart
279f0 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  ). If present, t
27a00 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
27a10 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73  .** NAME is pass
27a20 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
27a30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c   argument to wal
27a40 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
27a50 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e  . If it the.** N
27a60 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20  AME argument is 
27a70 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e  not present, a N
27a80 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70  ULL pointer is p
27a90 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  assed instead..*
27aa0 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63  *.** If wal_chec
27ab0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75  kpoint_v2() retu
27ac0 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
27ad0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
27ae0 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  BUSY or.** SQLIT
27af0 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20  E_OK, then this 
27b00 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
27b10 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54  TCL_ERROR. The T
27b20 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  cl result is set
27b30 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72  .** to the error
27b40 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65   message obtaine
27b50 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
27b60 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  rrmsg()..**.** O
27b70 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63  therwise, this c
27b80 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ommand returns a
27b90 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69   list of three i
27ba0 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72  ntegers. The fir
27bb0 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73  st integer.** is
27bc0 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53   1 if SQLITE_BUS
27bd0 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20  Y was returned, 
27be0 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
27bf0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
27c00 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72  o integers.** ar
27c10 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  e the values ret
27c20 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75  urned via the ou
27c30 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20  tput parameters 
27c40 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  by wal_checkpoin
27c50 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20  t_v2() -.** the 
27c60 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
27c70 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20   in the log and 
27c80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
27c90 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a  ames in the log.
27ca0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ** that have bee
27cb0 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  n checkpointed..
27cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
27cd0 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
27ce0 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  t_v2(.  ClientDa
27cf0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27d00 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
27d10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27d20 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27d30 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27d40 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27d50 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27d60 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27d70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27d80 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27d90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27da0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27db0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27dc0 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
27dd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27de0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74    int rc;..  int
27df0 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c   eMode;.  int nL
27e00 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74  og = -555;.  int
27e10 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20   nCkpt = -555;. 
27e20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
27e30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
27e40 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73  aMode[] = { "pas
27e50 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22  sive", "full", "
27e60 72 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63  restart", "trunc
27e70 61 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73  ate", 0 };.  ass
27e80 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
27e90 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d  KPOINT_PASSIVE==
27ea0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 );.  assert( S
27eb0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
27ec0 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73  _FULL==1 );.  as
27ed0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
27ee0 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d  CKPOINT_RESTART=
27ef0 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
27f00 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
27f10 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b  T_TRUNCATE==3 );
27f20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
27f30 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
27f40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
27f50 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
27f60 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41  jv, "DB MODE ?NA
27f70 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
27f80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
27f90 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ..  if( objc==4 
27fa0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
27fb0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27fc0 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  3]);.  }.  if( g
27fd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27fe0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
27ff0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
28000 20 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f   || (.      TCL_
28010 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
28020 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d  omObj(0, objv[2]
28030 2c 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20  , &eMode).   && 
28040 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
28050 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
28060 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f  rp, objv[2], aMo
28070 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26  de, "mode", 0, &
28080 65 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20  eMode) .  )){.  
28090 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
280a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
280b0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
280c0 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44  kpoint_v2(db, zD
280d0 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c  b, eMode, &nLog,
280e0 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20   &nCkpt);.  if( 
280f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
28100 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
28110 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
28120 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73  ar *zErrCode = s
28130 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
28140 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  );.    Tcl_Reset
28150 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
28160 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
28170 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
28180 72 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63  rCode, " - ", (c
28190 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
281a0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
281b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
281c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
281d0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
281e0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
281f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
28200 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
28210 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54  IntObj(rc==SQLIT
28220 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20  E_BUSY?1:0));.  
28230 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
28240 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
28250 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
28260 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54  tObj(nLog));.  T
28270 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
28280 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
28290 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
282a0 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54  Obj(nCkpt));.  T
282b0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
282c0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
282d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
282e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
282f0 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  :  sqlite3_wal_a
28300 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  utocheckpoint db
28310 20 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63   VALUE.*/.static
28320 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 61 75   int test_wal_au
28330 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20  tocheckpoint(.  
28340 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28350 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
28360 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
28370 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
28380 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
28390 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
283a0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
283b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
283c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
283d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
283e0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
283f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28400 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28410 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28420 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
28430 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20  .  int iVal;... 
28440 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
28450 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
28460 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
28470 6f 62 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22  objv, "DB VALUE"
28480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28490 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
284a0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
284b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
284c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
284d0 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
284e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30  _GetIntFromObj(0
284f0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c  , objv[2], &iVal
28500 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
28510 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28520 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
28530 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
28540 69 6e 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20  int(db, iVal);. 
28550 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
28560 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
28570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
28580 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
28590 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69  *zErrCode = sqli
285a0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a  te3ErrName(rc);.
285b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
285c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
285d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
285e0 72 72 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  rrCode, -1));.  
285f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28600 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
28610 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
28620 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73  .** tclcmd:  tes
28630 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53  t_sqlite3_log ?S
28640 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63  CRIPT?.*/.static
28650 20 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62   struct LogCallb
28660 61 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ack {.  Tcl_Inte
28670 72 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54  rp *pInterp;.  T
28680 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20  cl_Obj *pObj;.} 
28690 6c 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30  logcallback = {0
286a0 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  , 0};.static voi
286b0 64 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76  d xLogcallback(v
286c0 6f 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74  oid *unused, int
286d0 20 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67   err, char *zMsg
286e0 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e  ){.  Tcl_Obj *pN
286f0 65 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ew = Tcl_Duplica
28700 74 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63  teObj(logcallbac
28710 6b 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49  k.pObj);.  Tcl_I
28720 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77  ncrRefCount(pNew
28730 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
28740 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20  AppendElement(. 
28750 20 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63       0, pNew, Tc
28760 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
28770 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72  qlite3ErrName(er
28780 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54  r), -1).  );.  T
28790 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
287a0 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c  Element(0, pNew,
287b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
287c0 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20  j(zMsg, -1));.  
287d0 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f  Tcl_EvalObjEx(lo
287e0 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72  gcallback.pInter
287f0 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41  p, pNew, TCL_EVA
28800 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41  L_GLOBAL|TCL_EVA
28810 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c  L_DIRECT);.  Tcl
28820 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e  _DecrRefCount(pN
28830 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  ew);.}.static in
28840 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c  t test_sqlite3_l
28850 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  og(.  ClientData
28860 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
28870 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
28880 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
28890 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
288a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
288b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
288c0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
288d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
288e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
288f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
28900 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
28910 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
28920 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b  .  if( objc>2 ){
28930 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
28940 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
28950 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29   objv, "SCRIPT")
28960 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
28970 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
28980 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  ( logcallback.pO
28990 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65  bj ){.    Tcl_De
289a0 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61  crRefCount(logca
289b0 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20  llback.pObj);.  
289c0 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f    logcallback.pO
289d0 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63  bj = 0;.    logc
289e0 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20  allback.pInterp 
289f0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
28a00 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43  _config(SQLITE_C
28a10 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29  ONFIG_LOG, 0, 0)
28a20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
28a30 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c  >1 ){.    logcal
28a40 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a  lback.pObj = obj
28a50 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  v[1];.    Tcl_In
28a60 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61  crRefCount(logca
28a70 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20  llback.pObj);.  
28a80 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
28a90 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
28aa0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
28ab0 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
28ac0 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61  _LOG, xLogcallba
28ad0 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  ck, 0);.  }.  re
28ae0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28af0 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62  /*.**     tcl_ob
28b00 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d  jproc COMMANDNAM
28b10 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  E ARGS....**.** 
28b20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e  Run a TCL comman
28b30 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50  d using its objP
28b40 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20  roc interface.  
28b50 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
28b60 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64  f.** the command
28b70 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20   has no objProc 
28b80 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
28b90 61 74 69 63 20 69 6e 74 20 72 75 6e 41 73 4f 62  atic int runAsOb
28ba0 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20  jProc(.  void * 
28bb0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
28bc0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
28bd0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
28be0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
28bf0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43  bjv[].){.  Tcl_C
28c00 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
28c10 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
28c20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
28c30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
28c40 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e  objv, "COMMAND .
28c50 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
28c60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28c70 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
28c80 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
28c90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
28ca0 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e  objv[1]), &cmdIn
28cb0 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
28cc0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28cd0 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
28ce0 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20   found: ",.     
28cf0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
28d00 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63  ing(objv[1]), (c
28d10 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
28d20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28d30 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f   }.  if( cmdInfo
28d40 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20  .objProc==0 ){. 
28d50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
28d60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
28d70 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50  mand has no objP
28d80 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  roc: ",.        
28d90 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
28da0 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
28db0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
28dc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28dd0 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f    return cmdInfo
28de0 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f  .objProc(cmdInfo
28df0 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20  .objClientData, 
28e00 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20  interp, objc-1, 
28e10 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e  objv+1);.}..#ifn
28e20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
28e30 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41  EXPLAIN./*.** WA
28e40 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f  RNING: The follo
28e50 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70  wing function, p
28e60 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
28e70 50 6c 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61  Plan() is an exa
28e80 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78  ct.** copy of ex
28e90 61 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20  ample code from 
28ea0 65 71 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c  eqp.in (eqp.html
28eb0 29 2e 20 49 66 20 74 68 69 73 20 63 6f 64 65 20  ). If this code 
28ec0 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  is modified,.** 
28ed0 74 68 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  then the documen
28ee0 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64  tation copy need
28ef0 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64  s to be modified
28f00 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a   as well..*/./*.
28f10 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d  ** Argument pStm
28f20 74 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  t is a prepared 
28f30 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  SQL statement. T
28f40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
28f50 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c  piles.** an EXPL
28f60 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63  AIN QUERY PLAN c
28f70 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74  ommand to report
28f80 20 6f 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   on the prepared
28f90 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61   statement,.** a
28fa0 6e 64 20 70 72 69 6e 74 73 20 74 68 65 20 72 65  nd prints the re
28fb0 70 6f 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75  port to stdout u
28fc0 73 69 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a  sing printf()..*
28fd0 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61  /.int printExpla
28fe0 69 6e 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69  inQueryPlan(sqli
28ff0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29  te3_stmt *pStmt)
29000 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
29010 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
29020 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c      /* Input SQL
29030 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70   */.  char *zExp
29040 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20  lain;           
29050 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74        /* SQL wit
29060 68 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  h EXPLAIN QUERY 
29070 50 4c 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a  PLAN prepended *
29080 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
29090 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20   *pExplain;     
290a0 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20      /* Compiled 
290b0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
290c0 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  AN command */.  
290d0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
29100 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  rom sqlite3_prep
29110 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a  are_v2() */..  z
29120 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
29130 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  l(pStmt);.  if( 
29140 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
29150 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a   SQLITE_ERROR;..
29160 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c    zExplain = sql
29170 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
29180 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
29190 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69   %s", zSql);.  i
291a0 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29  f( zExplain==0 )
291b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
291c0 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71  OMEM;..  rc = sq
291d0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
291e0 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64  (sqlite3_db_hand
291f0 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c  le(pStmt), zExpl
29200 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  ain, -1, &pExpla
29210 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  in, 0);.  sqlite
29220 33 5f 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29  3_free(zExplain)
29230 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
29240 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
29250 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c  c;..  while( SQL
29260 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
29270 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
29280 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65  ){.    int iSele
29290 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63  ctid = sqlite3_c
292a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
292b0 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  in, 0);.    int 
292c0 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33  iOrder = sqlite3
292d0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
292e0 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e  lain, 1);.    in
292f0 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65  t iFrom = sqlite
29300 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
29310 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63  plain, 2);.    c
29320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61  onst char *zDeta
29330 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  il = (const char
29340 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   *)sqlite3_colum
29350 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
29360 20 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66   3);..    printf
29370 28 22 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22  ("%d %d %d %s\n"
29380 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72  , iSelectid, iOr
29390 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74  der, iFrom, zDet
293a0 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ail);.  }..  ret
293b0 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
293c0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
293d0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  }..static int te
293e0 73 74 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20 20  st_print_eqp(.  
293f0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
29400 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
29410 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
29420 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
29430 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
29440 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
29450 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
29460 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
29470 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
29480 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
29490 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
294a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
294b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
294c0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
294d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
294e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
294f0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
29500 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
29510 63 20 3d 20 70 72 69 6e 74 45 78 70 6c 61 69 6e  c = printExplain
29520 51 75 65 72 79 50 6c 61 6e 28 70 53 74 6d 74 29  QueryPlan(pStmt)
29530 3b 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e  ;.  /* This is n
29540 65 65 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73  eeded on Windows
29550 20 73 6f 20 74 68 61 74 20 61 20 74 65 73 74 20   so that a test 
29560 63 61 73 65 20 75 73 69 6e 67 20 74 68 69 73 20  case using this 
29570 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63  .  ** function c
29580 61 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 20 70  an open a read p
29590 69 70 65 20 61 6e 64 20 67 65 74 20 74 68 65 20  ipe and get the 
295a0 6f 75 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70  output of.  ** p
295b0 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
295c0 50 6c 61 6e 28 29 20 69 6d 6d 65 64 69 61 74 65  Plan() immediate
295d0 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73  ly..  */.  fflus
295e0 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c  h(stdout);.  Tcl
295f0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
29600 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
29610 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
29620 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29630 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29640 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
29650 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74   */../*.** sqlit
29660 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20  e3_test_control 
29670 56 45 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a  VERB ARGS....*/.
29680 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
29690 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20  test_control(.  
296a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
296b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
296c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
296d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
296e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
296f0 20 20 73 74 72 75 63 74 20 56 65 72 62 20 7b 0a    struct Verb {.
29700 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
29710 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69  zName;.    int i
29720 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20  ;.  } aVerb[] = 
29730 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  {.    { "SQLITE_
29740 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
29750 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c 49 54  ME_FAULT", SQLIT
29760 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
29770 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20  TIME_FAULT }, . 
29780 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53     { "SQLITE_TES
29790 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
297a0 50 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 54  P",     SQLITE_T
297b0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
297c0 4d 41 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20  MAP     }, .    
297d0 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  { "SQLITE_TESTCT
297e0 52 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20  RL_IMPOSTER",   
297f0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
29800 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 20 20  CTRL_IMPOSTER   
29810 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
29820 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20  nt iVerb;.  int 
29830 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b  iFlag;.  int rc;
29840 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
29850 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
29860 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
29870 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52  , objv, "VERB AR
29880 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74  GS...");.    ret
29890 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
298a0 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47   }..  rc = Tcl_G
298b0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74  etIndexFromObjSt
298c0 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65  ruct(.      inte
298d0 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65  rp, objv[1], aVe
298e0 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62  rb, sizeof(aVerb
298f0 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c  [0]), "VERB", 0,
29900 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69   &iVerb.  );.  i
29910 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20  f( rc!=TCL_OK ) 
29920 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46  return rc;..  iF
29930 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72  lag = aVerb[iVer
29940 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20  b].i;.  switch( 
29950 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73  iFlag ){.    cas
29960 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
29970 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
29980 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  T: {.      int v
29990 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  al;.      if( ob
299a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
299b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
299c0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
299d0 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20  v, "ONOFF");.   
299e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
299f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
29a00 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
29a10 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
29a20 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
29a30 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
29a40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
29a50 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
29a60 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
29a70 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
29a80 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20  AULT, val);.    
29a90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
29aa0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
29ab0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
29ac0 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 69 6e  MMAP: {.      in
29ad0 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c  t val;.      sql
29ae0 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20  ite3 *db;.      
29af0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
29b00 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
29b10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
29b20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c 49 4d  2, objv, "DB LIM
29b30 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65  IT");.        re
29b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29b50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29b60 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29b70 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29b80 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
29b90 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
29ba0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
29bb0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
29bc0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
29bd0 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
29be0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29bf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
29c00 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
29c10 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
29c20 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c 29 3b  _MMAP, db, val);
29c30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29c40 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
29c50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
29c60 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  POSTER: {.      
29c70 69 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 3b  int onOff, tnum;
29c80 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
29c90 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 20 20  r *zDbName;.    
29ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
29cb0 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 36       if( objc!=6
29cc0 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
29cd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
29ce0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44  erp, 2, objv, "D
29cf0 42 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66 20 74  B dbName onOff t
29d00 6e 75 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  num");.        r
29d10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29d20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29d30 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
29d40 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
29d50 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
29d60 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
29d70 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7a  L_ERROR;.      z
29d80 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
29d90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
29da0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
29db0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
29dc0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6f  erp, objv[4], &o
29dd0 6e 4f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54  nOff) ) return T
29de0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
29df0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
29e00 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
29e10 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20 29 20  jv[5], &tnum) ) 
29e20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29e30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29e40 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
29e50 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
29e60 4f 53 54 45 52 2c 20 64 62 2c 20 7a 44 62 4e 61  OSTER, db, zDbNa
29e70 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29  me, onOff, tnum)
29e80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
29e90 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f     }.  }..  Tcl_
29ea0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
29eb0 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
29ec0 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  L_OK;.}..#if SQL
29ed0 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63  ITE_OS_UNIX.#inc
29ee0 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68  lude <sys/time.h
29ef0 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  >.#include <sys/
29f00 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61  resource.h>..sta
29f10 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74  tic int test_get
29f20 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a  rusage(.  void *
29f30 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
29f40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29f50 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
29f60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29f70 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
29f80 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74   buf[1024];.  st
29f90 72 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20  ruct rusage r;. 
29fa0 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73   memset(&r, 0, s
29fb0 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74  izeof(r));.  get
29fc0 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
29fd0 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69  LF, &r);..  sqli
29fe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
29ff0 65 6f 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20  eof(buf), buf,. 
2a000 20 20 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e     "ru_utime=%d.
2a010 25 30 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64  %06d ru_stime=%d
2a020 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d  .%06d ru_minflt=
2a030 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22  %d ru_majflt=%d"
2a040 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2a050 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28  _utime.tv_sec, (
2a060 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74  int)r.ru_utime.t
2a070 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e  v_usec, .    (in
2a080 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f  t)r.ru_stime.tv_
2a090 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73  sec, (int)r.ru_s
2a0a0 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20  time.tv_usec, . 
2a0b0 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e     (int)r.ru_min
2a0c0 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d  flt, (int)r.ru_m
2a0d0 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c  ajflt.  );.  Tcl
2a0e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2a0f0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
2a100 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
2a110 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a120 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
2a130 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
2a140 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
2a150 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65   passed from the
2a160 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74   main thread int
2a170 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69  o the windows fi
2a180 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63  le locker.** bac
2a190 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a  kground thread..
2a1a0 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46  */.struct win32F
2a1b0 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68  ileLocker {.  ch
2a1c0 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20  ar *evName;     
2a1d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65    /* Name of eve
2a1e0 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72  nt to signal thr
2a1f0 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20  ead startup */. 
2a200 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
2a210 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
2a220 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
2a230 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74   locked */.  int
2a240 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20   delay1;        
2a250 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
2a260 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   locking */.  in
2a270 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20  t delay2;       
2a280 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72    /* Delay befor
2a290 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  e unlocking */. 
2a2a0 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20   int ok;        
2a2b0 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64       /* Finished
2a2c0 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72   ok */.  int err
2a2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2a2e0 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72  True if an error
2a2f0 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65   occurs */.};.#e
2a300 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
2a310 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64  E_OS_WIN.#includ
2a320 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a  e <process.h>./*
2a330 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75  .** The backgrou
2a340 6e 64 20 74 68 72 65 61 64 20 74 68 61 74 20 64  nd thread that d
2a350 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oes file locking
2a360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a370 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2a380 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  er(void *pAppDat
2a390 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  a){.  struct win
2a3a0 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20  32FileLocker *p 
2a3b0 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33 32 46  = (struct win32F
2a3c0 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44  ileLocker*)pAppD
2a3d0 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76  ata;.  if( p->ev
2a3e0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e 44  Name ){.    HAND
2a3f0 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e  LE ev = OpenEven
2a400 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53  t(EVENT_MODIFY_S
2a410 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e  TATE, FALSE, p->
2a420 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20  evName);.    if 
2a430 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20 53 65  ( ev ){.      Se
2a440 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20 20 20  tEvent(ev);.    
2a450 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
2a460 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
2a470 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29 20 53  f( p->delay1 ) S
2a480 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b  leep(p->delay1);
2a490 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28  .  if( LockFile(
2a4a0 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30  p->h, 0, 0, 1000
2a4b0 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20 20 20  00000, 0) ){.   
2a4c0 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 32   Sleep(p->delay2
2a4d0 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  );.    UnlockFil
2a4e0 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
2a4f0 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20 20 20  0000000, 0);.   
2a500 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65   p->ok = 1;.  }e
2a510 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20  lse{.    p->err 
2a520 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65  = 1;.  }.  Close
2a530 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20  Handle(p->h);.  
2a540 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64  p->h = 0;.  p->d
2a550 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e  elay1 = 0;.  p->
2a560 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65  delay2 = 0;.}.#e
2a570 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
2a580 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20  _OS_WIN./*.**   
2a590 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69     lock_win32_fi
2a5a0 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41  le FILENAME DELA
2a5b0 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20  Y1 DELAY2.**.** 
2a5c0 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  Get an exclusive
2a5d0 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20   manditory lock 
2a5e0 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45 4c 41  on file for DELA
2a5f0 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  Y2 milliseconds.
2a600 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59 31 20  .** Wait DELAY1 
2a610 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66  milliseconds bef
2a620 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 74 68  ore acquiring th
2a630 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
2a640 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65  c int win32_file
2a650 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20  _lock(.  void * 
2a660 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2a670 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a680 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2a690 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2a6a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
2a6b0 63 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69  c struct win32Fi
2a6c0 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22  leLocker x = { "
2a6d0 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22  win32_file_lock"
2a6e0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
2a6f0 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
2a700 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68  *zFilename;.  ch
2a710 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
2a720 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20  int retry = 0;. 
2a730 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57   HANDLE ev;.  DW
2a740 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a  ORD wResult;.  .
2a750 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
2a760 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
2a770 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2a780 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2a790 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41  , "FILENAME DELA
2a7a0 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20  Y1 DELAY2");.   
2a7b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a7c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
2a7d0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==1 ){.    sqli
2a7e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2a7f0 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
2a800 20 22 25 64 20 25 64 20 25 64 20 25 64 20 25 64   "%d %d %d %d %d
2a810 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a820 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e          x.ok, x.
2a830 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78  err, x.delay1, x
2a840 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20  .delay2, x.h);. 
2a850 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2a860 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
2a870 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2a880 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a890 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68    }.  while( x.h
2a8a0 20 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a   && retry<30 ){.
2a8b0 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20      retry++;.   
2a8c0 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d   Sleep(100);.  }
2a8d0 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20  .  if( x.h ){.  
2a8e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2a8f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79  lt(interp, "busy
2a900 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
2a910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a920 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2a930 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2a940 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
2a950 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65   &x.delay1) ) re
2a960 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a970 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2a980 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2a990 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61  objv[3], &x.dela
2a9a0 79 32 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  y2) ) return TCL
2a9b0 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e  _ERROR;.  zFilen
2a9c0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
2a9d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
2a9e0 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65  x.h = CreateFile
2a9f0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45  (zFilename, GENE
2aa00 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43  RIC_READ|GENERIC
2aa10 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20  _WRITE,.        
2aa20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45        FILE_SHARE
2aa30 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45  _READ|FILE_SHARE
2aa40 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f  _WRITE, 0, OPEN_
2aa50 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20  ALWAYS,.        
2aa60 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
2aa70 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b  BUTE_NORMAL, 0);
2aa80 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20  .  if( !x.h ){. 
2aa90 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2aaa0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
2aab0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
2aac0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68  , zFilename, (ch
2aad0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2aae0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2aaf0 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65 45  }.  ev = CreateE
2ab00 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c  vent(NULL, TRUE,
2ab10 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65   FALSE, x.evName
2ab20 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b  );.  if ( !ev ){
2ab30 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2ab40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
2ab50 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65  annot create eve
2ab60 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c  nt: ", x.evName,
2ab70 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2ab80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2ab90 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68  ;.  }.  _beginth
2aba0 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f  read(win32_file_
2abb0 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64  locker, 0, (void
2abc0 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30  *)&x);.  Sleep(0
2abd0 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73 75  );.  if ( (wResu
2abe0 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  lt = WaitForSing
2abf0 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30  leObject(ev, 100
2ac00 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43  00))!=WAIT_OBJEC
2ac10 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  T_0 ){.    sqlit
2ac20 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2ac30 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
2ac40 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29  "0x%x", wResult)
2ac50 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
2ac60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ac70 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  wait failed: ", 
2ac80 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
2ac90 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
2aca0 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (ev);.    return
2acb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2acc0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
2acd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2ace0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2acf0 20 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70    exists_win32_p
2ad00 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52  ath PATH.**.** R
2ad10 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
2ad20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
2ad30 20 70 61 74 68 20 65 78 69 73 74 73 2c 20 77 68   path exists, wh
2ad40 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2ad50 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20  ied name.** may 
2ad60 65 78 63 65 65 64 20 32 36 30 20 63 68 61 72 61  exceed 260 chara
2ad70 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
2ad80 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
2ad90 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2ada0 6e 74 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f  nt win32_exists_
2adb0 70 61 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c  path(.  void *cl
2adc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2add0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2ade0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2adf0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2ae00 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
2ae10 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2ae20 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2ae30 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50  erp, 1, objv, "P
2ae40 41 54 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ATH");.    retur
2ae50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ae60 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2ae70 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2ae80 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20  NewBooleanObj(. 
2ae90 20 20 20 20 20 47 65 74 46 69 6c 65 41 74 74 72       GetFileAttr
2aea0 69 62 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74  ibutesW( Tcl_Get
2aeb0 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2aec0 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  )!=INVALID_FILE_
2aed0 41 54 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20  ATTRIBUTES ));. 
2aee0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2aef0 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69  }../*.**      fi
2af00 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41  nd_win32_file PA
2af10 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  TTERN.**.** Retu
2af20 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e  rns a list of en
2af30 74 72 69 65 73 20 69 6e 20 61 20 64 69 72 65 63  tries in a direc
2af40 74 6f 72 79 20 74 68 61 74 20 6d 61 74 63 68 20  tory that match 
2af50 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2af60 74 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20  ttern,.** whose 
2af70 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2af80 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
2af90 32 34 38 20 63 68 61 72 61 63 74 65 72 73 20 69  248 characters i
2afa0 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
2afb0 20 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e   with.** "\\?\".
2afc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2afd0 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a  in32_find_file(.
2afe0 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2aff0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2b000 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2b010 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2b020 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2b030 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 46  .  HANDLE hFindF
2b040 69 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ile = INVALID_HA
2b050 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49  NDLE_VALUE;.  WI
2b060 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 66  N32_FIND_DATAW f
2b070 69 6e 64 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f  indData;.  Tcl_O
2b080 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44  bj *listObj;.  D
2b090 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
2b0a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2b0b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2b0c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2b0d0 20 6f 62 6a 76 2c 20 22 50 41 54 54 45 52 4e 22   objv, "PATTERN"
2b0e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b0f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68  L_ERROR;.  }.  h
2b100 46 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64 46  FindFile = FindF
2b110 69 72 73 74 46 69 6c 65 57 28 54 63 6c 5f 47 65  irstFileW(Tcl_Ge
2b120 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
2b130 29 2c 20 26 66 69 6e 64 44 61 74 61 29 3b 0a 20  ), &findData);. 
2b140 20 69 66 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d   if( hFindFile==
2b150 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
2b160 41 4c 55 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ALUE ){.    Tcl_
2b170 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2b180 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2b190 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2b1a0 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2b1b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b1c0 20 7d 0a 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54   }.  listObj = T
2b1d0 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
2b1e0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2b1f0 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b  listObj);.  do {
2b200 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2b210 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2b220 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54  terp, listObj, T
2b230 63 6c 5f 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a  cl_NewUnicodeObj
2b240 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61  (.        findDa
2b250 74 61 2e 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31  ta.cFileName, -1
2b260 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b270 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b280 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
2b290 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2b2a0 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e  Obj(.        fin
2b2b0 64 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  dData.dwFileAttr
2b2c0 69 62 75 74 65 73 29 29 3b 0a 20 20 7d 20 77 68  ibutes));.  } wh
2b2d0 69 6c 65 28 20 46 69 6e 64 4e 65 78 74 46 69 6c  ile( FindNextFil
2b2e0 65 57 28 68 46 69 6e 64 46 69 6c 65 2c 20 26 66  eW(hFindFile, &f
2b2f0 69 6e 64 44 61 74 61 29 20 29 3b 0a 20 20 6c 61  indData) );.  la
2b300 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
2b310 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
2b320 6c 61 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52  lastErrno!=NO_ER
2b330 52 4f 52 20 26 26 20 6c 61 73 74 45 72 72 6e 6f  ROR && lastErrno
2b340 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f  !=ERROR_NO_MORE_
2b350 46 49 4c 45 53 20 29 7b 0a 20 20 20 20 46 69 6e  FILES ){.    Fin
2b360 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65  dClose(hFindFile
2b370 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2b380 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29  efCount(listObj)
2b390 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
2b3a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2b3b0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
2b3c0 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
2b3d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b3e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46  L_ERROR;.  }.  F
2b3f0 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69  indClose(hFindFi
2b400 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  le);.  Tcl_SetOb
2b410 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2b420 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75  listObj);.  retu
2b430 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2b440 0a 2a 2a 20 20 20 20 20 20 64 65 6c 65 74 65 5f  .**      delete_
2b450 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e  win32_file FILEN
2b460 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  AME.**.** Delete
2b470 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
2b480 66 69 6c 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c  file, whose full
2b490 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
2b4a0 20 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 0a   may exceed 260.
2b4b0 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
2b4c0 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
2b4d0 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
2b4e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
2b4f0 5f 64 65 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20  _delete_file(.  
2b500 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2b510 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b520 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2b530 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2b540 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2b550 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2b560 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2b570 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2b580 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22  objv, "FILENAME"
2b590 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b5a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2b5b0 66 28 20 21 44 65 6c 65 74 65 46 69 6c 65 57 28  f( !DeleteFileW(
2b5c0 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f  Tcl_GetUnicode(o
2b5d0 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[1])) ){.    
2b5e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2b5f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2b600 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
2b610 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
2b620 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b630 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73  R;.  }.  Tcl_Res
2b640 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2b650 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2b660 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2b670 20 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20   make_win32_dir 
2b680 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20  DIRECTORY.**.** 
2b690 43 72 65 61 74 65 73 20 74 68 65 20 73 70 65 63  Creates the spec
2b6a0 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c  ified directory,
2b6b0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2b6c0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2b6d0 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68  exceed 248.** ch
2b6e0 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2b6f0 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2b700 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2b710 63 20 69 6e 74 20 77 69 6e 33 32 5f 6d 6b 64 69  c int win32_mkdi
2b720 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  r(.  void *clien
2b730 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2b740 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2b750 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2b760 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b770 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
2b780 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2b790 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2b7a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45  , 1, objv, "DIRE
2b7b0 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74  CTORY");.    ret
2b7c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b7d0 20 7d 0a 20 20 69 66 28 20 21 43 72 65 61 74 65   }.  if( !Create
2b7e0 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47  DirectoryW(Tcl_G
2b7f0 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2b800 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  ]), NULL) ){.   
2b810 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2b820 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2b830 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
2b840 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
2b850 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b860 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65  OR;.  }.  Tcl_Re
2b870 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
2b880 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2b890 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2b8a0 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64    remove_win32_d
2b8b0 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a  ir DIRECTORY.**.
2b8c0 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68 65 20 73  ** Removes the s
2b8d0 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74 6f  pecified directo
2b8e0 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20  ry, whose fully 
2b8f0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d  qualified name m
2b900 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a 2a  ay exceed 248.**
2b910 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
2b920 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
2b930 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74  th "\\?\"..*/.st
2b940 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 72  atic int win32_r
2b950 6d 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c  mdir(.  void *cl
2b960 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2b970 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2b980 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2b990 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2b9a0 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
2b9b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2b9c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2b9d0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2b9e0 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20  IRECTORY");.    
2b9f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2ba00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65 6d  ;.  }.  if( !Rem
2ba10 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28 54 63  oveDirectoryW(Tc
2ba20 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2ba30 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63  v[1])) ){.    Tc
2ba40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2ba50 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2ba60 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2ba70 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2ba80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ba90 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2baa0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2bab0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2bac0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
2bad0 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74  *      optimizat
2bae0 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f  ion_control DB O
2baf0 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a  PT BOOLEAN.**.**
2bb00 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
2bb10 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  le query optimiz
2bb20 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65  ations using the
2bb30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2bb40 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72  ntrol().** inter
2bb50 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20 69  face.  Disable i
2bb60 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c  f BOOLEAN is fal
2bb70 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69 66  se and enable if
2bb80 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75 65   BOOLEAN is true
2bb90 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65 20  ..** OPT is the 
2bba0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69  name of the opti
2bbb0 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 64  mization to be d
2bbc0 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74  isabled..*/.stat
2bbd0 69 63 20 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ic int optimizat
2bbe0 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76  ion_control(.  v
2bbf0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2bc00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2bc10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2bc20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2bc30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2bc40 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
2bc50 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2bc60 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74  har *zOpt;.  int
2bc70 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61   onoff;.  int ma
2bc80 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  sk = 0;.  static
2bc90 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
2bca0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2bcb0 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  zOptName;.    in
2bcc0 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74  t mask;.  } aOpt
2bcd0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c  [] = {.    { "al
2bce0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
2bcf0 20 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70      SQLITE_AllOp
2bd00 74 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ts        },.   
2bd10 20 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20   { "none",      
2bd20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d  },.    { "query-
2bd50 66 6c 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20  flattener",     
2bd60 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74  SQLITE_QueryFlat
2bd70 74 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22  tener },.    { "
2bd80 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20  column-cache",  
2bd90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c        SQLITE_Col
2bda0 75 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c 0a 20  umnCache    },. 
2bdb0 20 20 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72     { "groupby-or
2bdc0 64 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49  der",       SQLI
2bdd0 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20  TE_GroupByOrder 
2bde0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74    },.    { "fact
2bdf0 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20  or-constants",  
2be00 20 20 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f    SQLITE_FactorO
2be10 75 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b  utConst },.    {
2be20 20 22 64 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c   "distinct-opt",
2be30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
2be40 69 73 74 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c  istinctOpt    },
2be50 0a 20 20 20 20 7b 20 22 63 6f 76 65 72 2d 69 64  .    { "cover-id
2be60 78 2d 73 63 61 6e 22 2c 20 20 20 20 20 20 53 51  x-scan",      SQ
2be70 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61  LITE_CoverIdxSca
2be80 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72  n   },.    { "or
2be90 64 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22  der-by-idx-join"
2bea0 2c 20 20 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  ,   SQLITE_Order
2beb0 42 79 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20  ByIdxJoin },.   
2bec0 20 7b 20 22 74 72 61 6e 73 69 74 69 76 65 22 2c   { "transitive",
2bed0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2bee0 5f 54 72 61 6e 73 69 74 69 76 65 20 20 20 20 20  _Transitive     
2bef0 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62 71 75 65  },.    { "subque
2bf00 72 79 2d 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20  ry-coroutine",  
2bf10 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75  SQLITE_SubqCorou
2bf20 74 69 6e 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22  tine  },.    { "
2bf30 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c  omit-noop-join",
2bf40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69        SQLITE_Omi
2bf50 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20  tNoopJoin   },. 
2bf60 20 20 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20     { "stat3",   
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2bf80 54 45 5f 53 74 61 74 33 34 20 20 20 20 20 20 20  TE_Stat34       
2bf90 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74    },.    { "stat
2bfa0 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2bfb0 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20    SQLITE_Stat34 
2bfc0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
2bfd0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
2bfe0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2bff0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2c000 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20  , objv, "DB OPT 
2c010 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72  BOOLEAN");.    r
2c020 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c030 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2c040 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2c050 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2c060 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
2c070 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c080 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
2c090 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2c0a0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f  erp, objv[3], &o
2c0b0 6e 6f 66 66 29 20 29 20 72 65 74 75 72 6e 20 54  noff) ) return T
2c0c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74  CL_ERROR;.  zOpt
2c0d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2c0e0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72  (objv[2]);.  for
2c0f0 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
2c100 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
2c110 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2c120 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c  if( strcmp(zOpt,
2c130 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d   aOpt[i].zOptNam
2c140 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  e)==0 ){.      m
2c150 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61  ask = aOpt[i].ma
2c160 73 6b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  sk;.      break;
2c170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2c180 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20   onoff ) mask = 
2c190 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d  ~mask;.  if( i>=
2c1a0 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2c1b0 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a  eof(aOpt[0]) ){.
2c1c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2c1d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
2c1e0 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69  known optimizati
2c1f0 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f  on - should be o
2c200 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20  ne of:",.       
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2c220 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72  har*)0);.    for
2c230 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
2c240 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
2c250 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2c260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2c270 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20  lt(interp, " ", 
2c280 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65  aOpt[i].zOptName
2c290 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2c2a0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
2c2b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  L_ERROR;.  }.  s
2c2c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2c2d0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2c2e0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
2c2f0 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20  S, db, mask);.  
2c300 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2c310 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
2c320 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2c330 74 69 6e 65 73 20 73 71 6c 69 74 65 33 5f 61 70  tines sqlite3_ap
2c340 69 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f 2a 0a 2a  i_routines;./*.*
2c350 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69  *     load_stati
2c360 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e  c_extension DB N
2c370 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  AME ....**.** Lo
2c380 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  ad one or more s
2c390 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64  tatically linked
2c3a0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
2c3b0 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c 4c 6f  static int tclLo
2c3c0 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
2c3d0 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  nCmd(.  void * c
2c3e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2c3f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c400 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2c410 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c420 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e  jv[].){.  extern
2c430 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d 61   int sqlite3_ama
2c440 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  tch_init(sqlite3
2c450 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2c460 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2c470 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2c480 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
2c490 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ure_init(sqlite3
2c4a0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2c4b0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2c4c0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2c4d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 76 61 6c  int sqlite3_eval
2c4e0 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2c4f0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2c500 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2c510 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2c520 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2c530 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2c540 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2c550 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2c560 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2c570 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69  sqlite3_fuzzer_i
2c580 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c590 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c5a0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c5b0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c5c0 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74  qlite3_ieee_init
2c5d0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2c5e0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2c5f0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2c600 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2c610 74 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69  te3_nextchar_ini
2c620 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2c630 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2c640 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2c650 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2c660 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f  ite3_percentile_
2c670 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2c680 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2c690 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2c6a0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2c6b0 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69  sqlite3_regexp_i
2c6c0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c6d0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c6e0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c6f0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c700 71 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e  qlite3_series_in
2c710 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c720 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c730 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c740 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c750 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69  lite3_spellfix_i
2c760 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c770 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c780 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c790 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c7a0 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e  qlite3_totype_in
2c7b0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c7c0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c7d0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c7e0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c7f0 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65  lite3_wholenumbe
2c800 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  r_init(sqlite3*,
2c810 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2c820 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2c830 73 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  s*);.  static co
2c840 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
2c850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
2c860 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28  tName;.    int (
2c870 2a 70 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a  *pInit)(sqlite3*
2c880 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2c890 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2c8a0 65 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e  es*);.  } aExten
2c8b0 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  sion[] = {.    {
2c8c0 20 22 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20   "amatch",      
2c8d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c8e0 33 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20  3_amatch_init   
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2c900 20 20 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20     { "closure", 
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c920 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e  lite3_closure_in
2c930 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2c940 7d 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c  },.    { "eval",
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c960 20 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69    sqlite3_eval_i
2c970 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2c980 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69      },.    { "fi
2c990 6c 65 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20  leio",          
2c9a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
2c9b0 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20  leio_init       
2c9c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2c9d0 20 22 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20   "fuzzer",      
2c9e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c9f0 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20  3_fuzzer_init   
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ca10 20 20 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20     { "ieee754", 
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ca30 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20  lite3_ieee_init 
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68  },.    { "nextch
2ca60 61 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ar",            
2ca70 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68    sqlite3_nextch
2ca80 61 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ar_init         
2ca90 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65      },.    { "pe
2caa0 72 63 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20  rcentile",      
2cab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65        sqlite3_pe
2cac0 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20  rcentile_init   
2cad0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cae0 20 22 72 65 67 65 78 70 22 2c 20 20 20 20 20 20   "regexp",      
2caf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cb00 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20  3_regexp_init   
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2cb20 20 20 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20     { "series",  
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cb40 6c 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69  lite3_series_ini
2cb50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cb60 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66  },.    { "spellf
2cb70 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ix",            
2cb80 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66    sqlite3_spellf
2cb90 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ix_init         
2cba0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f      },.    { "to
2cbb0 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
2cbc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2cbd0 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20  type_init       
2cbe0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cbf0 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20   "wholenumber", 
2cc00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cc10 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2cc20 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  it          },. 
2cc30 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   };.  sqlite3 *d
2cc40 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
2cc50 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c  *zName;.  int i,
2cc60 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a   j, rc;.  char *
2cc70 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2cc80 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
2cc90 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2cca0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2ccb0 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22  v, "DB NAME ..."
2ccc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2ccd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2cce0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2ccf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2cd00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2cd10 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2cd20 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a  L_ERROR;.  for(j
2cd30 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29  =2; j<objc; j++)
2cd40 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  {.    zName = Tc
2cd50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2cd60 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
2cd70 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2cd80 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29  Extension); i++)
2cd90 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2cda0 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e  mp(zName, aExten
2cdb0 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65  sion[i].zExtName
2cdc0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2cdd0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41    }.    if( i>=A
2cde0 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
2cdf0 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ion) ){.      Tc
2ce00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2ce10 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
2ce20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e  extension: ", zN
2ce30 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2ce40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2ce50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2ce60 20 20 69 66 28 20 61 45 78 74 65 6e 73 69 6f 6e    if( aExtension
2ce70 5b 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20 20  [i].pInit ){.   
2ce80 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69     rc = aExtensi
2ce90 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20  on[i].pInit(db, 
2cea0 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20  &zErrMsg, 0);.  
2ceb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2cec0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2ced0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
2cee0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45  =SQLITE_OK || zE
2cef0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54  rrMsg ){.      T
2cf00 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2cf10 69 6e 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c  interp, "initial
2cf20 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e  ization of ", zN
2cf30 61 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22  ame, " failed: "
2cf40 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20  , zErrMsg,.     
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
2cf70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cf80 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2cf90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2cfa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cfb0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2cfc0 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72  /*.**     sorter
2cfd0 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42  _test_fakeheap B
2cfe0 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  OOL.**.*/.static
2cff0 20 69 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74   int sorter_test
2d000 5f 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69  _fakeheap(.  voi
2d010 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2d020 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d030 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2d040 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2d050 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2d060 6e 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f  nt bArg;.  if( o
2d070 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2d080 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2d090 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2d0a0 22 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74  "BOOL");.    ret
2d0b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d0c0 20 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65   }..  if( Tcl_Ge
2d0d0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
2d0e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
2d0f0 20 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72   &bArg) ){.    r
2d100 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d110 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67  .  }..  if( bArg
2d120 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
2d130 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2d140 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
2d150 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2d160 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51  onfig.pHeap = SQ
2d170 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
2d180 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -1);.    }.  }el
2d190 73 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  se{.    if( sqli
2d1a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2d1b0 70 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  pHeap==SQLITE_IN
2d1c0 54 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a  T_TO_PTR(-1) ){.
2d1d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2d1e0 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
2d1f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2d200 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2d210 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2d220 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2d230 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f  *.**     sorter_
2d240 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65  test_sort4_helpe
2d250 72 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20  r DB SQL1 NSTEP 
2d260 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  SQL2.**.** Compi
2d270 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
2d280 20 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20   $SQL1 and step 
2d290 69 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e  it $NSTEP times.
2d2a0 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a   For each row, .
2d2b0 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ** check that th
2d2c0 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72  e leftmost and r
2d2d0 69 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  ightmost columns
2d2e0 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f   returned are bo
2d2f0 74 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20  th integers,.** 
2d300 61 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f  and that both co
2d310 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76  ntain the same v
2d320 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  alue..**.** Then
2d330 20 65 78 65 63 75 74 65 20 73 74 61 74 65 6d 65   execute stateme
2d340 6e 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20  nt $SQL2. Check 
2d350 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
2d360 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  nt returns the s
2d370 61 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e  ame.** set of in
2d380 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 61  tegers in the sa
2d390 6d 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74  me order as in t
2d3a0 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 65 70  he previous step
2d3b0 20 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a   (using $SQL1)..
2d3c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f  */.static int so
2d3d0 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f  rter_test_sort4_
2d3e0 68 65 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a  helper(.  void *
2d3f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2d400 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2d410 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2d420 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2d430 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
2d440 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20  t char *zSql1;. 
2d450 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2d460 6c 32 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b  l2;.  int nStep;
2d470 20 0a 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a   .  int iStep; .
2d480 20 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20    int iCksum1 = 
2d490 30 3b 20 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d  0; .  int iCksum
2d4a0 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63  2 = 0; .  int rc
2d4b0 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71  ;.  int iB;.  sq
2d4c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
2d4d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2d4e0 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
2d4f0 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
2d500 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2d510 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2d520 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22  SQL1 NSTEP SQL2"
2d530 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2d540 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2d550 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2d560 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2d570 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2d580 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2d590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
2d5a0 31 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  1 = Tcl_GetStrin
2d5b0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
2d5c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2d5d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2d5e0 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72  [3], &nStep) ) r
2d5f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d600 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47  .  zSql2 = Tcl_G
2d610 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
2d620 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
2d630 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
2d640 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53  , zSql1, -1, &pS
2d650 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
2d660 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2d670 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a  oto sql_error;..
2d680 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63    iB = sqlite3_c
2d690 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
2d6a0 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65  t)-1;.  for(iSte
2d6b0 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70  p=0; iStep<nStep
2d6c0 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
2d6d0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2d6e0 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
2d6f0 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
2d700 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2d710 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
2d720 20 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75   a!=sqlite3_colu
2d730 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42  mn_int(pStmt, iB
2d740 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
2d750 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2d760 72 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a  rp, "data error:
2d770 20 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20   (a!=b)", 0);.  
2d780 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d790 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
2d7a0 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b   iCksum1 += (iCk
2d7b0 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20 61 3b 0a  sum1 << 3) + a;.
2d7c0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2d7d0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2d7e0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
2d7f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
2d800 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20  ql_error;..  rc 
2d810 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2d820 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20  e_v2(db, zSql2, 
2d830 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2d840 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d850 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65  _OK ) goto sql_e
2d860 72 72 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65  rror;.  for(iSte
2d870 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p=0; SQLITE_ROW=
2d880 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
2d890 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a  tmt); iStep++){.
2d8a0 20 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69      int a = sqli
2d8b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2d8c0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43  Stmt, 0);.    iC
2d8d0 6b 73 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d  ksum2 += (iCksum
2d8e0 32 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d  2 << 3) + a;.  }
2d8f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2d900 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2d910 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d920 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
2d930 65 72 72 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43  error;..  if( iC
2d940 6b 73 75 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29  ksum1!=iCksum2 )
2d950 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2d960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2d970 63 68 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63  checksum mismatc
2d980 68 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  h", 0);.    retu
2d990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d9a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
2d9b0 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a  OK;. sql_error:.
2d9c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2d9d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 20  lt(interp, "sql 
2d9e0 65 72 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65  error: ", sqlite
2d9f0 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
2da00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
2da10 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  RROR;.}...#ifdef
2da20 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2da30 48 45 4e 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63  HENTICATION.#inc
2da40 6c 75 64 65 20 22 73 71 6c 69 74 65 33 75 73 65  lude "sqlite3use
2da50 72 61 75 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74  rauth.h"./*.** t
2da60 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2da70 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
2da80 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41  e DB USERNAME PA
2da90 53 53 57 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63  SSWORD.*/.static
2daa0 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61   int test_user_a
2dab0 75 74 68 65 6e 74 69 63 61 74 65 28 0a 20 20 43  uthenticate(.  C
2dac0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2dad0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2dae0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2daf0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2db00 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2db10 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2db20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2db30 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2db40 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2db50 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2db60 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2db70 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2db80 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2db90 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
2dba0 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  User = 0;.  char
2dbb0 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20   *zPasswd = 0;. 
2dbc0 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30   int nPasswd = 0
2dbd0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2dbe0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2dbf0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2dc00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2dc10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2dc20 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20  v, "DB USERNAME 
2dc30 50 41 53 53 57 4f 52 44 22 29 3b 0a 20 20 20 20  PASSWORD");.    
2dc40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2dc50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2dc60 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2dc70 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2dc80 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
2dc90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2dca0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
2dcb0 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
2dcc0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
2dcd0 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74  Passwd = Tcl_Get
2dce0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
2dcf0 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29  jv[3], &nPasswd)
2dd00 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2dd10 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
2dd20 74 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  te(db, zUser, zP
2dd30 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 29 3b  asswd, nPasswd);
2dd40 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2dd50 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2dd60 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2dd70 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2dd80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2dd90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2dda0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2ddb0 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65  CATION */..#ifde
2ddc0 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
2ddd0 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a  THENTICATION./*.
2dde0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2ddf0 74 65 33 5f 75 73 65 72 5f 61 64 64 20 44 42 20  te3_user_add DB 
2de00 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2de10 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61  D ISADMIN.*/.sta
2de20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65  tic int test_use
2de30 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44  r_add(.  ClientD
2de40 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2de50 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2de60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2de70 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2de80 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2de90 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2dea0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2deb0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2dec0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ded0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2dee0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2def0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2df00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2df10 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
2df20 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73   0;.  char *zPas
2df30 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  swd = 0;.  int n
2df40 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
2df50 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20  t isAdmin = 0;. 
2df60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2df70 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2df80 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
2df90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2dfa0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2dfb0 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
2dfc0 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b  SWORD ISADMIN");
2dfd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2dfe0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2dff0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2e000 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2e010 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2e020 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
2e030 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e040 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65    zUser = Tcl_Ge
2e050 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2e060 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63  ;.  zPasswd = Tc
2e070 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
2e080 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61  bj(objv[3], &nPa
2e090 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74  sswd);.  Tcl_Get
2e0a0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
2e0b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
2e0c0 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20  &isAdmin);.  rc 
2e0d0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  = sqlite3_user_a
2e0e0 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  dd(db, zUser, zP
2e0f0 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20  asswd, nPasswd, 
2e100 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f  isAdmin);.  Tcl_
2e110 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2e120 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2e130 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2e140 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2e150 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2e160 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
2e170 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
2e180 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2e190 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2e1a0 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
2e1b0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
2e1c0 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45 52  r_change DB USER
2e1d0 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
2e1e0 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20  ADMIN.*/.static 
2e1f0 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 63 68  int test_user_ch
2e200 61 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  ange(.  ClientDa
2e210 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2e220 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2e230 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e240 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2e250 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2e260 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2e270 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2e280 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2e290 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2e2a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2e2b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e2c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2e2d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2e2e0 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
2e2f0 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  0;.  char *zPass
2e300 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  wd = 0;.  int nP
2e310 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
2e320 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20   isAdmin = 0;.  
2e330 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2e340 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
2e350 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
2e360 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2e370 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2e380 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
2e390 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a  WORD ISADMIN");.
2e3a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e3b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2e3c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2e3d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2e3e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2e3f0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2e400 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e410 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
2e420 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2e430 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
2e440 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2e450 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
2e460 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42  swd);.  Tcl_GetB
2e470 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2e480 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
2e490 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d  isAdmin);.  rc =
2e4a0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68   sqlite3_user_ch
2e4b0 61 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20  ange(db, zUser, 
2e4c0 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64  zPasswd, nPasswd
2e4d0 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63  , isAdmin);.  Tc
2e4e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2e4f0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
2e500 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
2e510 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
2e520 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2e530 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
2e540 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2e550 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
2e560 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2e570 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63  ICATION./*.** tc
2e580 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
2e590 73 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53  ser_delete DB US
2e5a0 45 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  ERNAME.*/.static
2e5b0 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 64   int test_user_d
2e5c0 65 6c 65 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  elete(.  ClientD
2e5d0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2e5e0 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2e5f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e600 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2e610 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2e620 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2e630 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2e640 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2e650 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e660 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2e670 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2e680 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2e690 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2e6a0 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
2e6b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
2e6c0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
2e6d0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
2e6e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2e6f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2e700 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d  bjv, "DB USERNAM
2e710 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
2e720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e730 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2e740 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2e750 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2e760 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
2e770 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e780 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
2e790 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2e7a0 5b 32 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  [2]);.  rc = sql
2e7b0 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
2e7c0 28 64 62 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54  (db, zUser);.  T
2e7d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2e7e0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
2e7f0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
2e800 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
2e810 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2e820 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55  ndif /* SQLITE_U
2e830 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2e840 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ON */../*.** tcl
2e850 63 6d 64 3a 20 62 61 64 5f 62 65 68 61 76 69 6f  cmd: bad_behavio
2e860 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20  r TYPE.**.** Do 
2e870 73 6f 6d 65 20 74 68 69 6e 67 73 20 74 68 61 74  some things that
2e880 20 73 68 6f 75 6c 64 20 74 72 69 67 67 65 72 20   should trigger 
2e890 61 20 76 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66  a valgrind or -f
2e8a0 73 61 6e 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e  sanitize=undefin
2e8b0 65 64 0a 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20  ed.** warning.  
2e8c0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
2e8d0 76 65 72 69 66 79 20 74 68 61 74 20 65 72 72 6f  verify that erro
2e8e0 72 73 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  rs and warnings 
2e8f0 6f 75 74 70 75 74 20 62 79 20 74 68 6f 73 65 0a  output by those.
2e900 2a 2a 20 74 6f 6f 6c 73 20 61 72 65 20 64 65 74  ** tools are det
2e910 65 63 74 65 64 20 62 79 20 74 68 65 20 74 65 73  ected by the tes
2e920 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a  t scripts..**.**
2e930 20 20 20 20 20 20 20 54 59 50 45 20 20 20 20 20         TYPE     
2e940 20 20 42 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20    BEHAVIOR.**   
2e950 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 4f      1          O
2e960 76 65 72 66 6c 6f 77 20 61 20 73 69 67 6e 65 64  verflow a signed
2e970 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
2e980 20 20 32 20 20 20 20 20 20 20 20 20 20 4a 75 6d    2          Jum
2e990 70 20 62 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e  p based on an un
2e9a0 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 72 69  initialized vari
2e9b0 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 33 20  able.**       3 
2e9c0 20 20 20 20 20 20 20 20 20 52 65 61 64 20 61 66           Read af
2e9d0 74 65 72 20 66 72 65 65 0a 2a 2a 20 20 20 20 20  ter free.**     
2e9e0 20 20 34 20 20 20 20 20 20 20 20 20 20 50 61 6e    4          Pan
2e9f0 69 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ic.*/.static int
2ea00 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69   test_bad_behavi
2ea10 6f 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  or(.  ClientData
2ea20 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2ea30 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  Pointer to an in
2ea40 74 65 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  teger containing
2ea50 20 7a 65 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49   zero */.  Tcl_I
2ea60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2ea70 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2ea80 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2ea90 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2eaa0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2eab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2eac0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2ead0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2eae0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2eaf0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2eb00 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
2eb10 6e 74 20 69 54 79 70 65 3b 0a 20 20 69 6e 74 20  nt iType;.  int 
2eb20 78 79 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 2a  xyz;.  int i = *
2eb30 28 69 6e 74 2a 29 63 6c 69 65 6e 74 44 61 74 61  (int*)clientData
2eb40 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
2eb50 20 77 5b 31 30 5d 3b 0a 20 20 69 6e 74 20 2a 61   w[10];.  int *a
2eb60 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
2eb70 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2eb80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2eb90 31 2c 20 6f 62 6a 76 2c 20 22 54 59 50 45 22 29  1, objv, "TYPE")
2eba0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2ebb0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2ebc0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2ebd0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2ebe0 5b 31 5d 2c 20 26 69 54 79 70 65 29 20 29 20 72  [1], &iType) ) r
2ebf0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ec00 0a 20 20 73 77 69 74 63 68 28 20 69 54 79 70 65  .  switch( iType
2ec10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
2ec20 7b 0a 20 20 20 20 20 20 78 79 7a 20 3d 20 30 78  {.      xyz = 0x
2ec30 37 66 66 66 66 66 30 30 20 2d 20 69 3b 0a 20 20  7fffff00 - i;.  
2ec40 20 20 20 20 78 79 7a 20 2b 3d 20 30 78 31 30 30      xyz += 0x100
2ec50 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
2ec60 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2ec70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78   Tcl_NewIntObj(x
2ec80 79 7a 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  yz));.      brea
2ec90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
2eca0 65 20 32 3a 20 7b 0a 20 20 20 20 20 20 77 5b 31  e 2: {.      w[1
2ecb0 5d 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28  ] = 5;.      if(
2ecc0 20 77 5b 69 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b   w[i]>0 ) w[1]++
2ecd0 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;.      Tcl_SetO
2ece0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2ecf0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77   Tcl_NewIntObj(w
2ed00 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65  [1]));.      bre
2ed10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
2ed20 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 61 20  se 3: {.      a 
2ed30 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  = malloc( sizeof
2ed40 28 69 6e 74 29 2a 31 30 20 29 3b 0a 20 20 20 20  (int)*10 );.    
2ed50 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b    for(j=0; j<10;
2ed60 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a   j++) a[j] = j;.
2ed70 20 20 20 20 20 20 66 72 65 65 28 61 29 3b 0a 20        free(a);. 
2ed80 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
2ed90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2eda0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 5b 69 5d  l_NewIntObj(a[i]
2edb0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
2edc0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2edd0 34 3a 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 50  4: {.      Tcl_P
2ede0 61 6e 69 63 28 22 44 65 6c 69 62 65 72 61 74 65  anic("Deliberate
2edf0 20 70 61 6e 69 63 22 29 3b 0a 20 20 20 20 20 20   panic");.      
2ee00 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2ee10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2ee20 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;.}  ../*.** tcl
2ee30 63 6d 64 3a 20 20 20 72 65 67 69 73 74 65 72 5f  cmd:   register_
2ee40 64 62 73 74 61 74 5f 76 74 61 62 20 44 42 0a 2a  dbstat_vtab DB.*
2ee50 2a 0a 2a 2a 20 43 61 75 73 65 20 74 68 65 20 64  *.** Cause the d
2ee60 62 73 74 61 74 20 76 69 72 74 75 61 6c 20 74 61  bstat virtual ta
2ee70 62 6c 65 20 74 6f 20 62 65 20 61 76 61 69 6c 61  ble to be availa
2ee80 62 6c 65 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65  ble on the conne
2ee90 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74  ction DB.*/.stat
2eea0 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69  ic int test_regi
2eeb0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
2eec0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2eed0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2eee0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2eef0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2ef00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2ef10 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
2ef20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ef30 4c 45 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  LE.  Tcl_AppendR
2ef40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64  esult(interp, "d
2ef50 62 73 74 61 74 20 6e 6f 74 20 61 76 61 69 6c 61  bstat not availa
2ef60 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 22  ble because of "
2ef70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ef80 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
2ef90 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
2efa0 54 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30  TABLE", (void*)0
2efb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2efc0 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
2efd0 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
2efe0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b   sqlite3 *db; };
2eff0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
2f000 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
2f010 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  nfo;..  if( objc
2f020 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2f030 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2f040 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2f050 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2f060 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2f070 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
2f080 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
2f090 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
2f0a0 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
2f0b0 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
2f0c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64  {.    sqlite3* d
2f0d0 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
2f0e0 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
2f0f0 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
2f100 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
2f110 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
2f120 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
2f130 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  CL_OK;.#endif /*
2f140 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f150 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
2f160 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63  /*.** Register c
2f170 6f 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65  ommands with the
2f180 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2f190 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74  ..*/.int Sqlitet
2f1a0 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
2f1b0 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20  terp *interp){. 
2f1c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2f1d0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
2f1e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2f1f0 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
2f200 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2f210 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
2f220 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
2f230 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  rn int sqlite3_o
2f240 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a  pen_file_count;.
2f250 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2f260 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b  ite3_sort_count;
2f270 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2f280 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2f290 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  me;.#if SQLITE_O
2f2a0 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
2f2b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2f2c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f2d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78  CKING_STYLE.  ex
2f2e0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2f2f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e  _hostid_num;.#en
2f300 64 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  dif.  extern int
2f310 20 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f   sqlite3_max_blo
2f320 62 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20  bsize;.  extern 
2f330 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f340 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
2f350 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20  t(void*,.       
2f360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f380 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69     Tcl_Interp*,i
2f390 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54  nt,Tcl_Obj*CONST
2f3a0 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  *);.  static int
2f3b0 20 69 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 73 74   iZero = 0;.  st
2f3c0 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20  atic struct {.  
2f3d0 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
2f3e0 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63       Tcl_CmdProc
2f3f0 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d   *xProc;.  } aCm
2f400 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
2f410 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20  db_enter",      
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f430 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62  (Tcl_CmdProc*)db
2f440 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20 20 20  _enter          
2f450 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f460 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20  db_leave",      
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f480 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62  (Tcl_CmdProc*)db
2f490 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20 20 20  _leave          
2f4a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f4b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f4c0 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
2f4d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f4e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2f4f0 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  t    },.     { "
2f500 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f510 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
2f520 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f530 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2f540 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  t64  },.     { "
2f550 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f560 6c 6f 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20  long",          
2f570 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f580 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
2f590 6e 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ng   },.     { "
2f5a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f5b0 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  str",           
2f5c0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f5d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2f5e0 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  r    },.     { "
2f5f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f600 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20 20  _str",          
2f610 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f620 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
2f630 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  tr   },.     { "
2f640 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f650 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20  stronly",       
2f660 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f670 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2f680 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22  ronly},.     { "
2f690 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f6a0 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20  double",        
2f6b0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f6c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
2f6d0 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  uble },.     { "
2f6e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f6f0 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20  scaled",        
2f700 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2f710 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
2f720 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22  aled },.     { "
2f730 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f740 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54  hexdouble",   (T
2f750 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2f760 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
2f770 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22  ouble},.     { "
2f780 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
2f790 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  z_test",        
2f7a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2f7b0 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20  st_mprintf_z    
2f7c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2f7d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
2f7e0 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28  _test",        (
2f7f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2f800 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20  t_mprintf_n     
2f810 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2f820 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69  lite3_snprintf_i
2f830 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  nt",          (T
2f840 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2f850 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20  _snprintf_int   
2f860 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2f870 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
2f880 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63  _rowid",     (Tc
2f890 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2f8a0 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20  last_rowid      
2f8b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f8c0 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22  te3_exec_printf"
2f8d0 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ,           (Tcl
2f8e0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
2f8f0 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20  xec_printf      
2f900 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f910 65 33 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20  e3_exec_hex",   
2f920 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f930 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
2f940 65 63 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d  ec_hex         }
2f950 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f960 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20 20 20  3_exec",        
2f970 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f980 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2f990 63 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  c             },
2f9a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2f9b0 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20  _exec_nr",      
2f9c0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2f9d0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
2f9e0 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  _nr          },.
2f9f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2fa00 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20  MIT_GET_TABLE.  
2fa10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65     { "sqlite3_ge
2fa20 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c  t_table_printf",
2fa30 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2fa40 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62  oc*)test_get_tab
2fa50 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e  le_printf },.#en
2fa60 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
2fa70 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20  te3_close",     
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2fa90 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2faa0 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20  _test_close     
2fab0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2fac0 65 33 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20  e3_close_v2",   
2fad0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2fae0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f  CmdProc*)sqlite_
2faf0 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d  test_close_v2  }
2fb00 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2fb10 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2fb20 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
2fb30 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65  mdProc*)test_cre
2fb40 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c  ate_function  },
2fb50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2fb60 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74  _create_aggregat
2fb70 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  e",      (Tcl_Cm
2fb80 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61  dProc*)test_crea
2fb90 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a  te_aggregate },.
2fba0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72       { "sqlite_r
2fbb0 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e  egister_test_fun
2fbc0 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64  ction", (Tcl_Cmd
2fbd0 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73  Proc*)test_regis
2fbe0 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20  ter_func    },. 
2fbf0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62      { "sqlite_ab
2fc00 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ort",           
2fc10 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2fc20 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72  roc*)sqlite_abor
2fc30 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  t          },.  
2fc40 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e     { "sqlite_bin
2fc50 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
2fc60 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2fc70 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20  oc*)test_bind   
2fc80 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fc90 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22    { "breakpoint"
2fca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fcb0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2fcc0 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  c*)test_breakpoi
2fcd0 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  nt       },.    
2fce0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22   { "sqlite3_key"
2fcf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fd00 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2fd10 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20  *)test_key      
2fd20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2fd30 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79  { "sqlite3_rekey
2fd40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2fd50 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2fd60 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20  )test_rekey     
2fd70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2fd80 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67   "sqlite_set_mag
2fd90 69 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ic",            
2fda0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2fdb0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
2fdc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2fdd0 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75  "sqlite3_interru
2fde0 70 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pt",            
2fdf0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2fe00 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20  est_interrupt   
2fe10 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2fe20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75  sqlite_delete_fu
2fe30 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  nction",        
2fe40 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65  (Tcl_CmdProc*)de
2fe50 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20  lete_function   
2fe60 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2fe70 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c  qlite_delete_col
2fe80 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28  lation",       (
2fe90 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c  Tcl_CmdProc*)del
2fea0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20  ete_collation   
2feb0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2fec0 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
2fed0 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20 28 54  mmit",        (T
2fee0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f  cl_CmdProc*)get_
2fef0 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20  autocommit      
2ff00 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2ff10 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22  ite3_stack_used"
2ff20 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ,            (Tc
2ff30 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2ff40 73 74 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20  stack_used      
2ff50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ff60 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
2ff70 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2ff80 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
2ff90 75 73 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20  usy_timeout     
2ffa0 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74  },.     { "print
2ffb0 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  f",             
2ffc0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2ffd0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72  CmdProc*)test_pr
2ffe0 69 6e 74 66 20 20 20 20 20 20 20 20 20 20 20 7d  intf           }
2fff0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30000 33 49 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20  3IoTrace",      
30010 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
30020 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72  Proc*)test_io_tr
30030 61 63 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  ace         },. 
30040 20 20 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e      { "clang_san
30050 69 74 69 7a 65 5f 61 64 64 72 65 73 73 22 2c 20  itize_address", 
30060 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
30070 72 6f 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74  roc*)clang_sanit
30080 69 7a 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20  ize_address },. 
30090 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72   };.  static str
300a0 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20  uct {.     char 
300b0 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c  *zName;.     Tcl
300c0 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72  _ObjCmdProc *xPr
300d0 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63  oc;.     void *c
300e0 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61  lientData;.  } a
300f0 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20  ObjCmd[] = {.   
30100 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76 69 6f    { "bad_behavio
30110 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
30120 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f 62 65       test_bad_be
30130 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29  havior,  (void*)
30140 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b  &iZero },.     {
30150 20 22 72 65 67 69 73 74 65 72 5f 64 62 73 74 61   "register_dbsta
30160 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20 20 20  t_vtab",        
30170 20 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f    test_register_
30180 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a  dbstat_vtab  },.
30190 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
301a0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
301b0 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69  er",    get_sqli
301c0 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c  te_pointer, 0 },
301d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
301e0 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20  _bind_int",     
301f0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
30200 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d  nd_int,      0 }
30210 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30220 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22  3_bind_zeroblob"
30230 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62  ,         test_b
30240 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20  ind_zeroblob, 0 
30250 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30260 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
30270 36 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  64",       test_
30280 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 2c  bind_zeroblob64,
30290 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
302a0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
302b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
302c0 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20  st_bind_int64,  
302d0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
302e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
302f0 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  le",           t
30300 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c  est_bind_double,
30310 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
30320 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
30330 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
30340 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20  test_bind_null  
30350 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
30360 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65  "sqlite3_bind_te
30370 78 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xt",            
30380 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20   test_bind_text 
30390 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
303a0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74   "sqlite3_bind_t
303b0 65 78 74 31 36 22 2c 20 20 20 20 20 20 20 20 20  ext16",         
303c0 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74    test_bind_text
303d0 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  16   ,0 },.     
303e0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
303f0 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
30400 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f     test_bind_blo
30410 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  b     ,0 },.    
30420 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
30430 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
30440 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ",  test_bind_pa
30450 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30  rameter_count, 0
30460 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30470 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
30480 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f  r_name",   test_
30490 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
304a0 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ame,  0},.     {
304b0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
304c0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c  arameter_index",
304d0 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
304e0 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c  meter_index, 0},
304f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30500 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22  _clear_bindings"
30510 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c  ,        test_cl
30520 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d  ear_bindings, 0}
30530 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30540 33 5f 73 6c 65 65 70 22 2c 20 20 20 20 20 20 20  3_sleep",       
30550 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
30560 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 30  leep,          0
30570 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30580 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  e3_errcode",    
30590 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
305a0 65 72 72 63 6f 64 65 20 20 20 20 20 20 20 2c 30  errcode       ,0
305b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
305c0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
305d0 63 6f 64 65 22 2c 20 20 20 20 20 20 74 65 73 74  code",      test
305e0 5f 65 78 5f 65 72 72 63 6f 64 65 20 20 20 20 2c  _ex_errcode    ,
305f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30600 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20 20 20  ite3_errmsg",   
30610 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
30620 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20 20 20  t_errmsg        
30630 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
30640 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 22 2c  lite3_errmsg16",
30650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
30660 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20 20 20  st_errmsg16     
30670 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30680 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20 20 20  qlite3_open",   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
306a0 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20 20 20  est_open        
306b0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
306c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 22 2c  sqlite3_open16",
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306e0 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20 20 20  test_open16     
306f0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
30700 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32  "sqlite3_open_v2
30710 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30720 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 20 20 20   test_open_v2   
30730 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
30740 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65   "sqlite3_comple
30750 74 65 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  te16",          
30760 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31    test_complete1
30770 36 20 20 20 20 2c 30 20 7d 2c 0a 0a 20 20 20 20  6    ,0 },..    
30780 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
30790 61 72 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  are",           
307a0 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
307b0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
307c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65    { "sqlite3_pre
307d0 70 61 72 65 31 36 22 2c 20 20 20 20 20 20 20 20  pare16",        
307e0 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72       test_prepar
307f0 65 31 36 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e16     ,0 },.  
30800 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72     { "sqlite3_pr
30810 65 70 61 72 65 5f 76 32 22 2c 20 20 20 20 20 20  epare_v2",      
30820 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70 61        test_prepa
30830 72 65 5f 76 32 20 20 20 20 2c 30 20 7d 2c 0a 20  re_v2    ,0 },. 
30840 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
30850 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 22 2c  repare_tkt3134",
30860 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
30870 61 72 65 5f 74 6b 74 33 31 33 34 2c 20 30 7d 2c  are_tkt3134, 0},
30880 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30890 5f 70 72 65 70 61 72 65 31 36 5f 76 32 22 2c 20  _prepare16_v2", 
308a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
308b0 65 70 61 72 65 31 36 5f 76 32 20 20 2c 30 20 7d  epare16_v2  ,0 }
308c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
308d0 33 5f 66 69 6e 61 6c 69 7a 65 22 2c 20 20 20 20  3_finalize",    
308e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 66            test_f
308f0 69 6e 61 6c 69 7a 65 20 20 20 20 20 20 2c 30 20  inalize      ,0 
30900 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30910 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 22 2c  e3_stmt_status",
30920 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30930 73 74 6d 74 5f 73 74 61 74 75 73 20 20 20 2c 30  stmt_status   ,0
30940 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30950 74 65 33 5f 72 65 73 65 74 22 2c 20 20 20 20 20  te3_reset",     
30960 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30970 5f 72 65 73 65 74 20 20 20 20 20 20 20 20 20 2c  _reset         ,
30980 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30990 69 74 65 33 5f 65 78 70 69 72 65 64 22 2c 20 20  ite3_expired",  
309a0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
309b0 74 5f 65 78 70 69 72 65 64 20 20 20 20 20 20 20  t_expired       
309c0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
309d0 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
309e0 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 74 65  indings",     te
309f0 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
30a00 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30a10 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 22 2c  qlite3_changes",
30a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
30a30 65 73 74 5f 63 68 61 6e 67 65 73 20 20 20 20 20  est_changes     
30a40 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30a50 73 71 6c 69 74 65 33 5f 73 74 65 70 22 2c 20 20  sqlite3_step",  
30a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30a70 74 65 73 74 5f 73 74 65 70 20 20 20 20 20 20 20  test_step       
30a80 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
30a90 22 73 71 6c 69 74 65 33 5f 73 71 6c 22 2c 20 20  "sqlite3_sql",  
30aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ab0 20 74 65 73 74 5f 73 71 6c 20 20 20 20 20 20 20   test_sql       
30ac0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
30ad0 20 22 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73   "sqlite3_next_s
30ae0 74 6d 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  tmt",           
30af0 20 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74    test_next_stmt
30b00 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
30b10 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
30b20 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20  readonly",      
30b30 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61     test_stmt_rea
30b40 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20  donly ,0 },.    
30b50 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74   { "sqlite3_stmt
30b60 5f 62 75 73 79 22 2c 20 20 20 20 20 20 20 20 20  _busy",         
30b70 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75      test_stmt_bu
30b80 73 79 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  sy     ,0 },.   
30b90 20 20 7b 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a    { "uses_stmt_j
30ba0 6f 75 72 6e 61 6c 22 2c 20 20 20 20 20 20 20 20  ournal",        
30bb0 20 20 20 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a       uses_stmt_j
30bc0 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20  ournal ,0 },..  
30bd0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
30be0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
30bf0 20 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61        test_relea
30c00 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30  se_memory,     0
30c10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30c20 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
30c30 6d 6f 72 79 22 2c 20 20 20 20 20 74 65 73 74 5f  mory",     test_
30c40 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
30c50 79 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  y,  0},.     { "
30c60 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
30c70 66 6c 75 73 68 22 2c 20 20 20 20 20 20 20 20 20  flush",         
30c80 74 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75  test_db_cacheflu
30c90 73 68 2c 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  sh,      0},.   
30ca0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
30cb0 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20 20  filename",      
30cc0 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69 6c       test_db_fil
30cd0 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30 7d  ename,        0}
30ce0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30cf0 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c 20  3_db_readonly", 
30d00 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
30d10 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20 20  b_readonly,     
30d20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
30d30 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70  qlite3_soft_heap
30d40 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 74  _limit",       t
30d50 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
30d60 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20 20  mit,    0},.    
30d70 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72 65   { "sqlite3_thre
30d80 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20 20  ad_cleanup",    
30d90 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64 5f      test_thread_
30da0 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d 2c  cleanup,     0},
30db0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30dc0 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
30dd0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70 61  ",       test_pa
30de0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20 20  ger_refcounts,  
30df0 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73    0},..     { "s
30e00 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
30e10 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 74  nsion",        t
30e20 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  est_load_extensi
30e30 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  on,     0},.    
30e40 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
30e50 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
30e60 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  n", test_enable_
30e70 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d 2c  load,        0},
30e80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30e90 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
30ea0 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65 78  _codes", test_ex
30eb0 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f  tended_result_co
30ec0 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  des, 0},.     { 
30ed0 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22 2c  "sqlite3_limit",
30ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30ef0 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20 20   test_limit,    
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d 2c               0},
30f10 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f 70  ..     { "save_p
30f20 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
30f30 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f 70            save_p
30f40 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30 20  rng_state,    0 
30f50 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74 6f  },.     { "resto
30f60 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  re_prng_state", 
30f70 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74 6f             resto
30f80 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 30  re_prng_state, 0
30f90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 65   },.     { "rese
30fa0 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  t_prng_state",  
30fb0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65              rese
30fc0 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  t_prng_state,   
30fd0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74  0 },.     { "dat
30fe0 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
30ff0 75 70 74 22 2c 20 20 20 20 20 20 20 20 64 61 74  upt",        dat
31000 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
31010 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  upt, 0},.     { 
31020 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65  "database_may_be
31030 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20  _corrupt",      
31040 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65   database_may_be
31050 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20  _corrupt, 0},.  
31060 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69     { "optimizati
31070 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20  on_control",    
31080 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69        optimizati
31090 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23  on_control,0},.#
310a0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
310b0 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69  .     { "lock_wi
310c0 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
310d0 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66           win32_f
310e0 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d  ile_lock,    0 }
310f0 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74 73  ,.     { "exists
31100 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20 20  _win32_path",   
31110 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
31120 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30 20  exists_path,  0 
31130 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64 5f  },.     { "find_
31140 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20  win32_file",    
31150 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
31160 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30  _find_file,    0
31170 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c 65   },.     { "dele
31180 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  te_win32_file", 
31190 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
311a0 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20  2_delete_file,  
311b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b  0 },.     { "mak
311c0 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20  e_win32_dir",   
311d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
311e0 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20 20  32_mkdir,       
311f0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
31200 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c  move_win32_dir",
31210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
31220 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20 20  n32_rmdir,      
31230 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20    0 },.#endif.  
31240 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f     { "tcl_objpro
31250 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
31260 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50 72        runAsObjPr
31270 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a  oc,       0 },..
31280 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
31290 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a  column_*() API *
312a0 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  /.     { "sqlite
312b0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c  3_column_count",
312c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
312d0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20  olumn_count  ,0 
312e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
312f0 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20  e3_data_count", 
31300 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
31310 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30  data_count    ,0
31320 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
31330 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22  te3_column_type"
31340 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
31350 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c  _column_type   ,
31360 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
31370 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
31380 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
31390 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20  t_column_blob   
313a0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
313b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
313c0 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74 65  ble",         te
313d0 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
313e0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
313f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
31400 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 74  t64",          t
31410 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  est_column_int64
31420 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
31430 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31440 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ext",   test_stm
31450 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
31460 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31470 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ext },.     { "s
31480 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
31490 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74  me",   test_stmt
314a0 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73  _utf8,  (void*)s
314b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
314c0 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  me },.     { "sq
314d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
314e0 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f  ",    test_stmt_
314f0 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
31500 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
31510 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31520 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
31530 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 69  s",  test_stmt_i
31540 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c  nt,   (void*)sql
31550 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
31560 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s},.#ifndef SQLI
31570 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
31580 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31590 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
315a0 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
315b0 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
315c0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d  column_decltype}
315d0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
315e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
315f0 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20  LUMN_METADATA.{ 
31600 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
31610 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74  database_name",t
31620 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
31630 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
31640 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
31650 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
31660 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65  olumn_table_name
31670 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  ",test_stmt_utf8
31680 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
31690 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
316a0 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63  e},.{ "sqlite3_c
316b0 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d  olumn_origin_nam
316c0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
316d0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
316e0 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
316f0 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69  ame},.#endif..#i
31700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31710 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
31720 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
31730 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73 74  ytes16", test_st
31740 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73  mt_int, (void*)s
31750 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
31760 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20  tes16 },.     { 
31770 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
31780 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f 73  text16",  test_s
31790 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
317a0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
317b0 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b  _text16},.     {
317c0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
317d0 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74 5f  _name16",  test_
317e0 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
317f0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31800 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20  n_name16},.     
31810 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  { "add_alignment
31820 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
31830 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74  ", add_alignment
31840 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
31850 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e  , 0      },.#ifn
31860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31870 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20  DECLTYPE.     { 
31880 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
31890 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73 74  decltype16",test
318a0 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69  _stmt_utf16,(voi
318b0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
318c0 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23  n_decltype16},.#
318d0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
318e0 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
318f0 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71 6c  N_METADATA.{"sql
31900 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
31910 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20  base_name16",.  
31920 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
31930 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
31940 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
31950 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
31960 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
31970 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74  name16", test_st
31980 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a  mt_utf16, (void*
31990 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
319a0 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b  table_name16},.{
319b0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
319c0 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20  origin_name16", 
319d0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
319e0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
319f0 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
31a00 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65  me16},.#endif.#e
31a10 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
31a20 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
31a30 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f  ation_v2", test_
31a40 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
31a50 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  _v2, 0 },.     {
31a60 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c   "sqlite3_global
31a70 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20 20 74  _recover",     t
31a80 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  est_global_recov
31a90 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  er, 0   },.     
31aa0 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74  { "working_64bit
31ab0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
31ac0 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
31ad0 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
31ae0 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74   { "vfs_unlink_t
31af0 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  est",           
31b00 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
31b10 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
31b20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66 61 69    { "vfs_initfai
31b30 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  l_test",        
31b40 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74    vfs_initfail_t
31b50 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  est,   0   },.  
31b60 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65 67 69     { "vfs_unregi
31b70 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20  ster_all",      
31b80 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65     vfs_unregiste
31b90 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20  r_all,  0   },. 
31ba0 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72 65 67      { "vfs_rereg
31bb0 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20  ister_all",     
31bc0 20 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74      vfs_reregist
31bd0 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a  er_all,  0   },.
31be0 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
31bf0 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20 20 20  trol_test",     
31c00 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f       file_contro
31c10 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c  l_test,   0   },
31c20 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
31c30 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
31c40 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
31c50 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
31c60 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
31c70 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
31c80 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 22  _lockproxy_test"
31c90 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  , file_control_l
31ca0 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c 20 20  ockproxy_test,  
31cb0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
31cc0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
31cd0 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c  ksize_test", fil
31ce0 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
31cf0 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  ize_test,  0   }
31d00 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
31d10 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
31d20 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e  test",  file_con
31d30 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
31d40 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69 66  st,   0   },.#if
31d50 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
31d60 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
31d70 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
31d80 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ry", file_contro
31d90 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
31da0 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
31db0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77   "file_control_w
31dc0 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 22  in32_set_handle"
31dd0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  , file_control_w
31de0 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 2c  in32_set_handle,
31df0 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
31e00 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
31e10 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22 2c  ol_persist_wal",
31e20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c      file_control
31e30 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20 20  _persist_wal,   
31e40 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
31e50 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f  "file_control_po
31e60 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74  wersafe_overwrit
31e70 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  e",file_control_
31e80 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
31e90 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22  ite,0},.     { "
31ea0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
31eb0 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66 69  name",        fi
31ec0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
31ed0 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20 20  me,         0   
31ee0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
31ef0 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
31f00 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f  name",   file_co
31f10 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61  ntrol_tempfilena
31f20 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  me,    0   },.  
31f30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76 66     { "sqlite3_vf
31f40 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20 20  s_list",        
31f50 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20 20     vfs_list,    
31f60 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
31f70 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
31f80 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  unction_v2", tes
31f90 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  t_create_functio
31fa0 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a 20 20 20 20  n_v2, 0 },..    
31fb0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66 72   /* Functions fr
31fc0 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e 64  om os.h */.#ifnd
31fd0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
31fe0 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64 64  TF16.     { "add
31ff0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  _test_collate", 
32000 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 6c         test_coll
32010 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20 20  ate, 0          
32020 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
32030 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
32040 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c 6c  eded", test_coll
32050 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20 20  ate_needed, 0   
32060 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
32070 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  _test_function",
32080 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e 63         test_func
32090 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20 20  tion, 0         
320a0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64    },.     { "add
320b0 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63  _test_utf16bin_c
320c0 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65 73 74  ollate",    test
320d0 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
320e0 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c 0a 23  e, 0        },.#
320f0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
32100 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73 74  lite3_test_errst
32110 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72 72  r",     test_err
32120 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20 20  str, 0          
32130 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 63     },.     { "tc
32140 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 22  l_variable_type"
32150 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72 69  ,       tcl_vari
32160 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20 20  able_type, 0    
32170 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
32180 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
32190 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22 73  _CACHE.     { "s
321a0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
321b0 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65 73  ared_cache", tes
321c0 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 2c  t_enable_shared,
321d0 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   0  },.     { "s
321e0 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63 61  qlite3_shared_ca
321f0 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71 6c  che_report", sql
32200 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64 43  ite3BtreeSharedC
32210 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c 0a  acheReport, 0},.
32220 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
32230 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
32240 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74 5f  n_number", test_
32250 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
32260 72 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  r, 0  },.     { 
32270 22 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63  "sqlite3_table_c
32280 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c  olumn_metadata",
32290 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75   test_table_colu
322a0 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20  mn_metadata, 0  
322b0 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
322c0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
322d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
322e0 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65  blob_reopen", te
322f0 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20  st_blob_reopen, 
32300 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20  0  },.#endif.   
32310 20 20 7b 20 22 70 63 61 63 68 65 5f 73 74 61 74    { "pcache_stat
32320 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  s",       test_p
32330 63 61 63 68 65 5f 73 74 61 74 73 2c 20 30 20 20  cache_stats, 0  
32340 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
32350 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e  _ENABLE_UNLOCK_N
32360 4f 54 49 46 59 0a 20 20 20 20 20 7b 20 22 73 71  OTIFY.     { "sq
32370 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74  lite3_unlock_not
32380 69 66 79 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63  ify", test_unloc
32390 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a  k_notify, 0  },.
323a0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
323b0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
323c0 70 6f 69 6e 74 22 2c 20 20 20 74 65 73 74 5f 77  point",   test_w
323d0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30  al_checkpoint, 0
323e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
323f0 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
32400 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c  int_v2",test_wal
32410 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20  _checkpoint_v2, 
32420 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  0  },.     { "sq
32430 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68  lite3_wal_autoch
32440 65 63 6b 70 6f 69 6e 74 22 2c 74 65 73 74 5f 77  eckpoint",test_w
32450 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
32460 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t, 0  },.     { 
32470 22 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f  "test_sqlite3_lo
32480 67 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  g",         test
32490 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c 20 30 20  _sqlite3_log, 0 
324a0 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
324b0 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
324c0 20 20 20 20 20 7b 20 22 70 72 69 6e 74 5f 65 78       { "print_ex
324d0 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70 6c 61 6e  plain_query_plan
324e0 22 2c 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71  ", test_print_eq
324f0 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  p, 0  },.#endif.
32500 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32510 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22 2c 20 74  test_control", t
32520 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  est_test_control
32530 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   },.#if SQLITE_O
32540 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b 20 22 67  S_UNIX.     { "g
32550 65 74 72 75 73 61 67 65 22 2c 20 74 65 73 74 5f  etrusage", test_
32560 67 65 74 72 75 73 61 67 65 20 7d 2c 0a 23 65 6e  getrusage },.#en
32570 64 69 66 0a 20 20 20 20 20 7b 20 22 6c 6f 61 64  dif.     { "load
32580 5f 73 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  _static_extensio
32590 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74 61 74 69  n", tclLoadStati
325a0 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 20 7d 2c  cExtensionCmd },
325b0 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f  .     { "sorter_
325c0 74 65 73 74 5f 66 61 6b 65 68 65 61 70 22 2c 20  test_fakeheap", 
325d0 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65  sorter_test_fake
325e0 68 65 61 70 20 7d 2c 0a 20 20 20 20 20 7b 20 22  heap },.     { "
325f0 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74  sorter_test_sort
32600 34 5f 68 65 6c 70 65 72 22 2c 20 73 6f 72 74 65  4_helper", sorte
32610 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
32620 70 65 72 20 7d 2c 0a 23 69 66 64 65 66 20 53 51  per },.#ifdef SQ
32630 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
32640 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 20 7b 20  TICATION.     { 
32650 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75  "sqlite3_user_au
32660 74 68 65 6e 74 69 63 61 74 65 22 2c 20 74 65 73  thenticate", tes
32670 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  t_user_authentic
32680 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ate, 0 },.     {
32690 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61   "sqlite3_user_a
326a0 64 64 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  dd",          te
326b0 73 74 5f 75 73 65 72 5f 61 64 64 2c 20 20 20 20  st_user_add,    
326c0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
326d0 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  { "sqlite3_user_
326e0 63 68 61 6e 67 65 22 2c 20 20 20 20 20 20 20 74  change",       t
326f0 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 2c  est_user_change,
32700 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20         0 },.    
32710 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72   { "sqlite3_user
32720 5f 64 65 6c 65 74 65 22 2c 20 20 20 20 20 20 20  _delete",       
32730 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65  test_user_delete
32740 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e  ,       0 },.#en
32750 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
32760 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
32770 41 4e 53 54 41 54 55 53 0a 20 20 20 20 20 7b 20  ANSTATUS.     { 
32780 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63  "sqlite3_stmt_sc
32790 61 6e 73 74 61 74 75 73 22 2c 20 20 20 20 20 20  anstatus",      
327a0 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73   test_stmt_scans
327b0 74 61 74 75 73 2c 20 20 20 30 20 7d 2c 0a 20 20  tatus,   0 },.  
327c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
327d0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
327e0 73 65 74 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  set", test_stmt_
327f0 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74  scanstatus_reset
32800 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a  ,   0 },.#endif.
32810 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
32820 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20 20  ABLE_SQLLOG.    
32830 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 66   { "sqlite3_conf
32840 69 67 5f 73 71 6c 6c 6f 67 22 2c 20 20 20 20 20  ig_sqllog",     
32850 20 20 20 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f      test_config_
32860 73 71 6c 6c 6f 67 2c 20 20 20 30 20 7d 2c 0a 23  sqllog,   0 },.#
32870 65 6e 64 69 66 0a 0a 20 20 7d 3b 0a 20 20 73 74  endif..  };.  st
32880 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
32890 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
328a0 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 73 74 61  itmask)*8;.  sta
328b0 74 69 63 20 69 6e 74 20 6c 6f 6e 67 64 6f 75 62  tic int longdoub
328c0 6c 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  le_size = sizeof
328d0 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
328e0 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65 78  );.  int i;.  ex
328f0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32900 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c  _sync_count, sql
32910 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
32920 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
32930 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65  t sqlite3_opente
32940 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  mp_count;.  exte
32950 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  rn int sqlite3_l
32960 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ike_count;.  ext
32970 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32980 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20  xferopt_count;. 
32990 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
329a0 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62  te3_pager_readdb
329b0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
329c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
329d0 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74  er_writedb_count
329e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
329f0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
32a00 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53  tej_count;.#if S
32a10 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65  QLITE_OS_WIN.  e
32a20 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74  xtern LONG volat
32a30 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ile sqlite3_os_t
32a40 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  ype;.#endif.#ifd
32a50 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
32a60 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
32a70 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a  ite3WhereTrace;.
32a80 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
32a90 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65  ite3OSTrace;.  e
32aa0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
32ab0 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69  3WalTrace;.#endi
32ac0 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
32ad0 54 45 53 54 0a 23 69 66 64 65 66 20 53 51 4c 49  TEST.#ifdef SQLI
32ae0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
32af0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
32b00 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
32b10 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e  parentheses;.#en
32b20 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f  dif.#endif..  fo
32b30 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
32b40 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d  aCmd)/sizeof(aCm
32b50 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
32b60 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61   Tcl_CreateComma
32b70 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b  nd(interp, aCmd[
32b80 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69  i].zName, aCmd[i
32b90 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a  ].xProc, 0, 0);.
32ba0 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
32bb0 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29  <sizeof(aObjCmd)
32bc0 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b  /sizeof(aObjCmd[
32bd0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
32be0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
32bf0 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a  and(interp, aObj
32c00 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  Cmd[i].zName, . 
32c10 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69         aObjCmd[i
32c20 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64  ].xProc, aObjCmd
32c30 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20  [i].clientData, 
32c40 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69  0);.  }.  Tcl_Li
32c50 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
32c60 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75  qlite_search_cou
32c70 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
32c80 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72  r*)&sqlite3_sear
32c90 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ch_count, TCL_LI
32ca0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
32cb0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32cc0 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75  sqlite_found_cou
32cd0 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
32ce0 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e  r*)&sqlite3_foun
32cf0 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  d_count, TCL_LIN
32d00 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
32d10 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
32d20 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74  qlite_sort_count
32d30 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
32d40 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  )&sqlite3_sort_c
32d50 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
32d60 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
32d70 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
32d80 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
32d90 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
32da0 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c  )&sqlite3_max_bl
32db0 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  obsize, TCL_LINK
32dc0 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
32dd0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
32de0 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22  lite_like_count"
32df0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
32e00 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f  &sqlite3_like_co
32e10 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
32e20 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
32e30 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
32e40 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  e_interrupt_coun
32e50 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
32e60 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  *)&sqlite3_inter
32e70 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  rupt_count, TCL_
32e80 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
32e90 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
32ea0 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69   "sqlite_open_fi
32eb0 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  le_count", .    
32ec0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
32ed0 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e  3_open_file_coun
32ee0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
32ef0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
32f00 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
32f10 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a  current_time", .
32f20 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
32f30 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
32f40 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  me, TCL_LINK_INT
32f50 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
32f60 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
32f70 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
32f80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
32f90 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c  KING_STYLE.  Tcl
32fa0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
32fb0 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f   "sqlite_hostid_
32fc0 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28 63 68  num", .      (ch
32fd0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f 73  ar*)&sqlite3_hos
32fe0 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e  tid_num, TCL_LIN
32ff0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
33000 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
33010 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66  erp, "sqlite3_xf
33020 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20  eropt_count",.  
33030 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
33040 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e  te3_xferopt_coun
33050 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
33060 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
33070 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
33080 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
33090 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
330a0 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
330b0 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20  r_readdb_count, 
330c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
330d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
330e0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
330f0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
33100 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
33110 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
33120 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54  writedb_count, T
33130 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
33140 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
33150 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
33160 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22  er_writej_count"
33170 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
33180 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
33190 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  itej_count, TCL_
331a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64  LINK_INT);.#ifnd
331b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
331c0 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  TF16.  Tcl_LinkV
331d0 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c  ar(interp, "unal
331e0 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
331f0 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68  nter",.      (ch
33200 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73  ar*)&unaligned_s
33210 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54  tring_counter, T
33220 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
33230 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
33240 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
33250 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
33260 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73  erp, "sqlite_las
33270 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69  t_needed_collati
33280 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  on",.      (char
33290 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  *)&pzNeededColla
332a0 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tion, TCL_LINK_S
332b0 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52  TRING|TCL_LINK_R
332c0 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69  EAD_ONLY);.#endi
332d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  f.#if SQLITE_OS_
332e0 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  WIN.  Tcl_LinkVa
332f0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
33300 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20 20  e_os_type",.    
33310 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
33320 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c  3_os_type, TCL_L
33330 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69  INK_LONG);.#endi
33340 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
33350 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73 74 61  TEST.  {.    sta
33360 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
33370 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a  query_plan = "**
33380 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52 49 41  * OBSOLETE VARIA
33390 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63  BLE ***";.    Tc
333a0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
333b0 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79 5f  , "sqlite_query_
333c0 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20 28 63  plan",.       (c
333d0 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e  har*)&query_plan
333e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
333f0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
33400 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ONLY);.  }.#endi
33410 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
33420 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b  DEBUG.  Tcl_Link
33430 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
33440 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65 22  ite_where_trace"
33450 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
33460 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
33470 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
33480 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
33490 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
334a0 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  os_trace",.     
334b0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
334c0 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  OSTrace, TCL_LIN
334d0 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
334e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
334f0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
33500 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77 61  terp, "sqlite_wa
33510 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20  l_trace",.      
33520 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57  (char*)&sqlite3W
33530 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e  alTrace, TCL_LIN
33540 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
33550 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
33560 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
33570 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
33580 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
33590 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a  pentemp_count",.
335a0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
335b0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
335c0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
335d0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
335e0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
335f0 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63  , "sqlite_static
33600 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20  _bind_value",.  
33610 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
33620 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
33630 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  alue, TCL_LINK_S
33640 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
33650 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
33660 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
33670 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20 20  d_nbyte",.      
33680 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
33690 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
336a0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
336b0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
336c0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 74  nterp, "sqlite_t
336d0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a  emp_directory",.
336e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
336f0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
33700 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53  tory, TCL_LINK_S
33710 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69  TRING);.  Tcl_Li
33720 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
33730 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72 65 63  qlite_data_direc
33740 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
33750 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64 61 74  ar*)&sqlite3_dat
33760 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  a_directory, TCL
33770 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
33780 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
33790 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69  erp, "bitmask_si
337a0 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ze",.      (char
337b0 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c  *)&bitmask_size,
337c0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43   TCL_LINK_INT|TC
337d0 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
337e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
337f0 28 69 6e 74 65 72 70 2c 20 22 6c 6f 6e 67 64 6f  (interp, "longdo
33800 75 62 6c 65 5f 73 69 7a 65 22 2c 0a 20 20 20 20  uble_size",.    
33810 20 20 28 63 68 61 72 2a 29 26 6c 6f 6e 67 64 6f    (char*)&longdo
33820 75 62 6c 65 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c  uble_size, TCL_L
33830 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b  INK_INT|TCL_LINK
33840 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54  _READ_ONLY);.  T
33850 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
33860 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f  p, "sqlite_sync_
33870 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
33880 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 79  har*)&sqlite3_sy
33890 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nc_count, TCL_LI
338a0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
338b0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
338c0 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f  sqlite_fullsync_
338d0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
338e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 75  har*)&sqlite3_fu
338f0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43  llsync_count, TC
33900 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
33910 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
33920 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26 20  ENABLE_FTS3) && 
33930 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
33940 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  EST).  Tcl_LinkV
33950 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
33960 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  te_fts3_enable_p
33970 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20 20  arentheses",.   
33980 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
33990 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70  e3_fts3_enable_p
339a0 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f  arentheses, TCL_
339b0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
339c0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
339d0 4b 3b 0a 7d 0a                                   K;.}.