/ Hex Artifact Content
Login

Artifact 90c4e80c7f4b0ad82c6dbe699c8f430b641769f5:


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 69 66 28 20 6f  bjv[].){.  if( o
fa30: 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
fa40: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fa50: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
fa60: 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
fa70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
fa80: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
fa90: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
faa0: 4c 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20 20 72  LLOG, 0, 0);.  r
fab0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
fac0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
fad0: 61 67 65 3a 20 76 66 73 5f 63 75 72 72 65 6e 74  age: vfs_current
fae0: 5f 74 69 6d 65 5f 69 6e 74 36 34 0a 2a 2a 0a 2a  _time_int64.**.*
faf0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
fb00: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
fb10: 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 27 73  he default VFS's
fb20: 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
fb30: 36 34 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  64 method..*/.st
fb40: 61 74 69 63 20 69 6e 74 20 76 66 73 43 75 72 72  atic int vfsCurr
fb50: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 0a 20 20  entTimeInt64(.  
fb60: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fb70: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fb80: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fb90: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fba0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fbb0: 20 20 69 36 34 20 74 3b 0a 20 20 73 71 6c 69 74    i64 t;.  sqlit
fbc0: 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73  e3_vfs *pVfs = s
fbd0: 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
fbe0: 30 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0);.  if( objc!=
fbf0: 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  1 ){.    Tcl_Wro
fc00: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
fc10: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
fc20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fc30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 66 73  RROR;.  }.  pVfs
fc40: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
fc50: 74 36 34 28 70 56 66 73 2c 20 26 74 29 3b 0a 20  t64(pVfs, &t);. 
fc60: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
fc70: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
fc80: 77 57 69 64 65 49 6e 74 4f 62 6a 28 74 29 29 3b  wWideIntObj(t));
fc90: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
fca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
fcb0: 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f  :  sqlite3_next_
fcc0: 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a  stmt  DB  STMT.*
fcd0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
fce0: 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e  next statment in
fcf0: 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20   sequence after 
fd00: 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
fd10: 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74  int test_next_st
fd20: 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  mt(.  void * cli
fd30: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
fd40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
fd50: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
fd60: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
fd70: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
fd80: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73  stmt *pStmt;.  s
fd90: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a  qlite3 *db = 0;.
fda0: 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
fdb0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
fdc0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
fdd0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fde0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
fdf0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
fe00: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
fe10: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fe20: 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d  0], 0), " DB STM
fe30: 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
fe40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fe50: 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
fe60: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
fe70: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
fe80: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
fe90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fea0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
feb0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
fec0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
fed0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
fee0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fef0: 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    pStmt = sqlite
ff00: 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20  3_next_stmt(db, 
ff10: 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53  pStmt);.  if( pS
ff20: 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
ff30: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
ff40: 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
ff50: 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
ff60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff70: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
ff80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
ff90: 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
ffa0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ffb0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
ffc0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
ffd0: 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  only  STMT.**.**
ffe0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
fff0: 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20 70  STMT is a NULL p
10000 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69 6e  ointer or a poin
10010 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65  ter to a stateme
10020 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67 75  nt.** that is gu
10030 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61 76  aranteed to leav
10040 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  e the database u
10050 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74  nmodified..*/.st
10060 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74  atic int test_st
10070 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76  mt_readonly(.  v
10080 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10090 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
100a0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
100b0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
100c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
100d0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
100e0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
100f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10100 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10110 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10120 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10130 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10140 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10150 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10160 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
10170 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10180 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
10190 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
101a0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
101b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
101c0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
101d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
101e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
101f0 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74  tmt_readonly(pSt
10200 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  mt);.  Tcl_SetOb
10210 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10220 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
10230 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
10240 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10250 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10260 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54 4d  3_stmt_busy  STM
10270 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
10280 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61  rue if STMT is a
10290 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
102a0 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74  r to a statement
102b0 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
102c0 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e 6f  n stepped but no
102d0 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  t to completion.
102e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
102f0 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a 20  est_stmt_busy(. 
10300 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10310 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
10320 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
10330 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
10340 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10350 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10360 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
10370 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
10380 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10390 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
103a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
103b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
103c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
103d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
103e0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22  [0], 0), " STMT"
103f0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
10400 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10410 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
10420 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10430 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10440 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
10450 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10460 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10470 5f 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d 74  _stmt_busy(pStmt
10480 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
10490 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
104a0 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
104b0 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
104c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
104d0 55 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74 6d  Usage:  uses_stm
104e0 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54 0a  t_journal  STMT.
104f0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
10500 65 20 69 66 20 53 54 4d 54 20 75 73 65 73 20 61  e if STMT uses a
10510 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
10520 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  al..*/.static in
10530 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72  t uses_stmt_jour
10540 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nal(.  void * cl
10550 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10560 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10570 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10580 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10590 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
105a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
105b0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
105c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
105d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
105e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
105f0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10600 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
10610 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
10620 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29   0), " STMT", 0)
10630 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10640 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
10650 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
10660 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10670 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10680 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
10690 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
106a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
106b0 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20  donly(pStmt);.  
106c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
106d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
106e0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64 62  BooleanObj(((Vdb
106f0 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65 73  e *)pStmt)->uses
10700 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20  StmtJournal));. 
10710 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10720 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
10730 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20    sqlite3_reset 
10740 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73   STMT .**.** Res
10750 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68  et a statement h
10760 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
10770 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28   int test_reset(
10780 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10790 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
107a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
107b0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
107c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
107d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
107e0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
107f0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
10800 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
10810 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10820 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
10830 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
10840 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
10850 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10860 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
10870 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
10880 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10890 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
108a0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
108b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
108c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
108d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
108e0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
108f0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
10900 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  t);.  if( pStmt 
10910 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  && sqlite3TestEr
10920 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
10930 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
10940 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
10950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10960 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
10970 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
10980 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
10990 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a   TCL_STATIC);./*
109a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
109b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
109c0 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75  R;.  }.*/.  retu
109d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
109e0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
109f0 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54  te3_expired STMT
10a00 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54   .**.** Return T
10a10 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69  RUE if a recompi
10a20 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
10a30 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d  atement is recom
10a40 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mended..*/.stati
10a50 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69 72  c int test_expir
10a60 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
10a70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10a80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10a90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10aa0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10ab0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
10ac0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
10ad0 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
10ae0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66  tmt *pStmt;.  if
10af0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
10b00 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10b10 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10b20 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10b30 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10b40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10b50 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10b60 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
10b70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10b80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
10b90 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10ba0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10bb0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10bc0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
10bd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
10be0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10bf0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
10c00 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33  oleanObj(sqlite3
10c10 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29  _expired(pStmt))
10c20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
10c30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
10c40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
10c50 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
10c60 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54  dings FROMSTMT T
10c70 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  OSTMT.**.** Tran
10c80 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67  sfer all binding
10c90 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20  s from FROMSTMT 
10ca0 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a  over to TOSTMT.*
10cb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
10cc0 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28  t_transfer_bind(
10cd0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10ce0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10cf0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10d00 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10d10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10d20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
10d30 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
10d40 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  D.  sqlite3_stmt
10d50 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74   *pStmt1, *pStmt
10d60 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  2;.  if( objc!=3
10d70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
10d80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10d90 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
10da0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
10db0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
10dc0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10dd0 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d  [0], 0), " FROM-
10de0 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30  STMT TO-STMT", 0
10df0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10e00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
10e10 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
10e20 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10e30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10e40 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74 75  , &pStmt1)) retu
10e50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10e60 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10e70 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10e80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
10e90 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65 74  ), &pStmt2)) ret
10ea0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10eb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10ec0 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20  t(interp, .     
10ed0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
10ee0 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62  lite3_transfer_b
10ef0 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70  indings(pStmt1,p
10f00 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69 66  Stmt2)));.#endif
10f10 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
10f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
10f30 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  :  sqlite3_chang
10f40 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  es DB.**.** Retu
10f50 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
10f60 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f   changes made to
10f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
10f80 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a   the last SQL.**
10f90 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73   execution..*/.s
10fa0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
10fb0 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a  hanges(.  void *
10fc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
10fd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10fe0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
10ff0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11000 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
11010 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f  te3 *db;.  if( o
11020 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
11030 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11040 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
11050 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
11060 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f  \"",.       Tcl_
11070 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
11080 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
11090 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
110a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
110b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
110c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
110d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
110e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
110f0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
11100 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11110 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
11120 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62  lite3_changes(db
11130 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
11140 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  L_OK;.}../*.** T
11150 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61 74  his is the "stat
11160 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74  ic_bind_value" t
11170 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61 72  hat variables ar
11180 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a  e bound to when.
11190 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69  ** the FLAG opti
111a0 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69  on of sqlite3_bi
111b0 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a  nd is "static".*
111c0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
111d0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
111e0 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61  d_value = 0;.sta
111f0 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73  tic int sqlite_s
11200 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65  tatic_bind_nbyte
11210 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61   = 0;../*.** Usa
11220 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  ge:  sqlite3_bin
11230 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55  d  VM  IDX  VALU
11240 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53  E  FLAGS.**.** S
11250 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ets the value of
11260 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75   the IDX-th occu
11270 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e  rrence of "?" in
11280 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
11290 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41  L.** string.  VA
112a0 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20 76  LUE is the new v
112b0 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  alue.  If FLAGS=
112c0 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c  ="null" then VAL
112d0 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  UE is.** ignored
112e0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69   and the value i
112f0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
11300 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69  If FLAGS=="stati
11310 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  c" then.** the v
11320 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
11330 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
11340 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61  atic variable na
11350 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73  med.** "sqlite_s
11360 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
11370 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e  ".  If FLAGS=="n
11380 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f  ormal" then a co
11390 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c  py.** of the VAL
113a0 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66 20  UE is made.  If 
113b0 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20  FLAGS=="blob10" 
113c0 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73 20  then a VALUE is 
113d0 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20  ignored.** an a 
113e0 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61 62  10-byte blob "ab
113f0 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 20  c\000xyz\000pq" 
11400 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  is inserted..*/.
11410 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
11420 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  bind(.  void *No
11430 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
11440 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
11450 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
11460 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
11470 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
11480 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
11490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114a0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
114b0 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
114c0 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
114d0 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
114e0 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
114f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11500 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
11510 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28    int idx;.  if(
11520 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
11530 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11540 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
11550 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
11560 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
11570 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58  .       " VM IDX
11580 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61   VALUE (null|sta
11590 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20  tic|normal)\"", 
115a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
115b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
115c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
115d0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
115e0 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  1], &pStmt) ) re
115f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11600 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
11610 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
11620 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
11630 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
11640 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
11650 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20  ,"null")==0 ){. 
11660 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11670 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
11680 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69   idx);.  }else i
11690 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
116a0 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29  ],"static")==0 )
116b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
116c0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
116d0 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f  mt, idx, sqlite_
116e0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
116f0 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c  e, -1, 0);.  }el
11700 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
11710 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62  gv[4],"static-nb
11720 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ytes")==0 ){.   
11730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
11740 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
11750 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69  dx, sqlite_stati
11760 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20  c_bind_value,.  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11790 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74       sqlite_stat
117a0 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30  ic_bind_nbyte, 0
117b0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
117c0 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e  trcmp(argv[4],"n
117d0 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  ormal")==0 ){.  
117e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
117f0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
11800 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31  idx, argv[3], -1
11810 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
11820 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  NT);.  }else if(
11830 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
11840 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a  "blob10")==0 ){.
11850 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11860 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
11870 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78  , idx, "abc\000x
11880 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53  yz\000pq", 10, S
11890 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
118a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f   }else{.    Tcl_
118b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
118c0 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65  erp, "4th argume
118d0 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20  nt should be ". 
118e0 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22         "\"null\"
118f0 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f   or \"static\" o
11900 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30  r \"normal\"", 0
11910 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11920 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
11930 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
11940 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
11950 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
11960 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
11970 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
11980 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
11990 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [50];.    sqlite
119a0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
119b0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
119c0 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
119d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
119e0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
119f0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
11a00 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
11a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11a20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
11a30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
11a40 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
11a50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
11a60 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62  test_collate <db
11a70 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74   ptr> <utf8> <ut
11a80 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
11a90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
11aa0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
11ab0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
11ac0 20 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72   selects the cor
11ad0 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a  rect collation.*
11ae0 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62  * sequence callb
11af0 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
11b00 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
11b10 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
11b20 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
11b30 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
11b40 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
11b50 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
11b60 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
11b70 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f  equence "test_co
11b80 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64  llate".** with d
11b90 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
11ba0 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  db>. The second 
11bb0 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
11bc0 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65   a list of three
11bd0 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  .** boolean valu
11be0 65 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74  es. If the first
11bf0 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
11c00 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74   version of test
11c10 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72  _collate is.** r
11c20 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54  egistered for UT
11c30 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f  F-8, if the seco
11c40 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65  nd is true, a ve
11c50 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  rsion is registe
11c60 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31  red for.** UTF-1
11c70 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72  6le, if the thir
11c80 64 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46  d is true, a UTF
11c90 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73  -16be version is
11ca0 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50   available..** P
11cb0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
11cc0 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   of test_collate
11cd0 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a   are deleted..**
11ce0 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f  .** The collatio
11cf0 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f  n sequence test_
11d00 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65  collate is imple
11d10 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e  mented by callin
11d20 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  g the.** followi
11d30 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a  ng TCL script:.*
11d40 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c  *.**   "test_col
11d50 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e  late <enc> <lhs>
11d60 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68   <rhs>".**.** Th
11d70 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73  e <lhs> and <rhs
11d80 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61  > are the two va
11d90 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61  lues being compa
11da0 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20  red, encoded in 
11db0 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65  UTF-8..** The <e
11dc0 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73  nc> parameter is
11dd0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66   the encoding of
11de0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
11df0 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  unction that.** 
11e00 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20  SQLite selected 
11e10 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c  to call. The TCL
11e20 20 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70   test script imp
11e30 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22  lements the.** "
11e40 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72  test_collate" pr
11e50 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  oc..**.** Note t
11e60 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e  hat this will on
11e70 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65  ly work with one
11e80 20 69 6e 74 65 72 70 72 65 74 65 72 20 61 74 20   interpreter at 
11e90 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a  a time, as the.*
11ea0 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72  * interp pointer
11eb0 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61   to use when eva
11ec0 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20  luating the TCL 
11ed0 73 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64  script is stored
11ee0 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c   in.** pTestColl
11ef0 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74  ateInterp..*/.st
11f00 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a  atic Tcl_Interp*
11f10 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
11f20 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  erp;.static int 
11f30 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
11f40 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  c(.  void *pCtx,
11f50 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73   .  int nA, cons
11f60 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e  t void *zA,.  in
11f70 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nB, const void
11f80 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e   *zB.){.  Tcl_In
11f90 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43  terp *i = pTestC
11fa0 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20  ollateInterp;.  
11fb0 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49  int encin = SQLI
11fc0 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43  TE_PTR_TO_INT(pC
11fd0 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  tx);.  int res;.
11fe0 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69    int n;..  sqli
11ff0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
12000 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
12010 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
12020 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63  tringObj("test_c
12030 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20  ollate", -1);.  
12040 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
12050 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28  (pX);..  switch(
12060 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61   encin ){.    ca
12070 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a  se SQLITE_UTF8:.
12080 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
12090 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
120a0 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
120b0 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29  gObj("UTF-8",-1)
120c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
120d0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
120e0 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54  UTF16LE:.      T
120f0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
12100 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
12110 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
12120 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20  TF-16LE",-1));. 
12130 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
12140 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31  case SQLITE_UTF1
12150 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c  6BE:.      Tcl_L
12160 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
12170 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77  ent(i,pX,Tcl_New
12180 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
12190 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  6BE",-1));.     
121a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
121b0 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
121c0 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  t(0);.  }..  sql
121d0 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
121e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20  alloc();.  pVal 
121f0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
12200 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c  w(0);.  if( pVal
12210 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
12220 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
12230 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20   nA, zA, encin, 
12240 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12250 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
12260 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
12270 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
12280 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12290 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63  i,pX,.        Tc
122a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
122b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
122c0 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e  lue_text(pVal),n
122d0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
122e0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
122f0 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20   nB, zB, encin, 
12300 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12310 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f      n = sqlite3_
12320 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c  value_bytes(pVal
12330 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
12340 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12350 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63  i,pX,.        Tc
12360 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
12370 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
12380 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e  lue_text(pVal),n
12390 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ));.    sqlite3V
123a0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
123b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
123c0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
123d0 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
123e0 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63  (i, pX, 0);.  Tc
123f0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
12400 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74  X);.  Tcl_GetInt
12410 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47  FromObj(i, Tcl_G
12420 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20  etObjResult(i), 
12430 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  &res);.  return 
12440 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  res;.}.static in
12450 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a  t test_collate(.
12460 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12470 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12480 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12490 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
124a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
124b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
124c0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71  .  int val;.  sq
124d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
124e0 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
124f0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
12500 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
12510 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
12520 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
12530 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
12540 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12550 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12560 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
12570 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
12580 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
12590 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
125a0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
125b0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
125c0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
125d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
125e0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  llation(db, "tes
125f0 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
12600 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
12610 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
12620 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
12630 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
12640 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
12660 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
12670 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b  ;.    if( TCL_OK
12680 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
12690 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
126a0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
126b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
126c0 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  R;.    rc = sqli
126d0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
126e0 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
126f0 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
12700 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
12710 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
12720 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61  LITE_UTF16LE, va
12730 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
12740 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20  unc:0);.    if( 
12750 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
12760 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
12770 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
12780 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
12790 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a  L_ERROR;..#if 0.
127a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
127b0 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b  iMallocFail>0 ){
127c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
127d0 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20  MallocFail++;.  
127e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
127f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12800 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
12810 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
12820 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
12830 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
12840 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
12850 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
12860 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
12870 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
12880 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65   zUtf16 = sqlite
12890 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
128a0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
128b0 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
128c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
128d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
128e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
128f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
12900 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
12910 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20  collation16(db, 
12920 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55  zUtf16, SQLITE_U
12930 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
12940 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
12950 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74  E_UTF16BE, val?t
12960 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12970 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  :0);.    }.    s
12980 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
12990 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  pVal);.    sqlit
129a0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
129b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
129c0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
129d0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
129e0 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
129f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20   TCL_ERROR;.  . 
12a00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12a10 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
12a20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12a30 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
12a40 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
12a50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12a60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
12a70 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
12a80 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
12a90 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12aa0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12ab0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12ac0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12ad0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12ae0 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
12af0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
12b00 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75  be>", 0);.  retu
12b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
12b20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
12b30 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  d_test_utf16bin_
12b40 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e  collate <db ptr>
12b50 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74 66  .**.** Add a utf
12b60 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  -16 collation se
12b70 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75 74  quence named "ut
12b80 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20 64  f16bin" to the d
12b90 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c  atabase.** handl
12ba0 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f  e. This collatio
12bb0 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70 61  n sequence compa
12bc0 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  res arguments in
12bd0 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
12be0 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e   the.** built-in
12bf0 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61   collation "bina
12c00 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry"..*/.static i
12c10 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e  nt test_utf16bin
12c20 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
12c30 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
12c40 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
12c50 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
12c60 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
12c70 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
12c80 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e   (nA>nB ? nB : n
12c90 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  A);.  int res = 
12ca0 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e  memcmp(zA, zB, n
12cb0 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d  Cmp);.  if( res=
12cc0 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d 20  =0 ) res = nA - 
12cd0 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  nB;.  return res
12ce0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
12cf0 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
12d00 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  late(.  void * c
12d10 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
12d20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12d30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
12d40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
12d50 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
12d60 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
12d70 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
12d80 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
12d90 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
12da0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12db0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12dc0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
12dd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
12de0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
12df0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
12e00 2c 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51  , "utf16bin", SQ
12e10 4c 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a  LITE_UTF16, 0, .
12e20 20 20 20 20 20 20 74 65 73 74 5f 75 74 66 31 36        test_utf16
12e30 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  bin_collate_func
12e40 0a 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  .  );.  if( sqli
12e50 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
12e60 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
12e70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12e80 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
12e90 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20  OK;..bad_args:. 
12ea0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
12eb0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
12ec0 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75  v, "DB");.  retu
12ed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
12ee0 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
12ef0 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64  collation needed
12f00 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76   callback is inv
12f10 6f 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65  oked, record the
12f20 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65   name of .** the
12f30 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
12f40 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65  ting function he
12f50 72 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65  re.  The recorde
12f60 64 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64  d name is linked
12f70 0a 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72  .** to a TCL var
12f80 69 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74  iable and used t
12f90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
12fa0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
12fb0 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  ollation.** name
12fc0 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a   is correct..*/.
12fd0 73 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65  static char zNee
12fe0 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30  dedCollation[200
12ff0 5d 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  ];.static char *
13000 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f  pzNeededCollatio
13010 6e 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  n = zNeededColla
13020 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61  tion;.../*.** Ca
13030 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c  lled when a coll
13040 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  ating sequence i
13050 73 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73  s needed.  Regis
13060 74 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  tered using.** s
13070 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
13080 5f 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a  _needed16()..*/.
13090 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
130a0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f  _collate_needed_
130b0 63 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  cb(.  void *pCtx
130c0 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  , .  sqlite3 *db
130d0 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
130e0 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
130f0 70 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65  pName.){.  int e
13100 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20  nc = ENC(db);.  
13110 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
13120 3b 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61  ;.  for(z = (cha
13130 72 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a  r*)pName, i=0; *
13140 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b  z || z[1]; z++){
13150 0a 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e  .    if( *z ) zN
13160 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69  eededCollation[i
13170 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20  ++] = *z;.  }.  
13180 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
13190 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
131a0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
131b0 69 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ion(.      db, "
131c0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45  test_collate", E
131d0 4e 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49  NC(db), SQLITE_I
131e0 4e 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20  NT_TO_PTR(enc), 
131f0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
13200 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  c);.}../*.** Usa
13210 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ge: add_test_col
13220 6c 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a  late_needed DB.*
13230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
13240 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64  t_collate_needed
13250 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13260 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13270 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13280 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13290 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
132a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
132b0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
132c0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f  if( objc!=2 ) go
132d0 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69  to bad_args;.  i
132e0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
132f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13300 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13310 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
13320 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
13330 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
13340 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30  n_needed16(db, 0
13350 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
13360 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65  eeded_cb);.  zNe
13370 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d  ededCollation[0]
13380 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69   = 0;.  if( sqli
13390 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
133a0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
133b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
133c0 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
133d0 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20  OK;..bad_args:. 
133e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
133f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
13400 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75  v, "DB");.  retu
13410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
13420 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
13430 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74   add_alignment_t
13440 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20  est_collations  
13450 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f  DB.**.** Add two
13460 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73   new collating s
13470 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20  equences to the 
13480 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a  database DB.**.*
13490 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67  *     utf16_alig
134a0 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36  ned.**     utf16
134b0 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a  _unaligned.**.**
134c0 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20   Both collating 
134d0 73 65 71 75 65 6e 63 65 73 20 75 73 65 20 74 68  sequences use th
134e0 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65  e same sort orde
134f0 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20  r as BINARY..** 
13500 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65  The only differe
13510 6e 63 65 20 69 73 20 74 68 61 74 20 74 68 65 20  nce is that the 
13520 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f  utf16_aligned co
13530 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
13540 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65 64 20  nce is declared 
13550 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
13560 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c  UTF16_ALIGNED fl
13570 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c  ag..** Both coll
13580 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20  ating functions 
13590 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e  increment the un
135a0 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f  aligned utf16 co
135b0 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65  unter.** wheneve
135c0 72 20 74 68 65 79 20 73 65 65 20 61 20 73 74 72  r they see a str
135d0 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20  ing that begins 
135e0 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62  on an odd byte b
135f0 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  oundary..*/.stat
13600 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64  ic int unaligned
13610 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20  _string_counter 
13620 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  = 0;.static int 
13630 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e  alignmentCollFun
13640 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
13650 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ed,.  int nKey1,
13660 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
13670 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c  y1,.  int nKey2,
13680 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
13690 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20  y2.){.  int rc, 
136a0 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e  n;.  n = nKey1<n
136b0 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e  Key2 ? nKey1 : n
136c0 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79  Key2;.  if( nKey
136d0 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51  1>0 && 1==(1&(SQ
136e0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
136f0 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c 69  pKey1))) ) unali
13700 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
13710 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65  ter++;.  if( nKe
13720 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53  y2>0 && 1==(1&(S
13730 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
13740 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61 6c  (pKey2))) ) unal
13750 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
13760 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d  nter++;.  rc = m
13770 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
13780 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
13790 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
137a0 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20  nKey1 - nKey2;. 
137b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
137c0 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64  }.static int add
137d0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
137e0 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f  collations(.  vo
137f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13800 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13810 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13820 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13830 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13840 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
13850 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20  f( objc>=2 ){.  
13860 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
13870 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
13880 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
13890 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
138a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
138b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
138c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
138d0 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20  f16_unaligned", 
138e0 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20  SQLITE_UTF16, . 
138f0 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
13900 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
13910 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13920 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
13930 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20  utf16_aligned", 
13940 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
13950 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30  GNED, .        0
13960 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
13970 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unc);.  }.  retu
13980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13990 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
139a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
139b0 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TF16) */../*.** 
139c0 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
139d0 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72  function <db ptr
139e0 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
139f0 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
13a00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13a10 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
13a20 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
13a30 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
13a40 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f   user.** functio
13a50 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  n callback when 
13a60 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
13a70 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
13a80 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
13a90 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
13aa0 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
13ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
13ac0 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68  gisters up to th
13ad0 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
13ae0 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
13af0 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74  n.** "test_funct
13b00 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61  ion" with databa
13b10 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20  se handle <db>. 
13b20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
13b30 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72  rgument is.** tr
13b40 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
13b50 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74  on of test_funct
13b60 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
13b70 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
13b80 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20  the.** third is 
13b90 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
13ba0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
13bb0 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  r UTF-16le, if t
13bc0 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20  he fourth is.** 
13bd0 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65  true, a UTF-16be
13be0 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
13bf0 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73  lable.  Previous
13c00 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20   versions of.** 
13c10 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72  test_function ar
13c20 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
13c30 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   The user functi
13c40 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
13c50 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
13c60 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
13c70 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
13c80 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65  test_function <e
13c90 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a  nc> <arg>".**.**
13ca0 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20   Where <enc> is 
13cb0 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54  one of UTF-8, UT
13cc0 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42  F-16LE or UTF16B
13cd0 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20  E, and <arg> is 
13ce0 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72  the.** single ar
13cf0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
13d00 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
13d10 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
13d20 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  urned by.** the 
13d30 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73  TCL script is us
13d40 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  ed as the return
13d50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51   value of the SQ
13d60 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a  L function. It.*
13d70 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53  * is passed to S
13d80 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d  QLite using UTF-
13d90 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38  16BE for a UTF-8
13da0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
13db0 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61  , UTF-8.** for a
13dc0 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66   UTF-16LE test_f
13dd0 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55  unction(), and U
13de0 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69  TF-16LE for an i
13df0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
13e00 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54  at.** prefers UT
13e10 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64  F-16BE..*/.#ifnd
13e20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
13e30 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
13e40 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
13e50 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tf8(.  sqlite3_c
13e60 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
13e70 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
13e80 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
13e90 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
13ea0 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
13eb0 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
13ec0 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
13ed0 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
13ee0 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
13ef0 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
13f00 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
13f10 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
13f20 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
13f30 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
13f40 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
13f50 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
13f60 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
13f70 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
13f80 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a  ("UTF-8", -1));.
13f90 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13fa0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13fb0 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
13fc0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
13fd0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
13fe0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
13ff0 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
14000 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
14010 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
14020 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
14030 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
14040 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c  t_text(pCtx, Tcl
14050 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
14060 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51  (interp), -1, SQ
14070 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
14080 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
14090 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
140a0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
140b0 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
140c0 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
140d0 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
140e0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
140f0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14100 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14110 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71  ext16be(pCtx, sq
14120 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14130 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16be(pVal),.    
14140 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
14150 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
14160 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
14170 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
14180 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
14190 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65  tf16le(.  sqlite
141a0 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
141b0 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
141c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
141d0 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
141e0 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
141f0 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
14200 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
14210 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
14220 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
14230 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
14240 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
14250 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
14260 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
14270 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
14280 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
14290 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
142a0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
142b0 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
142c0 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20  Obj("UTF-16LE", 
142d0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
142e0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
142f0 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
14300 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
14310 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
14320 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
14330 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
14340 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
14350 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
14360 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
14370 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
14380 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
14390 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
143a0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
143b0 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
143c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
143d0 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
143e0 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
143f0 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
14400 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28  sult_text(pCtx,(
14410 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
14420 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
14430 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
14440 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  NT);.  sqlite3Va
14450 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d  lueFree(pVal);.}
14460 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
14470 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
14480 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  be(.  sqlite3_co
14490 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
144a0 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
144b0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
144c0 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
144d0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
144e0 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
144f0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
14500 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
14510 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
14520 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
14530 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
14540 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
14550 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
14560 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
14570 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
14580 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14590 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
145a0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
145b0 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29  "UTF-16BE", -1))
145c0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
145d0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
145e0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
145f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14600 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
14610 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
14620 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
14630 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
14640 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
14650 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
14660 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
14670 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
14680 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14690 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
146a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
146b0 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
146c0 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
146d0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
146e0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
146f0 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71  _text16(pCtx, sq
14700 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14710 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
14720 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
14730 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
14740 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
14750 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  be(pCtx, sqlite3
14760 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
14770 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
14780 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
14790 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  T);.  sqlite3_re
147a0 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43  sult_text16le(pC
147b0 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
147c0 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29  e_text16le(pVal)
147d0 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
147e0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
147f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
14800 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  e(pVal);.}.#endi
14810 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
14820 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63  _UTF16 */.static
14830 20 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69   int test_functi
14840 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
14850 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
14860 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
14870 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
14880 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
14890 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
148a0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
148b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
148c0 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28   int val;..  if(
148d0 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
148e0 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
148f0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
14900 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
14910 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
14920 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14930 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
14940 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
14950 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
14960 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
14970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14980 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
14990 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
149a0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
149b0 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
149c0 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
149d0 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  F8, .        int
149e0 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
149f0 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a  on_utf8, 0, 0);.
14a00 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
14a10 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
14a20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
14a30 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
14a40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14a50 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
14a60 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14a70 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
14a80 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
14a90 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
14aa0 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  LE, .        int
14ab0 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
14ac0 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30  on_utf16le, 0, 0
14ad0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
14ae0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
14af0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
14b00 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
14b10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14b20 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
14b30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
14b40 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
14b50 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
14b60 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
14b70 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
14b80 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
14b90 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30  ction_utf16be, 0
14ba0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
14bb0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f  urn TCL_OK;.bad_
14bc0 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65  args:.  Tcl_Appe
14bd0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
14be0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
14bf0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
14c00 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
14c10 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
14c20 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75  ], 0), " <DB> <u
14c30 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
14c40 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23  utf16be>", 0);.#
14c50 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14c60 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
14c70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
14c90 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  :         sqlite
14ca0 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65  3_test_errstr <e
14cb0 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54  rr code>.**.** T
14cc0 65 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67  est that the eng
14cd0 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74  lish language st
14ce0 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73  ring equivalents
14cf0 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f   for sqlite erro
14d00 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73  r codes.** are s
14d10 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ane. The paramet
14d20 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  er is an integer
14d30 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
14d40 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
14d50 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  de..** The resul
14d60 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  t is a list of t
14d70 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65  wo elements, the
14d80 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
14d90 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
14da0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
14db0 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67  the english lang
14dc0 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
14dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14de0 74 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76  test_errstr(.  v
14df0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14e00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14e10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14e20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14e30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14e40 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20   char *zCode;.  
14e50 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a  int i;.  if( obj
14e60 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
14e70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
14e80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c  erp, 1, objv, "<
14e90 65 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20  error code>");. 
14ea0 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63   }..  zCode = Tc
14eb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
14ec0 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [1]);.  for(i=0;
14ed0 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20   i<200; i++){.  
14ee0 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
14ef0 74 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20  t1ErrorName(i), 
14f00 7a 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a  zCode) ) break;.
14f10 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73    }.  Tcl_SetRes
14f20 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
14f30 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74  r *)sqlite3ErrSt
14f40 72 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  r(i), 0);.  retu
14f50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
14f60 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72  .** Usage:    br
14f70 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
14f80 68 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73  his routine exis
14f90 74 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f  ts for one purpo
14fa0 73 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20  se - to provide 
14fb0 61 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61  a place to put a
14fc0 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77  .** breakpoint w
14fd0 69 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e  ith GDB that can
14fe0 20 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73   be triggered us
14ff0 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54  ing TCL code.  T
15000 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68  he use.** for th
15010 69 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72  is is when a par
15020 74 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69  ticular test fai
15030 6c 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20  ls on (say) the 
15040 31 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e  1485th iteration
15050 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20  ..** In the TCL 
15060 74 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20  test script, we 
15070 63 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b  can add code lik
15080 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
15090 20 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20    if {$i==1485} 
150a0 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a  breakpoint.**.**
150b0 20 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69   Then run testfi
150c0 78 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62  xture in the deb
150d0 75 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66  ugger and wait f
150e0 6f 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e  or the breakpoin
150f0 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54  t to.** fire.  T
15100 68 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62  hen additional b
15110 72 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62  reakpoints can b
15120 65 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64  e set to trace d
15130 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a  own the bug..*/.
15140 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15150 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f  breakpoint(.  vo
15160 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
15170 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15180 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
15190 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
151a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
151b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
151c0 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
151d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
151e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
151f0 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
15200 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
15210 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
15220 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  /.){.  return TC
15230 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a  L_OK;         /*
15240 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d   Do nothing */.}
15250 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15260 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
15270 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58  roblob  STMT IDX
15280 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
15290 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  e sqlite3_bind_z
152a0 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63  eroblob interfac
152b0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
152c0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
152d0 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20  ..** IDX is the 
152e0 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
152f0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
15300 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
15310 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
15320 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a  binds a N-byte z
15330 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20  ero-filled BLOB 
15340 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
15350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15360 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  est_bind_zeroblo
15370 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  b(.  void * clie
15380 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
15390 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
153a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
153b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
153c0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
153d0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
153e0 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a  t idx;.  int n;.
153f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15400 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
15410 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
15420 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
15430 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b  , "STMT IDX N");
15440 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15450 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
15460 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
15470 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
15480 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
15490 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
154a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
154b0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
154c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
154d0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
154e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
154f0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
15500 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15510 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72  objv[3], &n) ) r
15520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15530 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15540 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70  _bind_zeroblob(p
15550 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20  Stmt, idx, n);. 
15560 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15570 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15580 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
15590 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
155a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
155b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
155c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
155d0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
155e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
155f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
15600 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
15610 6c 6f 62 36 34 20 20 53 54 4d 54 20 49 44 58 20  lob64  STMT IDX 
15620 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
15630 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
15640 72 6f 62 6c 6f 62 36 34 20 69 6e 74 65 72 66 61  roblob64 interfa
15650 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15660 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15670 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65  t..** IDX is the
15680 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15690 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
156a0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
156b0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
156c0 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20   binds a N-byte 
156d0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42  zero-filled BLOB
156e0 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
156f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15700 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
15710 6f 62 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  ob64(.  void * c
15720 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
15730 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
15740 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
15750 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
15760 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
15770 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
15780 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20   int idx;.  i64 
15790 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
157a0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
157b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
157c0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
157d0 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
157e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
157f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15800 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
15810 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15820 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15830 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
15840 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15850 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
15860 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15870 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
15880 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15890 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
158a0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
158b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
158c0 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
158d0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
158e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
158f0 6f 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69  oblob64(pStmt, i
15900 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
15910 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
15920 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
15930 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
15940 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15950 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15960 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
15970 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
15980 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
15990 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
159a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
159b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
159c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
159d0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
159e0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54  te3_bind_int  ST
159f0 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
15a00 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15a10 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72  3_bind_int inter
15a20 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
15a30 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
15a40 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
15a50 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
15a60 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
15a70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
15a80 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
15a90 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20   binds a 32-bit 
15aa0 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
15ab0 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
15ac0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
15ad0 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76  st_bind_int(.  v
15ae0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15af0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15b00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15b10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15b20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15b30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15b40 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15b50 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20  .  int value;.  
15b60 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
15b70 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
15b80 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
15b90 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
15ba0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
15bb0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
15bc0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
15bd0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
15be0 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
15bf0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
15c00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15c10 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
15c20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
15c30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15c40 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
15c50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15c60 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
15c70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15c80 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
15c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15ca0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
15cb0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
15cc0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
15cd0 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ue) ) return TCL
15ce0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
15cf0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
15d00 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
15d10 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
15d20 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
15d30 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
15d40 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
15d50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15d60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15d70 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
15d80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
15d90 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15da0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
15db0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
15dc0 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20  d_int64  STMT N 
15dd0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
15de0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
15df0 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63  d_int64 interfac
15e00 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
15e10 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15e20 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
15e30 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15e40 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15e50 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15e60 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
15e70 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
15e80 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
15e90 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
15ea0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
15eb0 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f  bind_int64(.  vo
15ec0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15ed0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15ee0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15ef0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15f00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15f10 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
15f20 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
15f30 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61    Tcl_WideInt va
15f40 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lue;.  int rc;..
15f50 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
15f60 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
15f70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
15f80 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
15f90 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
15fa0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
15fb0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
15fc0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
15fd0 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  ALUE", 0);.    r
15fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15ff0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16000 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16010 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16020 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16030 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16040 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16050 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16060 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16070 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16080 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16090 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
160a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
160b0 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
160c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
160d0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
160e0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53  e3_bind_int64(pS
160f0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
16100 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
16110 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
16120 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
16130 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
16140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
16150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16160 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
16170 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16180 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16190 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .../*.** Usage: 
161a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
161b0 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41  ouble  STMT N VA
161c0 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
161d0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
161e0 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65  double interface
161f0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
16200 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
16210 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
16220 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
16230 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
16240 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
16250 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
16260 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
16270 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
16280 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
16290 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
162a0 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ind_double(.  vo
162b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
162c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
162d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
162e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
162f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
16300 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16310 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
16320 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20 3d    double value =
16330 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
16340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
16350 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
16360 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
16370 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
16380 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
16390 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
163a0 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
163b0 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
163c0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
163d0 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
163e0 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
163f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
16400 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
16410 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
16420 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
16430 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
16440 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
16450 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
16460 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
16470 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
16480 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
16490 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
164a0 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
164b0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
164c0 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
164d0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
164e0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
164f0 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
16500 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
16510 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
16520 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
16530 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
16540 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
16550 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
16560 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
16570 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
16580 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
16590 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
165a0 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
165b0 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
165c0 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
165d0 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
165e0 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
165f0 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
16600 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
16610 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16620 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16630 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16640 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16650 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16660 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
16670 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
16680 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16690 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
166a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
166b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
166c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
166d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
166e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
166f0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16700 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16710 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16730 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
16740 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
16750 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
16760 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
16770 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
16780 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
16790 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
167a0 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
167b0 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
167c0 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
167d0 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
167e0 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
167f0 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
16800 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
16810 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
16820 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
16830 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
16840 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
16850 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
16860 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
16870 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
16880 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
16890 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
168a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
168b0 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
168c0 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
168d0 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
168e0 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
168f0 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
16900 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
16910 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
16920 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
16930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
16940 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
16950 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
16960 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
16970 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16980 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
16990 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
169a0 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
169b0 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
169c0 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
169d0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
169e0 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
169f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16a00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
16a10 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
16a20 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
16a30 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
16a40 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
16a50 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
16a60 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
16a70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16a80 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
16a90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16aa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ab0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
16ac0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16ad0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16ae0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
16af0 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
16b00 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
16b10 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
16b20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16b30 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16b40 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16b50 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16b60 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16b70 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16b80 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16b90 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
16ba0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
16bb0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16bc0 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
16bd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16be0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16bf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16c00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16c10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16c20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16c30 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16c40 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
16c50 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
16c60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16c70 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16c80 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16c90 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16ca0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16cb0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16cc0 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
16cd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ce0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
16cf0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
16d00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16d10 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
16d20 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16d30 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16d40 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16d50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16d60 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16d70 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
16d80 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
16d90 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
16da0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16db0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16dc0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16dd0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16de0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16df0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16e00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16e10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16e20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16e30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
16e40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16e50 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
16e60 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
16e70 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
16e80 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
16e90 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
16ea0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
16eb0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
16ec0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
16ed0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
16ee0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
16ef0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
16f00 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
16f10 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
16f20 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
16f30 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
16f40 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
16f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16f60 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76  t_bind_text(.  v
16f70 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16f80 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16f90 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16fa0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16fb0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16fc0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16fd0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16fe0 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
16ff0 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
17000 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
17010 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
17020 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17030 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
17040 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
17050 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
17060 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
17070 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
17080 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54  STMT N VALUE BYT
17090 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ES", 0);.    ret
170a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
170b0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
170c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
170d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
170e0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
170f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17100 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
17110 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
17120 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
17130 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
17140 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
17150 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
17160 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
17170 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73  (objv[3], &bytes
17180 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
17190 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
171a0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
171b0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
171c0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
171d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
171e0 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
171f0 6c 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49  lue, bytes, SQLI
17200 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
17210 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
17220 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
17230 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
17240 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
17250 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
17260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17270 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
17280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
17290 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
172a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
172b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
172c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
172d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
172e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
172f0 74 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f  text16 ?-static?
17300 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
17310 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
17320 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
17330 5f 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63  _text16 interfac
17340 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17350 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17360 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
17370 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
17380 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
17390 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
173a0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
173b0 6e 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72  nds a UTF-16 str
173c0 69 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68  ing STRING to th
173d0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
173e0 20 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53   string is BYTES
173f0 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a   bytes.** long..
17400 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17410 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a  st_bind_text16(.
17420 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17430 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17440 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17450 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17460 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17470 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
17480 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
17490 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
174a0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
174b0 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
174c0 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
174d0 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44  rc;..  void (*xD
174e0 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62  el)(void*) = (ob
174f0 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41  jc==6?SQLITE_STA
17500 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53  TIC:SQLITE_TRANS
17510 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a  IENT);.  Tcl_Obj
17520 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a   *oStmt    = obj
17530 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c  v[objc-4];.  Tcl
17540 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d  _Obj *oN       =
17550 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20   objv[objc-3];. 
17560 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e   Tcl_Obj *oStrin
17570 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32  g  = objv[objc-2
17580 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42  ];.  Tcl_Obj *oB
17590 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  ytes   = objv[ob
175a0 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  jc-1];..  if( ob
175b0 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36  jc!=5 && objc!=6
175c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
175d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
175e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
175f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
17600 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
17610 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
17620 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
17630 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30   VALUE BYTES", 0
17640 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17650 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17660 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17670 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17680 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c  etString(oStmt),
17690 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
176a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
176b0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
176c0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c  mObj(interp, oN,
176d0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
176e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
176f0 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
17700 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
17710 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b  Obj(oString, 0);
17720 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17730 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
17740 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29   oBytes, &bytes)
17750 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17760 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
17770 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
17780 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f  (pStmt, idx, (vo
17790 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65  id *)value, byte
177a0 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20  s, xDel);.  if( 
177b0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
177c0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
177d0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
177e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
177f0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17800 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
17810 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
17820 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45  interp, sqlite3E
17830 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  rrName(rc), 0);.
17840 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17850 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69  RROR;.  }..#endi
17860 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
17870 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
17880 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17890 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
178a0 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f  ite3_bind_blob ?
178b0 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20  -static? STMT N 
178c0 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  DATA BYTES.**.**
178d0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
178e0 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65  3_bind_blob inte
178f0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17900 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17910 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
17920 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
17930 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
17940 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17950 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
17960 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74  * binds a BLOB t
17970 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
17980 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54   The BLOB is BYT
17990 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ES bytes in size
179a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
179b0 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a  test_bind_blob(.
179c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
179d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
179e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
179f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17a00 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17a10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17a20 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
17a30 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
17a40 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
17a50 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17a60 74 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74  te3_destructor_t
17a70 79 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20  ype xDestructor 
17a80 3d 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  = SQLITE_TRANSIE
17a90 4e 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  NT;..  if( objc!
17aa0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b  =5 && objc!=6 ){
17ab0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17ac0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17ad0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17ae0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
17af0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17b00 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
17b10 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44  , 0), " STMT N D
17b20 41 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  ATA BYTES", 0);.
17b30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17b40 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17b50 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20   objc==6 ){.    
17b60 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51  xDestructor = SQ
17b70 4c 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20  LITE_STATIC;.   
17b80 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20   objv++;.  }..  
17b90 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17ba0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17bb0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17bc0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17bd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17be0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17bf0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17c00 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17c10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17c20 3b 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f  ;.  value = Tcl_
17c30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
17c40 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
17c50 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
17c60 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79  rp, objv[4], &by
17c70 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
17c80 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17c90 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
17ca0 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76  ob(pStmt, idx, v
17cb0 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
17cc0 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28  structor);.  if(
17cd0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
17ce0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
17cf0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
17d00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17d10 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
17d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17d40 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17d50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17d60 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
17d70 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
17d80 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a  _count  STMT.**.
17d90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
17da0 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64  mber of wildcard
17db0 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73  s in the given s
17dc0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
17dd0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17de0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
17df0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
17e00 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17e10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17e20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17e30 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17e40 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17e50 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
17e60 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
17e70 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17e80 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17e90 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17eb0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17ec0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17ed0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17ee0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17ef0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17f00 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
17f10 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
17f20 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
17f30 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  (sqlite3_bind_pa
17f40 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53  rameter_count(pS
17f50 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
17f60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17f70 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17f80 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
17f90 72 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a  r_name  STMT  N.
17fa0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
17fb0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68   name of the Nth
17fc0 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17fd0 66 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69  first wildcard i
17fe0 73 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79  s 1..** An empty
17ff0 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72   string is retur
18000 6e 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20  ned if N is out 
18010 6f 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74  of range or if t
18020 68 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69  he wildcard.** i
18030 73 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73  s nameless..*/.s
18040 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
18050 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
18060 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
18070 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18080 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18090 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
180a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
180b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
180c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
180d0 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  nt i;..  if( obj
180e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
180f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
18100 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
18110 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  TMT N");.    ret
18120 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18130 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
18140 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18150 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18160 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
18170 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18180 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
18190 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
181a0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29  rp, objv[2], &i)
181b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
181c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
181d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
181e0 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  .     Tcl_NewStr
181f0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62  ingObj(sqlite3_b
18200 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
18210 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a  me(pStmt,i),-1).
18220 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
18230 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18240 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18250 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
18260 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45  ndex  STMT  NAME
18270 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
18280 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77  e index of the w
18290 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e  ildcard called N
182a0 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69  AME.  Return 0 i
182b0 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
182c0 20 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a   such wildcard..
182d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
182e0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
182f0 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
18300 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18320 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18330 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18340 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18350 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
18360 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
18370 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
18380 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
18390 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
183a0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
183b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
183c0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
183d0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
183e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
183f0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18410 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
18420 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
18430 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
18440 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
18450 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18460 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
18470 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18480 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
18490 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
184a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
184b0 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
184c0 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
184d0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
184e0 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
184f0 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ings(.  void * c
18500 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18510 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18520 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18530 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18540 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18550 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
18560 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
18570 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
18580 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
18590 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
185a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
185b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
185c0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
185d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
185e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
185f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
18600 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
18610 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18620 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
18630 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61  Obj(sqlite3_clea
18640 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
18650 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18660 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18670 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18680 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e  sleep MILLISECON
18690 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DS.*/.static int
186a0 20 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76   test_sleep(.  v
186b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
186c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
186d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
186e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
186f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18700 20 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20   int ms;..  if( 
18710 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18720 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18730 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
18740 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
18750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
18760 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
18770 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18780 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18790 5b 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20  [1], &ms) ){.   
187a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
187b0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
187c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
187d0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
187e0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73  sqlite3_sleep(ms
187f0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
18800 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18810 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78  sage: sqlite3_ex
18820 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44  tended_errcode D
18830 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
18840 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
18850 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18860 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18870 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
18880 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
18890 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
188a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
188b0 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76  _ex_errcode(.  v
188c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
188d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
188e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
188f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18900 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
18910 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
18920 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
18930 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18940 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18950 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18960 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18970 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18980 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18990 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
189a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
189b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
189c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
189d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
189e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
189f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18a00 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
18a10 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
18a20 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c  rcode(db);.  Tcl
18a30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18a40 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
18a50 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
18a60 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18a70 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
18a80 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72  age: sqlite3_err
18a90 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
18aa0 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
18ab0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
18ac0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
18ad0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
18ae0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
18af0 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
18b00 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
18b10 74 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a  t test_errcode(.
18b20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18b30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18b40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18b50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18b60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18b70 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18b80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18b90 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18ba0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18bb0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
18bc0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
18bd0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
18be0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18bf0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
18c00 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18c10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
18c20 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
18c30 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18c40 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18c50 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
18c60 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
18c70 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
18c80 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
18c90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18ca0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
18cb0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
18cc0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18cd0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18ce0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44  sqlite3_errmsg D
18cf0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  B.**.** Returns 
18d00 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65 73  the UTF-8 repres
18d10 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
18d20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
18d30 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
18d40 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
18d50 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a  te3_* API call..
18d60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
18d70 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
18d80 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18d90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18da0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18db0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18dc0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18dd0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18de0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
18df0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18e00 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18e10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18e20 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18e30 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18e40 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18e50 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
18e60 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
18e70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18e80 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
18e90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18ea0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18eb0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
18ed0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
18ee0 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
18ef0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
18f00 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
18f10 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
18f20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18f30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18f40 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
18f50 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
18f60 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
18f70 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18f80 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
18f90 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
18fa0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
18fb0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18fc0 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
18fd0 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
18fe0 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
18ff0 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
19000 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
19010 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
19020 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
19030 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
19040 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
19050 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
19060 72 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20  rrmsg16(.  void 
19070 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
19080 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19090 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
190a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
190b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
190c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
190d0 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
190e0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
190f0 20 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20   *zErr;.  const 
19100 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62  char *z;.  int b
19110 79 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28  ytes = 0;..  if(
19120 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
19130 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19140 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
19150 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
19160 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
19170 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
19180 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29  v[0]), " DB", 0)
19190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
191a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
191b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
191c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
191d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
191e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
191f0 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20  _ERROR;..  zErr 
19200 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
19210 31 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45  16(db);.  if( zE
19220 72 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45  rr ){.    z = zE
19230 72 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65  rr;.    for(byte
19240 73 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c  s=0; z[bytes] ||
19250 20 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74   z[bytes+1]; byt
19260 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54  es+=2){}.  }.  T
19270 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
19280 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
19290 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72  yteArrayObj(zErr
192a0 2c 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69  , bytes));.#endi
192b0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
192c0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
192d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
192e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
192f0 65 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71  e3_prepare DB sq
19300 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
19310 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
19320 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
19330 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
19340 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
19350 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
19360 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
19370 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
19380 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
19390 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
193a0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
193b0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
193c0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
193d0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
193e0 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
193f0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
19400 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
19410 20 74 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20   test_prepare(. 
19420 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
19430 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19440 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19450 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19460 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19470 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
19480 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
19490 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  ql;.  int bytes;
194a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
194b0 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  Tail = 0;.  sqli
194c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
194d0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
194e0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
194f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
19500 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
19510 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19520 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19530 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19540 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
19550 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19560 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
19570 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
19580 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
195a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
195b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
195c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
195d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
195e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
195f0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
19600 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
19610 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19620 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19630 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
19640 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19650 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
19660 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a  e3_prepare(db, z
19670 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
19680 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
19690 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c  Tail : 0);.  Tcl
196a0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
196b0 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
196c0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
196d0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
196e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
196f0 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26  R;.  if( zTail &
19700 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  & objc>=5 ){.   
19710 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b   if( bytes>=0 ){
19720 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 62  .      bytes = b
19730 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61  ytes - (int)(zTa
19740 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a  il-zSql);.    }.
19750 20 20 20 20 69 66 28 20 28 69 6e 74 29 73 74 72      if( (int)str
19760 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73  len(zTail)<bytes
19770 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
19780 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  = (int)strlen(zT
19790 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ail);.    }.    
197a0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
197b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
197c0 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
197d0 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
197e0 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
197f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19800 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
19810 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
19820 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
19830 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
19840 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
19850 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
19870 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
19880 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
19890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
198a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
198b0 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
198c0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
198d0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
198e0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
198f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19900 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19910 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
19920 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
19930 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19940 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
19950 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
19960 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
19970 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
19980 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
19990 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
199a0 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
199b0 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
199c0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
199d0 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
199e0 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
199f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
19a00 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
19a10 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
19a20 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
19a30 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
19a40 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
19a50 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
19a60 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
19a70 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
19a80 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
19a90 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19aa0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19ab0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19ac0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19ad0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19ae0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19af0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
19b00 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20 20  ar *zCopy = 0;  
19b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b20 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20 6f   malloc() copy o
19b30 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74 20  f zSql */.  int 
19b40 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
19b50 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
19b60 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19b70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
19b80 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e  r zBuf[50];.  in
19b90 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
19ba0 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
19bb0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19bc0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19bd0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19be0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19bf0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19c00 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19c10 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69  DB sql bytes tai
19c20 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72  lvar", 0);.    r
19c30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19c40 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19c50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19c60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19c70 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19c80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19c90 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
19ca0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
19cb0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
19cc0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
19cd0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
19ce0 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
19cf0 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73  ERROR;..  /* Ins
19d00 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53  tead of using zS
19d10 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b  ql directly, mak
19d20 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20  e a copy into a 
19d30 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a  buffer obtained.
19d40 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72    ** directly fr
19d50 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65  om malloc(). The
19d60 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65   idea is to make
19d70 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20 76   it easier for v
19d80 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20  algrind.  ** to 
19d90 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72  spot buffer over
19da0 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  reads.  */.  if(
19db0 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
19dc0 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28   zCopy = malloc(
19dd0 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63  bytes);.    memc
19de0 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
19df0 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  bytes);.  }else{
19e00 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  .    int n = (in
19e10 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b  t)strlen(zSql) +
19e20 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20   1;.    zCopy = 
19e30 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d  malloc(n);.    m
19e40 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71  emcpy(zCopy, zSq
19e50 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 63 20  l, n);.  }.  rc 
19e60 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
19e70 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c 20  e_v2(db, zCopy, 
19e80 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
19e90 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
19ea0 3a 20 30 29 3b 0a 20 20 66 72 65 65 28 7a 43 6f  : 0);.  free(zCo
19eb0 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20 26  py);.  zTail = &
19ec0 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a 43  zSql[(zTail - zC
19ed0 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72 74  opy)];..  assert
19ee0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
19ef0 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54  | pStmt==0);.  T
19f00 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
19f10 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
19f20 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
19f30 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
19f40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19f50 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ROR;.  if( rc==S
19f60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61 69  QLITE_OK && zTai
19f70 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a  l && objc>=5 ){.
19f80 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30      if( bytes>=0
19f90 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
19fa0 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28  = bytes - (int)(
19fb0 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20  zTail-zSql);.   
19fc0 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
19fd0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
19fe0 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
19ff0 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
1a000 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
1a010 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
1a020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1a030 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1a040 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1a050 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1a060 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20  f), zBuf, "(%d) 
1a070 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
1a080 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a090 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
1a0a0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
1a0b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a0c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a0d0 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1a0e0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a0f0 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1a100 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1a110 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1a120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
1a130 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a140 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1a150 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1a160 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a170 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1a180 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a  are_tkt3134 DB.*
1a190 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1a1a0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1a1b0 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79  nt for a zero-by
1a1c0 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 74  te string as a t
1a1d0 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65  est.** for ticke
1a1e0 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73 74  t #3134.  The st
1a1f0 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70  ring should be p
1a200 72 65 63 65 64 65 64 20 62 79 20 61 20 7a 65 72  receded by a zer
1a210 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o byte..*/.stati
1a220 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
1a230 72 65 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f  re_tkt3134(.  vo
1a240 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a250 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a260 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a270 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a280 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a290 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73  sqlite3 *db;.  s
1a2a0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1a2b0 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53   zSql[] = "\000S
1a2c0 45 4c 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69  ELECT 1";.  sqli
1a2d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1a2e0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1a2f0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
1a300 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1a310 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a320 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a330 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a340 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1a350 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1a360 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1a370 42 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c  B sql bytes tail
1a380 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  var", 0);.    re
1a390 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a3a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1a3b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1a3c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a3d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1a3e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a3f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1a400 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a  repare_v2(db, &z
1a410 53 71 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d  Sql[1], 0, &pStm
1a420 74 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t, 0);.  assert(
1a430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1a440 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66   pStmt==0);.  if
1a450 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1a460 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1a470 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1a480 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1a490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a4a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
1a4b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
1a4c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1a4d0 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
1a4e0 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
1a4f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a500 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a510 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1a520 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
1a530 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a540 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1a550 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1a560 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1a570 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1a580 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1a590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a5a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a5b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1a5c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1a5d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a5e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1a5f0 65 33 5f 70 72 65 70 61 72 65 31 36 20 44 42 20  e3_prepare16 DB 
1a600 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
1a610 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  r.**.** Compile 
1a620 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
1a630 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
1a640 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
1a650 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
1a660 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
1a670 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
1a680 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
1a690 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
1a6a0 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
1a6b0 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
1a6c0 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
1a6d0 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
1a6e0 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
1a6f0 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
1a700 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1a710 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 28   test_prepare16(
1a720 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1a730 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1a740 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1a750 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1a760 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1a770 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1a780 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1a790 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1a7a0 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1a7b0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1a7c0 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1a7d0 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1a7e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1a7f0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1a800 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1a810 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1a820 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1a830 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1a840 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1a850 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1a860 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1a870 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1a880 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1a890 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1a8a0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1a8b0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1a8c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a8d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a8e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1a8f0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1a900 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1a910 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1a920 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1a930 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a940 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1a950 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1a960 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1a970 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1a980 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a990 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1a9a0 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1a9b0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1a9c0 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1a9d0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1a9e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1a9f0 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1aa00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1aa10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1aa20 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c  epare16(db, zSql
1aa30 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1aa40 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1aa50 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1aa60 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1aa70 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1aa80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1aa90 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1aaa0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1aab0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1aac0 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1aad0 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1aae0 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1aaf0 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1ab00 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1ab10 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1ab20 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1ab30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1ab40 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1ab50 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1ab60 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1ab70 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1ab80 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1ab90 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1aba0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1abb0 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1abc0 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1abd0 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1abe0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1abf0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1ac00 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1ac10 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1ac20 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1ac30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1ac40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ac50 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1ac60 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1ac70 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1ac80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ac90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1aca0 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1acb0 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79  e16_v2 DB sql by
1acc0 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a  tes ?tailvar?.**
1acd0 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
1ace0 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
1acf0 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1ad00 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
1ad10 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
1ad20 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20  se handle <DB>. 
1ad30 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74  The parameter <t
1ad40 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e  ailval> is the n
1ad50 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a  ame of a global.
1ad60 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61 74  ** variable that
1ad70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 75   is set to the u
1ad80 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66  nused portion of
1ad90 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e   <sql> (if any).
1ada0 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c   A.** STMT handl
1adb0 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
1adc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1add0 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a  t_prepare16_v2(.
1ade0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1adf0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ae00 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ae10 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ae20 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ae30 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1ae40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1ae50 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1ae60 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20  st void *zSql;. 
1ae70 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61   const void *zTa
1ae80 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  il = 0;.  Tcl_Ob
1ae90 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20  j *pTail = 0;.  
1aea0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1aeb0 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1aec0 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74  zBuf[50]; .  int
1aed0 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   rc;.  int bytes
1aee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aef0 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
1af00 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
1af10 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
1af20 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1af30 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
1af40 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
1af50 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
1af60 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1af70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1af80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1af90 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1afa0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1afb0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1afc0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1afd0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1afe0 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
1aff0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b000 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1b010 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1b020 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1b030 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1b040 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b050 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
1b060 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1b070 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
1b080 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
1b090 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1b0a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1b0b0 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
1b0c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1b0d0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1b0e0 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53  pare16_v2(db, zS
1b0f0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1b100 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1b110 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1b120 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1b130 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1b140 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1b150 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1b160 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1b170 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1b180 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1b190 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1b1a0 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1b1b0 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75  bjlen - (int)((u
1b1c0 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1b1d0 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1b1e0 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1b1f0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1b200 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1b210 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1b220 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1b230 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1b240 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1b250 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1b260 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1b270 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1b280 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1b290 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1b2a0 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1b2b0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1b2c0 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1b2d0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1b2e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1b2f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1b300 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b310 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b320 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1b330 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1b340 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1b350 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b360 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1b370 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f   filename ?optio
1b380 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74  ns-list?.*/.stat
1b390 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e  ic int test_open
1b3a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b3b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b3c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b3d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b3e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b3f0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
1b400 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73   *zFilename;.  s
1b410 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
1b420 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1b430 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
1b440 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
1b450 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =1 ){.    Tcl_Ap
1b460 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1b470 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1b480 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1b490 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1b4a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1b4b0 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
1b4c0 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
1b4d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b4e0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
1b4f0 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f  ename = objc>1 ?
1b500 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b510 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73  bjv[1]) : 0;.  s
1b520 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c  qlite3_open(zFil
1b530 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a  ename, &db);.  .
1b540 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1b550 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1b560 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62  interp, zBuf, db
1b570 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b580 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65  RROR;.  Tcl_Appe
1b590 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b5a0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74   zBuf, 0);.  ret
1b5b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b5c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b5d0 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45  te3_open_v2 FILE
1b5e0 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a  NAME FLAGS VFS.*
1b5f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1b600 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69  t_open_v2(.  voi
1b610 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1b620 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1b630 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1b640 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1b650 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1b660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b670 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  name;.  const ch
1b680 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20  ar *zVfs;.  int 
1b690 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c  flags = 0;.  sql
1b6a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1b6b0 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  rc;.  char zBuf[
1b6c0 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c  100];..  int nFl
1b6d0 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ag;.  Tcl_Obj **
1b6e0 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b  apFlag;.  int i;
1b6f0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
1b700 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b710 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b720 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41  1, objv, "FILENA
1b730 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a  ME FLAGS VFS");.
1b740 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1b750 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  RROR;.  }.  zFil
1b760 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
1b770 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
1b780 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74    zVfs = Tcl_Get
1b790 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
1b7a0 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d  .  if( zVfs[0]==
1b7b0 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b  0x00 ) zVfs = 0;
1b7c0 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73  ..  rc = Tcl_Lis
1b7d0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
1b7e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1b7f0 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67   &nFlag, &apFlag
1b800 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c  );.  if( rc!=TCL
1b810 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b820 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46  .  for(i=0; i<nF
1b830 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  lag; i++){.    i
1b840 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74  nt iFlag;.    st
1b850 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a  ruct OpenFlag {.
1b860 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
1b870 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69   *zFlag;.      i
1b880 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61  nt flag;.    } a
1b890 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Flag[] = {.     
1b8a0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b8b0 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54  READONLY", SQLIT
1b8c0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
1b8d0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b8e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1b8f0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b900 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20  READWRITE },.   
1b910 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b920 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54  N_CREATE", SQLIT
1b930 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c  E_OPEN_CREATE },
1b940 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b950 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1b960 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  OSE", SQLITE_OPE
1b970 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
1b980 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1b990 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1b9a0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b9b0 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20  EXCLUSIVE },.   
1b9c0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b9d0 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51  N_AUTOPROXY", SQ
1b9e0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
1b9f0 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  OXY },.      { "
1ba00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1ba10 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1ba20 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20  N_MAIN_DB },.   
1ba30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ba40 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49  N_TEMP_DB", SQLI
1ba50 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
1ba60 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1ba70 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1ba80 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  T_DB", SQLITE_OP
1ba90 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
1baa0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1bab0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1bac0 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1bad0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1bae0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1baf0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
1bb00 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50  RNAL", SQLITE_OP
1bb10 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
1bb20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1bb30 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1bb40 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1bb50 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20  _SUBJOURNAL },. 
1bb60 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1bb70 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1bb80 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1bb90 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1bba0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1bbb0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22  TE_OPEN_NOMUTEX"
1bbc0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  , SQLITE_OPEN_NO
1bbd0 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b  MUTEX },.      {
1bbe0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55   "SQLITE_OPEN_FU
1bbf0 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45  LLMUTEX", SQLITE
1bc00 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
1bc10 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1bc20 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
1bc30 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1bc40 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c  N_SHAREDCACHE },
1bc50 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1bc60 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
1bc70 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  HE", SQLITE_OPEN
1bc80 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
1bc90 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1bca0 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49  _OPEN_WAL", SQLI
1bcb0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20  TE_OPEN_WAL },. 
1bcc0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1bcd0 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45  PEN_URI", SQLITE
1bce0 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20  _OPEN_URI },.   
1bcf0 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
1bd00 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f  };.    rc = Tcl_
1bd10 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53  GetIndexFromObjS
1bd20 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70  truct(interp, ap
1bd30 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20  Flag[i], aFlag, 
1bd40 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29  sizeof(aFlag[0])
1bd50 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67  , .        "flag
1bd60 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20  ", 0, &iFlag.   
1bd70 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
1bd80 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  TCL_OK ) return 
1bd90 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d  rc;.    flags |=
1bda0 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c   aFlag[iFlag].fl
1bdb0 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ag;.  }..  rc = 
1bdc0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
1bdd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20  zFilename, &db, 
1bde0 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20  flags, zVfs);.  
1bdf0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1be00 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1be10 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1be20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1be30 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1be40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1be50 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1be60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1be70 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1be80 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d  3_open16 filenam
1be90 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61  e options.*/.sta
1bea0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65  tic int test_ope
1beb0 6e 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  n16(.  void * cl
1bec0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1bed0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1bee0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1bef0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1bf00 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1bf10 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1bf20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1bf30 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
1bf40 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
1bf50 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
1bf60 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1bf70 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bf80 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bf90 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bfa0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bfb0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bfc0 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61  jv[0]), " filena
1bfd0 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22  me options-list"
1bfe0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1bff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c000 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54  .  zFilename = T
1c010 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1c020 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
1c030 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  0);.  sqlite3_op
1c040 65 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  en16(zFilename, 
1c050 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
1c060 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1c070 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1c080 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1c090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c0a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c0b0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1c0c0 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1c0d0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1c0e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1c0f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c100 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70  ge: sqlite3_comp
1c110 6c 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73  lete16 <UTF-16 s
1c120 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74  tring>.**.** Ret
1c130 75 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70  urn 1 if the sup
1c140 70 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69  plied argument i
1c150 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c  s a complete SQL
1c160 20 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a   statement, or z
1c170 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
1c180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c190 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28  test_complete16(
1c1a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c1b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c1c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c1d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c1e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c1f0 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ){.#if !defined(
1c200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1c210 4c 45 54 45 29 20 26 26 20 21 64 65 66 69 6e 65  LETE) && !define
1c220 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
1c230 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75  F16).  char *zBu
1c240 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  f;..  if( objc!=
1c250 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1c260 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1c270 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66  , 1, objv, "<utf
1c280 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20  -16 sql>");.    
1c290 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c2a0 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20  ;.  }..  zBuf = 
1c2b0 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
1c2c0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1c2d0 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63  bjv[1], 0);.  Tc
1c2e0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c2f0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1c300 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d  tObj(sqlite3_com
1c310 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b  plete16(zBuf)));
1c320 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c330 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20  E_OMIT_COMPLETE 
1c340 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  && SQLITE_OMIT_U
1c350 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1c360 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c370 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c380 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  _step STMT.**.**
1c390 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61   Advance the sta
1c3a0 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65  tement to the ne
1c3b0 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  xt row..*/.stati
1c3c0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28  c int test_step(
1c3d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c3e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c3f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c400 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c410 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c420 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1c430 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1c440 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1c450 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1c460 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c470 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c480 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c490 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c4a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c4b0 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
1c4c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c4d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1c4e0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1c4f0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c500 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1c510 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1c520 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1c530 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1c540 74 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20  tmt);..  /* if( 
1c550 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
1c560 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f  && rc!=SQLITE_RO
1c570 57 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  W ) return TCL_E
1c580 52 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53  RROR; */.  Tcl_S
1c590 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c5a0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1c5b0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1c5c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c5d0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
1c5e0 74 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20  t_sql(.  void * 
1c5f0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1c600 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1c610 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1c620 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1c630 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1c640 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1c650 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1c660 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1c670 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1c680 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
1c690 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c6a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1c6b0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1c6c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1c6d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1c6e0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1c6f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1c700 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c710 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
1c720 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c  ite3_sql(pStmt),
1c730 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1c740 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c750 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c760 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c770 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a  count STMT .**.*
1c780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1c790 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72  ber of columns r
1c7a0 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 73  eturned by the s
1c7b0 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d  ql statement STM
1c7c0 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
1c7d0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
1c7e0 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nt(.  void * cli
1c7f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c800 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c810 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c820 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c830 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c840 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1c850 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c860 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1c870 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1c880 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1c890 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1c8a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1c8b0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1c8c0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1c8d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c8e0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1c8f0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1c900 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c910 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1c920 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1c930 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
1c940 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c950 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1c960 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  Obj(sqlite3_colu
1c970 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  mn_count(pStmt))
1c980 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c990 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c9a0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1c9b0 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  mn_type STMT col
1c9c0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1c9d0 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65   the type of the
1c9e0 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20   data in column 
1c9f0 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20  'column' of the 
1ca00 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a  current row..*/.
1ca10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1ca20 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76  column_type(.  v
1ca30 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ca40 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ca50 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1ca60 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ca70 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ca80 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ca90 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1caa0 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66  .  int tp;..  if
1cab0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1cac0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cad0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1cae0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1caf0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1cb00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1cb10 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1cb20 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1cb30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cb40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1cb50 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1cb60 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cb70 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1cb80 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1cb90 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1cba0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1cbb0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cbc0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1cbd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70  TCL_ERROR;..  tp
1cbe0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1cbf0 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f  n_type(pStmt, co
1cc00 6c 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70  l);.  switch( tp
1cc10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1cc20 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20  ITE_INTEGER: .  
1cc30 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1cc40 74 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47  t(interp, "INTEG
1cc50 45 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ER", TCL_STATIC)
1cc60 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1cc70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1cc80 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f  NULL:.      Tcl_
1cc90 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1cca0 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54  , "NULL", TCL_ST
1ccb0 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1ccc0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1ccd0 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  LITE_FLOAT:.    
1cce0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1ccf0 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c  interp, "FLOAT",
1cd00 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20   TCL_STATIC); . 
1cd10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1cd20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54  case SQLITE_TEXT
1cd30 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52  :.      Tcl_SetR
1cd40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
1cd50 45 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43  EXT", TCL_STATIC
1cd60 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ); .      break;
1cd70 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1cd80 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c  _BLOB:.      Tcl
1cd90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1cda0 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53  p, "BLOB", TCL_S
1cdb0 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62  TATIC); .      b
1cdc0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
1cdd0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
1cde0 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
1cdf0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1ce00 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1ce10 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53  3_column_int64 S
1ce20 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1ce30 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
1ce40 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75   in column 'colu
1ce50 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65  mn' of the curre
1ce60 6e 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61  nt row cast as a
1ce70 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69  n.** wide (64-bi
1ce80 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73  t) integer..*/.s
1ce90 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1cea0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76  olumn_int64(.  v
1ceb0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1cec0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ced0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1cee0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1cef0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1cf00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1cf10 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1cf20 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20  .  i64 iVal;..  
1cf30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1cf40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1cf50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1cf60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1cf70 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1cf80 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1cf90 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1cfa0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1cfb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1cfc0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1cfd0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1cfe0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1cff0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d000 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d010 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1d020 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d030 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1d040 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1d050 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d060 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  iVal = sqlite3_c
1d070 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d  olumn_int64(pStm
1d080 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
1d090 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d0a0 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
1d0b0 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20  ntObj(iVal));.  
1d0c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d0d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1d0e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1d0f0 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  ob STMT column.*
1d100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d110 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20  t_column_blob(. 
1d120 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1d130 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1d140 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1d150 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1d160 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1d170 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1d180 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1d190 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  l;..  int len;. 
1d1a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
1d1b0 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ob;..  if( objc!
1d1c0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d1d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d1e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d1f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d200 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d210 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d220 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d230 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d240 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d250 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d260 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d270 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d280 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d2a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d2b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d2c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d2d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d2e0 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  OR;..  len = sql
1d2f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
1d300 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  s(pStmt, col);. 
1d310 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
1d320 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
1d330 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1d340 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1d350 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
1d360 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20  ArrayObj(pBlob, 
1d370 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  len));.  return 
1d380 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d390 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d3a0 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54  column_double ST
1d3b0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1d3c0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
1d3d0 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1d3e0 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1d3f0 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20  t row cast as a 
1d400 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
1d410 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1d420 6e 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  n_double(.  void
1d430 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1d440 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d450 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1d460 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1d470 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1d480 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1d490 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1d4a0 64 6f 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20  double rVal;..  
1d4b0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1d4c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d4d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d4e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d4f0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d500 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d510 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1d520 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1d530 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d540 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1d550 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1d560 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d570 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d580 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1d5a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d5b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1d5c0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1d5d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1d5e0 72 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  rVal = sqlite3_c
1d5f0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74  olumn_double(pSt
1d600 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
1d610 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1d620 65 72 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62  erp, Tcl_NewDoub
1d630 6c 65 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20  leObj(rVal));.  
1d640 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d650 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1d660 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
1d670 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  t STMT .**.** Re
1d680 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1d690 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  of columns retur
1d6a0 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20 73  ned by the sql s
1d6b0 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a  tatement STMT..*
1d6c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1d6d0 74 5f 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20  t_data_count(.  
1d6e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1d6f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1d700 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d710 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d720 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d730 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d740 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
1d750 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1d760 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d770 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d780 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d790 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d7a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d7b0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1d7c0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1d7d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d7e0 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1d7f0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1d800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d810 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1d820 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d830 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  OR;..  Tcl_SetOb
1d840 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1d850 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1d860 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74  lite3_data_count
1d870 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1d880 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1d890 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1d8a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20  te3_column_text 
1d8b0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1d8c0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d8d0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
1d8e0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d8f0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d900 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54  3_column_name ST
1d910 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
1d920 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1d930 74 5f 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a  t_utf8(.  void *
1d940 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
1d950 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1d960 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1d970 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1d980 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ke */.  Tcl_Inte
1d990 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d9a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d9b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d9c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1d9d0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1d9e0 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  col;.  const cha
1d9f0 72 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  r *(*xFunc)(sqli
1da00 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
1da10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1da20 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  Ret;..  xFunc = 
1da30 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29  (const char *(*)
1da40 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1da50 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1da60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1da70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1da80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1da90 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1daa0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1dab0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1dac0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1dad0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1dae0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1daf0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1db00 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1db10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1db20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1db30 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1db40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1db50 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1db60 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1db70 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1db80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1db90 20 20 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70    zRet = xFunc(p
1dba0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
1dbb0 28 20 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63  ( zRet ){.    Tc
1dbc0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
1dbd0 72 70 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74  rp, (char *)zRet
1dbe0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1dbf0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
1dc00 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c  atic int test_gl
1dc10 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20  obal_recover(.  
1dc20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1dc30 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1dc40 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1dc50 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1dc60 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1dc70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1dc80 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
1dc90 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
1dca0 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
1dcb0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1dcc0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1dcd0 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
1dce0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1dcf0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c   rc = sqlite3_gl
1dd00 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a  obal_recover();.
1dd10 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1dd20 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1dd30 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1dd40 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65   TCL_STATIC);.#e
1dd50 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
1dd60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1dd70 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1dd80 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63  lumn_text STMT c
1dd90 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1dda0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1ddb0 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20  n_decltype STMT 
1ddc0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1ddd0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1dde0 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c  mn_name STMT col
1ddf0 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  umn.*/.static in
1de00 74 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  t test_stmt_utf1
1de10 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1de20 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50  ntData,     /* P
1de30 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
1de40 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
1de50 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20   be invoked */. 
1de60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1de70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1de80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1de90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1dea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1deb0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
1dec0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1ded0 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62  nt col;.  Tcl_Ob
1dee0 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74  j *pRet;.  const
1def0 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a   void *zName16;.
1df00 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a    const void *(*
1df10 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73  xFunc)(sqlite3_s
1df20 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78  tmt*, int);..  x
1df30 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f  Func = (const vo
1df40 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f  id *(*)(sqlite3_
1df50 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1df60 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1df70 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1df80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1df90 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1dfa0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1dfb0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1dfc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1dfd0 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1dfe0 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1dff0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e000 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1e010 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1e020 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1e030 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1e040 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e050 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1e060 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1e070 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1e080 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1e090 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31  ERROR;..  zName1
1e0a0 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c  6 = xFunc(pStmt,
1e0b0 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61   col);.  if( zNa
1e0c0 6d 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20  me16 ){.    int 
1e0d0 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
1e0e0 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a  r *z = zName16;.
1e0f0 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e      for(n=0; z[n
1e100 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d  ] || z[n+1]; n+=
1e110 32 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20  2){}.    pRet = 
1e120 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1e130 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32  Obj(zName16, n+2
1e140 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
1e150 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1e160 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pRet);.  }.#endi
1e170 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1e180 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74  _UTF16 */..  ret
1e190 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1e1a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e1b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53  te3_column_int S
1e1c0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1e1d0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e1e0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d  column_bytes STM
1e1f0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1e200 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1e210 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d  lumn_bytes16 STM
1e220 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73  T column.**.*/.s
1e230 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1e240 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  tmt_int(.  void 
1e250 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
1e260 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
1e270 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
1e280 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
1e290 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1e2a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e2b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e2c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e2d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1e2e0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1e2f0 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63  l;.  int (*xFunc
1e300 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c  )(sqlite3_stmt*,
1e310 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20   int);..  xFunc 
1e320 3d 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74  = (int (*)(sqlit
1e330 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
1e340 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
1e350 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1e360 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1e370 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1e380 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1e390 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1e3a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e3b0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1e3c0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1e3d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e3e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1e3f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1e400 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1e410 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1e420 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1e430 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1e440 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1e450 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1e460 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1e470 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c  CL_ERROR;..  Tcl
1e480 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1e490 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1e4a0 4f 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c  Obj(xFunc(pStmt,
1e4b0 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72   col)));.  retur
1e4c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1e4d0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1e4e0 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20  e_set_magic  DB 
1e4f0 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a   MAGIC-NUMBER.**
1e500 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e  .** Set the db->
1e510 6d 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68  magic value.  Th
1e520 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1e530 73 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72  st error recover
1e540 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74  y logic..*/.stat
1e550 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65  ic int sqlite_se
1e560 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20  t_magic(.  void 
1e570 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1e580 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1e590 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1e5a0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1e5b0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e5c0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1e5d0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1e5e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1e5f0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1e600 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1e610 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20  [0],.         " 
1e620 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20  DB MAGIC", 0);. 
1e630 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e640 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1e650 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1e660 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1e670 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e680 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
1e690 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1e6a0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29  ITE_MAGIC_OPEN")
1e6b0 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1e6c0 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1e6d0 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73  GIC_OPEN;.  }els
1e6e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1e6f0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1e700 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20  GIC_CLOSED")==0 
1e710 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1e720 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1e730 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20  CLOSED;.  }else 
1e740 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1e750 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1e760 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20  C_BUSY")==0 ){. 
1e770 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1e780 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59  QLITE_MAGIC_BUSY
1e790 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1e7a0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1e7b0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f  QLITE_MAGIC_ERRO
1e7c0 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  R")==0 ){.    db
1e7d0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
1e7e0 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20  _MAGIC_ERROR;.  
1e7f0 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65  }else if( Tcl_Ge
1e800 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
1e810 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d  v[2], (int*)&db-
1e820 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72  >magic) ){.    r
1e830 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e840 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1e850 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e860 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69  sage:  sqlite3_i
1e870 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a  nterrupt  DB .**
1e880 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69  .** Trigger an i
1e890 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a  nterrupt on DB.*
1e8a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1e8b0 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76  t_interrupt(.  v
1e8c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e8d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e8e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1e8f0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1e900 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1e910 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1e920 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1e930 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e940 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1e950 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1e960 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20  argv[0], " DB", 
1e970 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1e980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e990 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1e9a0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1e9b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1e9c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
1e9d0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
1e9e0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
1e9f0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75  _OK;.}..static u
1ea00 38 20 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  8 *sqlite3_stack
1ea10 5f 62 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a  _baseline = 0;..
1ea20 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73  /*.** Fill the s
1ea30 74 61 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77  tack with a know
1ea40 6e 20 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f  n bitpattern..*/
1ea50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
1ea60 70 53 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20  pStack(void){.  
1ea70 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67  int i;.  u32 big
1ea80 42 75 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f  Buf[65536];.  fo
1ea90 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
1eaa0 62 69 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62  bigBuf)/sizeof(b
1eab0 69 67 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20  igBuf[0]); i++) 
1eac0 62 69 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65  bigBuf[i] = 0xde
1ead0 61 64 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65  adbeef;.  sqlite
1eae0 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1eaf0 20 3d 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b   = (u8*)&bigBuf[
1eb00 36 35 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  65536];.}../*.**
1eb10 20 47 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Get the current
1eb20 20 73 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55   stack depth.  U
1eb30 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
1eb40 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73  g only..*/.u64 s
1eb50 71 6c 69 74 65 33 53 74 61 63 6b 44 65 70 74 68  qlite3StackDepth
1eb60 28 76 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a  (void){.  u8 x;.
1eb70 20 20 72 65 74 75 72 6e 20 28 75 36 34 29 28 73    return (u64)(s
1eb80 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
1eb90 65 6c 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a  eline - &x);.}..
1eba0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1ebb0 6c 69 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64  lite3_stack_used
1ebc0 20 44 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72   DB SQL.**.** Tr
1ebd0 79 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65  y to measure the
1ebe0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b   amount of stack
1ebf0 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 61   space used by a
1ec00 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1ec10 5f 65 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20  _exec.*/.static 
1ec20 69 6e 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75  int test_stack_u
1ec30 73 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sed(.  void * cl
1ec40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ec50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ec60 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1ec70 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1ec80 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1ec90 74 20 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21  t i;.  if( argc!
1eca0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1ecb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ecc0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ecd0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ece0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1ecf0 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
1ed00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ed10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1ed20 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1ed30 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1ed40 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1ed50 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53  L_ERROR;.  prepS
1ed60 74 61 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29  tack();.  (void)
1ed70 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
1ed80 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
1ed90 30 29 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33  0);.  for(i=6553
1eda0 35 3b 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32  5; i>=0 && ((u32
1edb0 2a 29 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f  *)sqlite3_stack_
1edc0 62 61 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30  baseline)[-i]==0
1edd0 78 64 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b  xdeadbeef; i--){
1ede0 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
1edf0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1ee00 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29  _NewIntObj(i*4))
1ee10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ee20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ee30 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65  e: sqlite_delete
1ee40 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e  _function DB fun
1ee50 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a  ction-name.**.**
1ee60 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65 72   Delete the user
1ee70 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74   function 'funct
1ee80 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64  ion-name' from d
1ee90 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44  atabase handle D
1eea0 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75  B. It.** is assu
1eeb0 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73 65  med that the use
1eec0 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  r function was c
1eed0 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c 20  reated as UTF8, 
1eee0 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  any number of.**
1eef0 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20   arguments (the 
1ef00 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65  way the TCL inte
1ef10 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a  rface does it)..
1ef20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65  */.static int de
1ef30 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  lete_function(. 
1ef40 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ef50 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ef60 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1ef70 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
1ef80 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
1ef90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1efa0 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1efb0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1efc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1efd0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1efe0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1eff0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1f000 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
1f010 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f030 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1f040 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1f050 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1f060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f070 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
1f080 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
1f090 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
1f0a0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
1f0b0 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1f0c0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1f0d0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1f0e0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1f0f0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1f100 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f110 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65  Usage: sqlite_de
1f120 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44  lete_collation D
1f130 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65  B collation-name
1f140 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
1f150 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1f160 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d  ence 'collation-
1f170 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62  name' from datab
1f180 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44  ase handle .** D
1f190 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  B. It is assumed
1f1a0 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74   that the collat
1f1b0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
1f1c0 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
1f1d0 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68   (the .** way th
1f1e0 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20  e TCL interface 
1f1f0 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61  does it)..*/.sta
1f200 74 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63  tic int delete_c
1f210 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64  ollation(.  void
1f220 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f230 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f240 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1f250 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1f260 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
1f270 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
1f280 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
1f290 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f2a0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1f2b0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1f2c0 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
1f2d0 0a 20 20 20 20 20 20 20 20 22 20 44 42 20 66 75  .        " DB fu
1f2e0 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29  nction-name", 0)
1f2f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f300 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f310 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f320 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1f330 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1f340 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1f350 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
1f360 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67  ollation(db, arg
1f370 76 5b 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46  v[2], SQLITE_UTF
1f380 38 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  8, 0, 0);.  Tcl_
1f390 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1f3a0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1f3b0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
1f3c0 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
1f3d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1f3e0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1f3f0 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20  _get_autocommit 
1f400 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  DB.**.** Return 
1f410 74 72 75 65 20 69 66 20 74 68 65 20 64 61 74 61  true if the data
1f420 62 61 73 65 20 44 42 20 69 73 20 63 75 72 72 65  base DB is curre
1f430 6e 74 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d  ntly in auto-com
1f440 6d 69 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74  mit mode..** Ret
1f450 75 72 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  urn false if not
1f460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f470 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a  get_autocommit(.
1f480 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f490 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f4a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f4b0 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a   argc,.  char **
1f4c0 61 72 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a  argv.){.  char z
1f4d0 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74  Buf[30];.  sqlit
1f4e0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1f4f0 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
1f500 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f510 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1f520 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1f530 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1f540 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1f550 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f560 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f570 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f580 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f590 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f5a0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
1f5b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1f5c0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1f5d0 25 64 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74  %d", sqlite3_get
1f5e0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29  _autocommit(db))
1f5f0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1f600 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1f610 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1f620 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f630 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1f640 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20  busy_timeout DB 
1f650 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65  MS.**.** Set the
1f660 20 62 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20   busy timeout.  
1f670 54 68 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73  This is more eas
1f680 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74  ily done using t
1f690 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65  he timeout.** me
1f6a0 74 68 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20  thod of the TCL 
1f6b0 69 6e 74 65 72 66 61 63 65 2e 20 20 42 75 74 20  interface.  But 
1f6c0 77 65 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f  we need a way to
1f6d0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a   test the case.*
1f6e0 2a 20 77 68 65 72 65 20 69 74 20 72 65 74 75 72  * where it retur
1f6f0 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  ns SQLITE_MISUSE
1f700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f710 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
1f720 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1f730 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f740 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f750 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1f760 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1f770 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74   rc, ms;.  sqlit
1f780 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1f790 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1f7a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1f7b0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1f7c0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1f7d0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1f7e0 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b        " DB", 0);
1f7f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1f800 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1f810 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1f820 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1f830 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f840 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1f850 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
1f860 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29   argv[2], &ms) )
1f870 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f880 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1f890 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64  3_busy_timeout(d
1f8a0 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70  b, ms);.  Tcl_Ap
1f8b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1f8c0 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1f8d0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1f8e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f8f0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c  *.** Usage:  tcl
1f900 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56  _variable_type V
1f910 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a  ARIABLENAME.**.*
1f920 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
1f930 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  e of the interna
1f940 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  l representation
1f950 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75   for the.** valu
1f960 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76  e of the given v
1f970 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ariable..*/.stat
1f980 69 63 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61  ic int tcl_varia
1f990 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  ble_type(.  void
1f9a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f9b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f9c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f9d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f9e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63  T objv[].){.  Tc
1f9f0 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69  l_Obj *pVar;.  i
1fa00 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1fa10 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1fa20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1fa30 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b  jv, "VARIABLE");
1fa40 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1fa50 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61  ERROR;.  }.  pVa
1fa60 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45  r = Tcl_GetVar2E
1fa70 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  x(interp, Tcl_Ge
1fa80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1fa90 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45  , 0, TCL_LEAVE_E
1faa0 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70  RR_MSG);.  if( p
1fab0 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Var==0 ) return 
1fac0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1fad0 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29   pVar->typePtr )
1fae0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
1faf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1fb00 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1fb10 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e  pVar->typePtr->n
1fb20 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
1fb30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fb40 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fb50 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
1fb60 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a  _memory ?N?.**.*
1fb70 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * Attempt to rel
1fb80 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72  ease memory curr
1fb90 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e  ently held but n
1fba0 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75  ot actually requ
1fbb0 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74  ired..** The int
1fbc0 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75  eger N is the nu
1fbd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65  mber of bytes we
1fbe0 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
1fbf0 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a  elease.  The .**
1fc00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1fc10 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
1fc20 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72  emory actually r
1fc30 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  eleased..*/.stat
1fc40 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65  ic int test_rele
1fc50 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f  ase_memory(.  vo
1fc60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1fc70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1fc80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1fc90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1fca0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1fcb0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1fcc0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
1fcd0 41 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64  ANAGEMENT) && !d
1fce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
1fcf0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74  IT_DISKIO).  int
1fd00 20 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20   N;.  int amt;. 
1fd10 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20   if( objc!=1 && 
1fd20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1fd30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1fd40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1fd50 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74   "?N?");.    ret
1fd60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fd70 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32   }.  if( objc==2
1fd80 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
1fd90 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1fda0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
1fdb0 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  N) ) return TCL_
1fdc0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
1fdd0 20 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a      N = -1;.  }.
1fde0 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
1fdf0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e  release_memory(N
1fe00 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1fe10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1fe20 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29  l_NewIntObj(amt)
1fe30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
1fe40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
1fe50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1fe60 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1fe70 6d 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20  memory DB.**.** 
1fe80 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1fe90 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1fea0 74 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61  tly held by data
1feb0 62 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e  base DB.  Return
1fec0 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63   the.** result c
1fed0 6f 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68  ode (which in th
1fee0 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d  e current implem
1fef0 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61  entation is alwa
1ff00 79 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61  ys zero)..*/.sta
1ff10 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
1ff20 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a  release_memory(.
1ff30 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ff40 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ff50 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ff60 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ff70 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ff80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1ff90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
1ffa0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1ffb0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1ffc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1ffd0 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
1ffe0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fff0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
20000 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
20010 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
20020 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
20030 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62   rc = sqlite3_db
20050 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
20060 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
20070 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20080 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
20090 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
200a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
200b0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
200c0 5f 63 61 63 68 65 66 6c 75 73 68 20 44 42 0a 2a  _cacheflush DB.*
200d0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
200e0 66 6c 75 73 68 20 61 6e 79 20 64 69 72 74 79 20  flush any dirty 
200f0 70 61 67 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a  pages to disk..*
20100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20110 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28  t_db_cacheflush(
20120 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20130 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20140 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20150 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20160 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20170 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
20180 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
20190 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
201a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
201b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
201c0 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
201d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
201e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
201f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
20200 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
20210 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
20220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
20240 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64 62 29  b_cacheflush(db)
20250 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
20260 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
20270 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
20280 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
20290 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
202a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
202b0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c  RROR;.  }..  Tcl
202c0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
202d0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
202e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
202f0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
20300 64 62 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44  db_filename DB D
20310 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  BNAME.**.** Retu
20320 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
20330 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
20340 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
20350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20360 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  test_db_filename
20370 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
20380 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
20390 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
203a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
203b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
203c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
203d0 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
203e0 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20  *zDbName;.  if( 
203f0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
20400 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
20410 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
20420 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20   "DB DBNAME");. 
20430 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20440 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
20450 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
20460 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
20470 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
20480 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
20490 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d  ROR;.  zDbName =
204a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
204b0 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  bjv[2]);.  Tcl_A
204c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
204d0 72 70 2c 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  rp, sqlite3_db_f
204e0 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a 44 62 4e  ilename(db, zDbN
204f0 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29 30 29 3b  ame), (void*)0);
20500 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
20510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
20520 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  :  sqlite3_db_re
20530 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e 41 4d 45  adonly DB DBNAME
20540 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
20550 6f 72 20 30 20 69 66 20 44 42 4e 41 4d 45 20 69  or 0 if DBNAME i
20560 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f  s readonly or no
20570 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  t.  Return -1 if
20580 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a 2a 2a 20   DBNAME does.** 
20590 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 73 74  not exist..*/.st
205a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62  atic int test_db
205b0 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69  _readonly(.  voi
205c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
205d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
205e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
205f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20600 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20610 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
20620 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
20630 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
20640 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
20650 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
20660 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
20670 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
20680 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20690 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
206a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
206b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
206c0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
206d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
206e0 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
206f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
20700 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
20710 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
20720 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
20730 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64  e3_db_readonly(d
20740 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20  b, zDbName)));. 
20750 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20760 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20770 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
20780 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
20790 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
207a0 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
207b0 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
207c0 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
207d0 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
207e0 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
207f0 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
20800 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
20810 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
20820 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20830 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
20840 6c 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20  limit(.  void * 
20850 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20860 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20870 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20880 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20890 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
208a0 65 33 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20  e3_int64 amt;.  
208b0 54 63 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20  Tcl_WideInt N = 
208c0 2d 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  -1;.  if( objc!=
208d0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
208e0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
208f0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
20900 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
20910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20920 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
20930 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
20940 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
20950 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
20960 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
20970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20980 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69    }.  amt = sqli
20990 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  te3_soft_heap_li
209a0 6d 69 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f  mit64(N);.  Tcl_
209b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
209c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
209d0 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20  IntObj(amt));.  
209e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
209f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
20a00 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
20a10 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61  cleanup.**.** Ca
20a20 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ll the sqlite3_t
20a30 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50  hread_cleanup AP
20a40 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  I..*/.static int
20a50 20 74 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65   test_thread_cle
20a60 61 6e 75 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  anup(.  void * c
20a70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
20a80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
20a90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
20aa0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
20ab0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
20ac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
20ad0 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33  ECATED.  sqlite3
20ae0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28  _thread_cleanup(
20af0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
20b00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20b10 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
20b20 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
20b30 75 6e 74 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52  unts  DB.**.** R
20b40 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
20b50 6e 75 6d 62 65 72 73 20 77 68 69 63 68 20 61 72  numbers which ar
20b60 65 20 74 68 65 20 50 61 67 65 72 52 65 66 63 6f  e the PagerRefco
20b70 75 6e 74 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70  unt for all.** p
20b80 61 67 65 72 73 20 6f 6e 20 65 61 63 68 20 64 61  agers on each da
20b90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
20ba0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20bb0 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63   test_pager_refc
20bc0 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20 2a 20  ounts(.  void * 
20bd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20be0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20bf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20c00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20c10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20c20 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b  e3 *db;.  int i;
20c30 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a 20 20  .  int v, *a;.  
20c40 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
20c50 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
20c60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20c70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20c80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20c90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
20ca0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20cb0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
20cc0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
20cd0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20ce0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
20cf0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20d00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20d10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20d20 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20d30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52 65 73  CL_ERROR;.  pRes
20d40 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  ult = Tcl_NewObj
20d50 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
20d60 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
20d70 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
20d80 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  i].pBt==0 ){.   
20d90 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     v = -1;.    }
20da0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
20db0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
20dc0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
20dd0 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67    a = sqlite3Pag
20de0 65 72 53 74 61 74 73 28 73 71 6c 69 74 65 33 42  erStats(sqlite3B
20df0 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
20e00 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20 20 20  b[i].pBt));.    
20e10 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20    v = a[0];.    
20e20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
20e30 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
20e40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
20e50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
20e60 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c 74 2c  ment(0, pResult,
20e70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76   Tcl_NewIntObj(v
20e80 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ));.  }.  Tcl_Se
20e90 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
20ea0 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20 20 72  p, pResult);.  r
20eb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20ec0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
20ed0 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
20ee0 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54  int.**.** Some T
20ef0 43 4c 20 62 75 69 6c 64 73 20 28 65 78 3a 20 63  CL builds (ex: c
20f00 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20 73 75  ygwin) do not su
20f10 70 70 6f 72 74 20 36 34 2d 62 69 74 20 69 6e 74  pport 64-bit int
20f20 65 67 65 72 73 2e 20 20 54 68 69 73 0a 2a 2a 20  egers.  This.** 
20f30 6c 65 61 64 73 20 74 6f 20 61 20 6e 75 6d 62 65  leads to a numbe
20f40 72 20 6f 66 20 74 65 73 74 20 66 61 69 6c 75 72  r of test failur
20f50 65 73 2e 20 20 54 68 65 20 70 72 65 73 65 6e 74  es.  The present
20f60 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b 73 20   command checks 
20f70 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69 6c 64  the.** TCL build
20f80 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
20f90 6f 72 20 6e 6f 74 20 69 74 20 73 75 70 70 6f 72  or not it suppor
20fa0 74 73 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ts 64-bit intege
20fb0 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74 75 72  rs.  It.** retur
20fc0 6e 73 20 54 52 55 45 20 69 66 20 69 74 20 64 6f  ns TRUE if it do
20fd0 65 73 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  es and FALSE if 
20fe0 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
20ff0 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
21000 74 6f 20 77 61 72 6e 20 75 73 65 72 73 20 74 68  to warn users th
21010 61 74 20 74 68 65 69 72 20 54 43 4c 20 62 75 69  at their TCL bui
21020 6c 64 20 69 73 20 64 65 66 65 63 74 69 76 65 0a  ld is defective.
21030 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ** and that the 
21040 65 72 72 6f 72 73 20 74 68 65 79 20 61 72 65 20  errors they are 
21050 73 65 65 69 6e 67 20 69 6e 20 74 68 65 20 74 65  seeing in the te
21060 73 74 20 73 63 72 69 70 74 73 20 6d 69 67 68 74  st scripts might
21070 20 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c 74 20   be.** a result 
21080 6f 66 20 74 68 65 69 72 20 64 65 66 65 63 74 69  of their defecti
21090 76 65 20 54 43 4c 20 72 61 74 68 65 72 20 74 68  ve TCL rather th
210a0 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e 20 53  an problems in S
210b0 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  QLite..*/.static
210c0 20 69 6e 74 20 77 6f 72 6b 69 6e 67 5f 36 34 62   int working_64b
210d0 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  it_int(.  Client
210e0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
210f0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
21100 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
21110 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
21120 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21130 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
21140 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
21150 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
21160 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
21170 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
21180 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
21190 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
211a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
211b0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
211c0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
211d0 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65  {.  Tcl_Obj *pTe
211e0 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72  stObj;.  int wor
211f0 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65  king = 0;..  pTe
21200 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57  stObj = Tcl_NewW
21210 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30  ideIntObj(100000
21220 30 2a 28 69 36 34 29 31 32 33 34 35 36 37 38 39  0*(i64)123456789
21230 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20  0);.  working = 
21240 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
21250 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20  ring(pTestObj), 
21260 22 31 32 33 34 35 36 37 38 39 30 30 30 30 30 30  "123456789000000
21270 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65  0")==0;.  Tcl_De
21280 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74  crRefCount(pTest
21290 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  Obj);.  Tcl_SetO
212a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
212b0 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
212c0 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20  bj(working));.  
212d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
212e0 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
212f0 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
21300 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  st.**.** This TC
21310 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69  L command unregi
21320 73 74 65 72 73 20 74 68 65 20 70 72 69 6d 61 72  sters the primar
21330 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72  y VFS and then r
21340 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62  egisters.** it b
21350 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73  ack again.  This
21360 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
21370 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
21380 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46  register a.** VF
21390 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20  S when none are 
213a0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
213b0 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61  tered, and the a
213c0 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e  bility to .** un
213d0 72 65 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c  register the onl
213e0 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e  y available VFS.
213f0 20 20 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a    Ticket #2738.*
21400 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
21410 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20  _unlink_test(.  
21420 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
21430 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
21440 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
21450 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
21460 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
21470 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
21480 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
21490 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
214a0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
214b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
214c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
214d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
214e0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
214f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
21500 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
21510 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
21520 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21530 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  pMain;.  sqlite3
21540 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
21550 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
21560 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69  ne, two;..  sqli
21570 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21580 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65  er(0);   /* Unre
21590 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69  gister of NULL i
215a0 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20  s harmless */.  
215b0 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
215c0 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65  ne";.  two.zName
215d0 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f   = "__two";..  /
215e0 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
215f0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  3_vfs_register w
21600 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74  ith 2nd argument
21610 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20   of 0 does not. 
21620 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64   ** change the d
21630 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a  efault VFS.  */.
21640 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65    pMain = sqlite
21650 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
21660 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21670 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
21680 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
21690 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
216a0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
216b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   );.  sqlite3_vf
216c0 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c  s_register(&two,
216d0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
216e0 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
216f0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
21700 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57  nd(0) );..  /* W
21710 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53  e can find a VFS
21720 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   by its name */.
21730 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21740 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
21750 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
21760 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21770 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
21780 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20  ==&two );..  /* 
21790 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76  Calling sqlite_v
217a0 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68  fs_register with
217b0 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64   non-zero second
217c0 20 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67   parameter chang
217d0 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  es the.  ** defa
217e0 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66  ult VFS, even if
217f0 20 74 68 65 20 31 73 74 20 70 61 72 61 6d 65 74   the 1st paramet
21800 65 72 20 69 73 20 61 6e 20 65 78 69 73 74 69 67  er is an existig
21810 20 56 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a   VFS that is.  *
21820 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  * previously reg
21830 69 73 74 65 72 65 64 20 61 73 20 74 68 65 20 6e  istered as the n
21840 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  on-default..  */
21850 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
21860 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29  egister(&one, 1)
21870 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21880 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21890 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
218a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
218b0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
218c0 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
218d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
218e0 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20  s_find(0)==&one 
218f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
21900 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20  _register(&two, 
21910 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
21920 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21930 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
21940 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21950 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
21960 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
21970 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21980 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77  vfs_find(0)==&tw
21990 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e  o );.  if( pMain
219a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
219b0 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
219c0 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  in, 1);.    asse
219d0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
219e0 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
219f0 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  one );.    asser
21a00 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21a10 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21a20 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wo );.    assert
21a30 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21a40 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
21a50 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69    }.  .  /* Unli
21a60 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  nk the default V
21a70 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  FS.  Repeat unti
21a80 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  l there are no m
21a90 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72  ore VFSes.  ** r
21aa0 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a  egistered..  */.
21ab0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
21ac0 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f  eof(apVfs)/sizeo
21ad0 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b  f(apVfs[0]); i++
21ae0 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
21af0 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21b00 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
21b10 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
21b20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
21b30 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
21b40 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
21b50 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ame) );.      sq
21b60 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21b70 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a  ster(apVfs[i]);.
21b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
21b90 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
21ba0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
21bb0 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
21bc0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
21bd0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21be0 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69   );.  .  /* Regi
21bf0 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
21c00 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  S as non-default
21c10 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64   (will be made d
21c20 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20  efault, since.  
21c30 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20  ** it'll be the 
21c40 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73  only one in exis
21c50 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73  tence)..  */.  s
21c60 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
21c70 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20  ter(pMain, 0);. 
21c80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21c90 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
21ca0 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55  ain );.  .  /* U
21cb0 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 6d  n-register the m
21cc0 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f  ain VFS again to
21cd0 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74   restore an empt
21ce0 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20  y VFS list */.  
21cf0 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21d00 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20  gister(pMain);. 
21d10 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
21d20 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21d30 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20  );..  /* Relink 
21d40 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76  all VFSes in rev
21d50 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20  erse order. */  
21d60 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28  .  for(i=sizeof(
21d70 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
21d80 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b  Vfs[0])-1; i>=0;
21d90 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
21da0 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
21db0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21dc0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
21dd0 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
21de0 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
21df0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21e00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21e10 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
21e20 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21e30 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21e40 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
21e50 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20 73  Unregister out s
21e60 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a  ample VFSes. */.
21e70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
21e80 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
21e90 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
21ea0 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
21eb0 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
21ec0 69 6e 67 20 61 20 56 46 53 20 74 68 61 74 20 69  ing a VFS that i
21ed0 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
21ee0 72 65 67 69 73 74 65 72 65 64 20 69 73 20 68 61  registered is ha
21ef0 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  rmless */.  sqli
21f00 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21f10 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
21f20 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21f30 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65  er(&two);.  asse
21f40 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21f50 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30  find("__one")==0
21f60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
21f70 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
21f80 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20  __two")==0 );.. 
21f90 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65   /* We should be
21fa0 20 6c 65 66 74 20 77 69 74 68 20 74 68 65 20 6f   left with the o
21fb0 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20  riginal default 
21fc0 56 46 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a  VFS back as the.
21fd0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f    ** original */
21fe0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
21ff0 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
22000 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75  pMain );..  retu
22010 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22020 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
22030 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a  s_initfail_test.
22040 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
22050 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20  ommand attempts 
22060 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20  to vfs_find and 
22070 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 68 65  vfs_register whe
22080 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
22090 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e  _initialize() in
220a0 74 65 72 66 61 63 65 20 69 73 20 66 61 69 6c 69  terface is faili
220b0 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73  ng.  All calls s
220c0 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73  hould fail..*/.s
220d0 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 69 6e  tatic int vfs_in
220e0 69 74 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43  itfail_test(.  C
220f0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
22100 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
22110 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
22120 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
22130 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
22140 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
22150 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
22160 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
22170 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
22180 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
22190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
221a0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
221b0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
221c0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
221d0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
221e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
221f0 5f 76 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e  _vfs one;.  one.
22200 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
22210 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
22220 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65  vfs_find(0) ) re
22230 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22240 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
22250 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b  gister(&one, 0);
22260 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76  .  if( sqlite3_v
22270 66 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74  fs_find(0) ) ret
22280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22290 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
222a0 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
222b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
222c0 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
222d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
222e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
222f0 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46  ../*.** Saved VF
22300 53 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  Ses.*/.static sq
22310 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
22320 5b 32 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74  [20];.static int
22330 20 6e 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a   nVfs = 0;../*.*
22340 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
22350 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a  unregister_all.*
22360 2a 0a 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20  *.** Unregister 
22370 61 6c 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74  all VFSes..*/.st
22380 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 72  atic int vfs_unr
22390 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43  egister_all(.  C
223a0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
223b0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
223c0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
223d0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
223e0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
223f0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
22400 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
22410 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
22420 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
22430 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
22440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22450 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
22460 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
22470 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
22480 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
22490 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
224a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
224b0 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b 20 69  aySize(apVfs); i
224c0 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69  ++){.    apVfs[i
224d0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ] = sqlite3_vfs_
224e0 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28  find(0);.    if(
224f0 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29 20 62   apVfs[i]==0 ) b
22500 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  reak;.    sqlite
22510 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
22520 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a  (apVfs[i]);.  }.
22530 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20 72 65    nVfs = i;.  re
22540 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
22550 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
22560 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
22570 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  l.**.** Restore 
22580 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74 20 77  all VFSes that w
22590 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73 69 6e  ere removed usin
225a0 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  g vfs_unregister
225b0 5f 61 6c 6c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _all.*/.static i
225c0 6e 74 20 76 66 73 5f 72 65 72 65 67 69 73 74 65  nt vfs_reregiste
225d0 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
225e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
225f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
22600 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
22610 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
22620 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
22630 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
22640 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
22650 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
22660 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
22670 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
22680 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22690 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
226a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
226b0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
226c0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
226d0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
226e0 69 3d 30 3b 20 69 3c 6e 56 66 73 3b 20 69 2b 2b  i=0; i<nVfs; i++
226f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
22700 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
22710 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d  s[i], i==0);.  }
22720 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22730 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
22740 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
22750 6f 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  ol_test DB.**.**
22760 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
22770 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
22780 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
22790 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
227a0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
227b0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
227c0 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
227d0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
227e0 72 6f 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rol_test(.  Clie
227f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
22800 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
22810 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
22820 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
22830 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22840 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
22850 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
22860 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
22870 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
22880 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
22890 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
228a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
228b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
228c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
228d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
228e0 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
228f0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
22900 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
22910 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
22920 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22930 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22940 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22950 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
22960 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
22970 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
22980 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
22990 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
229a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
229b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
229c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
229d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
229e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
229f0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
22a00 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22a10 28 64 62 2c 20 30 2c 20 30 2c 20 26 69 41 72 67  (db, 0, 0, &iArg
22a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
22a30 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
22a40 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
22a50 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22a60 64 62 2c 20 22 6e 6f 74 61 64 61 74 61 62 61 73  db, "notadatabas
22a70 65 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  e", SQLITE_FCNTL
22a80 5f 4c 4f 43 4b 53 54 41 54 45 2c 20 26 69 41 72  _LOCKSTATE, &iAr
22a90 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
22aa0 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  ==SQLITE_ERROR )
22ab0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22ac0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
22ad0 2c 20 22 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69  , "main", -1, &i
22ae0 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Arg);.  assert( 
22af0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  rc==SQLITE_NOTFO
22b00 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  UND );.  rc = sq
22b10 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22b20 6f 6c 28 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d  ol(db, "temp", -
22b30 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  1, &iArg);.  ass
22b40 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22b50 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d  NOTFOUND || rc==
22b60 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
22b70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
22b80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
22b90 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
22ba0 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
22bb0 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t DB.**.** This 
22bc0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22bd0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22be0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
22bf0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
22c00 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
22c10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
22c20 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76  ITE_LAST_ERRNO v
22c30 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  erb..*/.static i
22c40 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22c50 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 28 0a  lasterrno_test(.
22c60 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
22c70 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
22c80 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
22c90 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
22ca0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
22cb0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
22cc0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
22cd0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
22ce0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
22cf0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22d10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
22d20 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
22d30 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
22d40 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
22d50 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
22d60 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iArg = 0;.  sqli
22d70 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
22d80 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
22d90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
22da0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22db0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
22dc0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
22dd0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
22de0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
22df0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c  v[0], 0), " DB",
22e00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
22e10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22e20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
22e30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
22e40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
22e50 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
22e60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22e70 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
22e80 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22e90 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
22ea0 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26 69 41  _LAST_ERRNO, &iA
22eb0 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  rg);.  if( rc ){
22ec0 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a   .    Tcl_SetObj
22ed0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
22ee0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
22ef0 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ); .    return T
22f00 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20  CL_ERROR; .  }. 
22f10 20 69 66 28 20 69 41 72 67 21 3d 30 20 29 20 7b   if( iArg!=0 ) {
22f20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22f30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 55  esult(interp, "U
22f40 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d 7a 65  nexpected non-ze
22f50 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20 20 20  ro errno: ",.   
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
22f80 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77 49 6e  romObj(Tcl_NewIn
22f90 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29 2c 20  tObj(iArg), 0), 
22fa0 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  " ", 0);.    ret
22fb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22fc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
22fd0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
22fe0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22ff0 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
23000 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53  test DB DBNAME S
23010 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  IZE.**.** This T
23020 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
23030 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
23040 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
23050 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
23060 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
23070 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
23080 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
23090 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  FILE and.** SQLI
230a0 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
230b0 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73  FILE verbs..*/.s
230c0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
230d0 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
230e0 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
230f0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
23100 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
23110 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
23120 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
23130 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23140 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
23150 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
23160 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23170 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23180 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
231a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
231b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
231c0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
231d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
231e0 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20  .  int nSize;   
231f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23200 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20     /* New chunk 
23210 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
23220 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
23230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
23240 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
23250 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
23260 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
23290 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
232c0 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
232d0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
232e0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
232f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
23300 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
23310 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
23320 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
23330 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23340 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23350 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
23360 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
23370 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
23380 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
23390 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
233a0 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
233b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
233c0 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
233d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
233e0 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
233f0 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
23400 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
23410 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23420 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
23430 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
23440 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e  SIZE, (void *)&n
23450 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
23460 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
23470 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
23480 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
23490 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
234a0 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
234b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
234c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
234d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
234e0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
234f0 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44  _sizehint_test D
23500 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
23510 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
23520 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
23530 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23540 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a  ol interface .**
23550 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
23560 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a  TL_SIZE_HINT.*/.
23570 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23580 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
23590 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
235a0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
235b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
235c0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
235d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
235e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
235f0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
23600 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
23610 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23620 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23630 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23650 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
23660 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23670 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
23680 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
23690 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e  .  Tcl_WideInt n
236a0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
236b0 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a     /* Hinted siz
236c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
236d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
236e0 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d         /* Db nam
236f0 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
23700 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c  " etc.) */.  sql
23710 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23730 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  Database handle 
23740 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e       /* file_con
23770 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f  trol() return co
23780 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a  de */..  if( obj
23790 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
237a0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
237b0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
237c0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b  B DBNAME SIZE");
237d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
237e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
237f0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23800 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23810 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23820 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  b) .   || Tcl_Ge
23830 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
23840 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
23850 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20   &nSize).  ){.  
23860 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23870 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
23880 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
23890 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62  v[2]);.  if( zDb
238a0 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20  [0]=='\0' ) zDb 
238b0 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20  = NULL;..  rc = 
238c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
238d0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
238e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
238f0 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e  HINT, (void *)&n
23900 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
23910 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
23920 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
23930 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
23940 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
23950 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
23960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
23980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
23990 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
239a0 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20  _lockproxy_test 
239b0 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69  DB PWD.**.** Thi
239c0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
239d0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
239e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
239f0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
23a00 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
23a10 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53  eration of the S
23a20 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52  QLITE_GET_LOCKPR
23a30 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53  OXYFILE and.** S
23a40 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
23a50 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a  OXYFILE verbs..*
23a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
23a70 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
23a80 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  oxy_test(.  Clie
23a90 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
23aa0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
23ab0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
23ac0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
23ad0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23ae0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
23af0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
23b00 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
23b10 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
23b20 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
23b30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23b40 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
23b50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
23b60 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
23b70 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
23b80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23b90 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  b;.  .  if( objc
23ba0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
23bb0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23bc0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23bd0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23bf0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
23c00 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
23c10 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57  [0], 0), " DB PW
23c20 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  D", 0);.    retu
23c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23c40 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23c50 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23c60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23c70 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
23c80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23c90 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65  ;.  }.  .#if !de
23ca0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
23cb0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23cc0 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  E).#  if defined
23cd0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20  (__APPLE__).#   
23ce0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45   define SQLITE_E
23cf0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
23d00 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20  YLE 1.#  else.# 
23d10 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45     define SQLITE
23d20 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
23d30 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66  STYLE 0.#  endif
23d40 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
23d50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
23d60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
23d70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
23d80 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74  {.    char *test
23d90 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63  Path;.    int rc
23da0 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a  ;.    int nPwd;.
23db0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23dc0 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70  zPwd;.    char p
23dd0 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20  roxyPath[400];. 
23de0 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54     .    zPwd = T
23df0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
23e00 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50  Obj(objv[2], &nP
23e10 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a  wd);.    if( siz
23e20 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e  eof(proxyPath)<n
23e30 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20  Pwd+20 ){.      
23e40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
23e50 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f  (interp, "PWD to
23e60 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30  o big", (void*)0
23e70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
23e80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
23e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23ea0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f  rintf(sizeof(pro
23eb0 78 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61  xyPath), proxyPa
23ec0 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f  th, "%s/test.pro
23ed0 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20  xy", zPwd);.    
23ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23ef0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23f00 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
23f10 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
23f20 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
23f30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
23f40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
23f50 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
23f60 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
23f70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23f80 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  OR;.    }.    rc
23f90 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
23fa0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
23fb0 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  , SQLITE_GET_LOC
23fc0 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73  KPROXYFILE, &tes
23fd0 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  tPath);.    if( 
23fe0 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74  strncmp(proxyPat
23ff0 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29  h,testPath,11) )
24000 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
24010 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24020 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c   "Lock proxy fil
24030 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20  e did not match 
24040 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20  the ".          
24050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24060 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79       "previously
24070 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22   assigned value"
24080 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
24090 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
240a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
240b0 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f  {.      Tcl_SetO
240c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
240d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
240e0 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  c));.      retur
240f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
24100 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
24110 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24120 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
24130 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
24140 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b  ILE, proxyPath);
24150 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
24160 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52       Tcl_SetObjR
24170 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
24180 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
24190 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
241a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
241b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
241c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
241d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
241e0 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  IN./*.** tclcmd:
241f0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24200 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20 44  win32_av_retry D
24210 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41 59  B  NRETRY  DELAY
24220 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
24230 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
24240 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24250 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
24260 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
24270 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
24280 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e 0a  V_RETRY opcode..
24290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
242a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
242b0 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69  _av_retry(.  Cli
242c0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
242d0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
242e0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
242f0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
24300 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24310 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
24320 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
24330 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
24340 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
24350 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
24360 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24370 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
24380 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
24390 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
243a0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
243b0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
243c0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
243d0 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72  int a[2];.  char
243e0 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
243f0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
24400 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24410 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
24420 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24430 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
24440 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24450 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24460 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41  " DB NRETRY DELA
24470 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  Y", 0);.    retu
24480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24490 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
244a0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
244b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
244c0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
244d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
244e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
244f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
24500 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
24510 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[0]) ) return 
24520 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
24530 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
24540 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
24550 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74  3], &a[1]) ) ret
24560 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24570 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
24580 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
24590 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
245a0 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
245b0 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73  , (void*)a);.  s
245c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
245d0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
245e0 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b  d %d %d", rc, a[
245f0 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c  0], a[1]);.  Tcl
24600 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24610 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
24620 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
24630 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
24640 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24650 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
24660 5f 68 61 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c  _handle DB HANDL
24670 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  E.**.** This TCL
24680 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
24690 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
246a0 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
246b0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
246c0 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
246d0 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64  SET_HANDLE opcod
246e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
246f0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69   file_control_wi
24700 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28 0a  n32_set_handle(.
24710 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
24720 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24730 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24740 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24750 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24760 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24770 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24780 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
24790 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
247a0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
247b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
247c0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
247d0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
247e0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
247f0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
24800 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
24810 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
24820 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6c  c;.  HANDLE hFil
24830 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61 72  e = NULL;.  char
24840 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20   z[100];..  if( 
24850 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
24860 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24870 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
24880 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
24890 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
248a0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
248b0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
248c0 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30 29  " DB HANDLE", 0)
248d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
248e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
248f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24900 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24910 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24920 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
24930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24940 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32 48  .  if( getWin32H
24950 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54 63  andle(interp, Tc
24960 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24970 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29 7b  [2]), &hFile) ){
24980 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24990 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
249a0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
249b0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
249c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
249d0 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c 0a  N32_SET_HANDLE,.
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
24a00 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73 71  d*)&hFile);.  sq
24a10 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
24a20 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
24a30 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64 2a   %p", rc, (void*
24a40 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 41  )hFile);.  Tcl_A
24a50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
24a60 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
24a70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
24a80 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  K;  .}.#endif../
24a90 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
24aa0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
24ab0 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53 49  ist_wal DB PERSI
24ac0 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68  ST-FLAG.**.** Th
24ad0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
24ae0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
24af0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
24b00 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
24b10 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
24b20 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63 6f  PERSIST_WAL opco
24b30 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
24b40 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70  t file_control_p
24b50 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c  ersist_wal(.  Cl
24b60 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
24b70 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
24b80 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
24b90 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
24ba0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
24bb0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
24bc0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
24bd0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
24be0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
24bf0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
24c00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24c10 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
24c20 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
24c30 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
24c40 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24c50 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
24c60 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
24c70 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20   int bPersist;. 
24c80 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20   char z[100];.. 
24c90 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
24ca0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
24cb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
24cc0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
24cd0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
24ce0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
24cf0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
24d00 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c   0), " DB FLAG",
24d10 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
24d20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
24d30 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
24d40 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
24d50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
24d60 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
24d70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24d80 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
24d90 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
24da0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50  rp, objv[2], &bP
24db0 65 72 73 69 73 74 29 20 29 20 72 65 74 75 72 6e  ersist) ) return
24dc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
24dd0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
24de0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
24df0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  , SQLITE_FCNTL_P
24e00 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69  ERSIST_WAL, (voi
24e10 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20  d*)&bPersist);. 
24e20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24e30 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
24e40 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65  "%d %d", rc, bPe
24e50 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70  rsist);.  Tcl_Ap
24e60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
24e70 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b  p, z, (char*)0);
24e80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24e90 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
24ea0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
24eb0 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
24ec0 65 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d  erwrite DB PSOW-
24ed0 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  FLAG.**.** This 
24ee0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24ef0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
24f00 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
24f10 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
24f20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
24f30 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
24f40 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
24f50 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24f60 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
24f70 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  erwrite(.  Clien
24f80 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
24f90 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24fa0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24fb0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24fc0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24fd0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
24fe0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24ff0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25000 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25010 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25020 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25030 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25040 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25050 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25060 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25070 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25080 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
25090 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  t b;.  char z[10
250a0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
250b0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    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 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
250e0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
250f0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
25100 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
25110 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
25120 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  FLAG", 0);.    r
25130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25140 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25150 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25160 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
25170 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
25180 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25190 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
251a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
251b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
251c0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
251d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
251e0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
251f0 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53  ontrol(db,NULL,S
25200 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
25210 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
25220 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71  (void*)&b);.  sq
25230 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
25240 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
25250 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20   %d", rc, b);.  
25260 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25270 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
25280 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
25290 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a  TCL_OK;  .}.../*
252a0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
252b0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
252c0 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a  me DB ?AUXDB?.**
252d0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
252e0 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
252f0 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20  es the stack of 
25300 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
25310 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
25320 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69  l_vfsname(.  Cli
25330 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
25340 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
25350 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
25360 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
25370 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25380 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
25390 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
253a0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
253b0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
253c0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
253d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
253e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
253f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
25400 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
25410 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
25420 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
25430 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
25440 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69   *zDbName = "mai
25450 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73  n";.  char *zVfs
25460 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Name = 0;..  if(
25470 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
25480 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
25490 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
254a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
254b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
254c0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
254d0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
254e0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
254f0 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20   ?AUXDB?", 0);. 
25500 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
25510 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
25520 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
25530 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
25540 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
25550 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
25560 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25570 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
25580 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
25590 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
255a0 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  2]);.  }.  sqlit
255b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
255c0 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c  db, zDbName, SQL
255d0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
255e0 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61  E,(void*)&zVfsNa
255f0 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  me);.  Tcl_Appen
25600 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
25610 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zVfsName, (char*
25620 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  )0);.  sqlite3_f
25630 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20  ree(zVfsName);. 
25640 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25650 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
25660 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
25670 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44  l_tempfilename D
25680 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
25690 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
256a0 74 68 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72  that is a tempor
256b0 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a  ary filename.*/.
256c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
256d0 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
256e0 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
256f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25700 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25710 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25720 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25730 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25740 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25750 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25760 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
25770 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
25780 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
25790 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
257a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
257b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
257c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
257d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
257e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
257f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
25800 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
25810 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
25820 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
25830 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
25840 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
25850 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
25860 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
25870 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
25880 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
25890 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
258a0 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
258b0 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
258c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
258d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
258e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
258f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25900 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
25910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25920 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
25930 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
25940 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
25950 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
25960 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
25970 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
25980 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
25990 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
259a0 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29   (void*)&zTName)
259b0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
259c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e  sult(interp, zTN
259d0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
259e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
259f0 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  TName);.  return
25a00 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
25a10 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
25a20 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a  qlite3_vfs_list.
25a30 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  **.**   Return a
25a40 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69   tcl list contai
25a50 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ning the names o
25a60 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64  f all registered
25a70 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69   vfs's..*/.stati
25a80 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74 28 0a  c int vfs_list(.
25a90 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25aa0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25ab0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25ac0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25ad0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25ae0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25af0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25b00 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25b10 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25b20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25b30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25b40 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25b50 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25b60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25b70 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25b80 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25b90 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
25ba0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
25bb0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
25bc0 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a   if( objc!=1 ){.
25bd0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
25be0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
25bf0 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72  objv, "");.    r
25c00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25c10 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d  .  }.  for(pVfs=
25c20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25c30 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d  (0); pVfs; pVfs=
25c40 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pVfs->pNext){.  
25c50 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
25c60 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25c70 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
25c80 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e  StringObj(pVfs->
25c90 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d  zName, -1));.  }
25ca0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
25cb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
25cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
25cd0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
25ce0 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
25cf0 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c  _limit DB ID VAL
25d00 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  UE.**.** This TC
25d10 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
25d20 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  he sqlite3_limit
25d30 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
25d40 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
25d50 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
25d60 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61  the same..*/.sta
25d70 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69 6d  tic int test_lim
25d80 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  it(.  ClientData
25d90 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25da0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
25db0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
25dc0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
25dd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
25de0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25df0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
25e00 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
25e10 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
25e20 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
25e30 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25e40 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25e50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25e60 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25e70 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25e80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
25e90 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20  nt rc;.  static 
25ea0 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
25eb0 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b      char *zName;
25ec0 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20  .     int id;.  
25ed0 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aId[] = {.    
25ee0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
25ef0 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20  LENGTH",        
25f00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
25f10 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
25f20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
25f30 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53   "SQLITE_LIMIT_S
25f40 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20  QL_LENGTH",     
25f50 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
25f60 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20  T_SQL_LENGTH    
25f70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
25f80 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
25f90 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20  LUMN",          
25fa0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
25fb0 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20  _COLUMN         
25fc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
25fd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
25fe0 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20  R_DEPTH",       
25ff0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
26000 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
26010 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
26020 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
26030 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20  OUND_SELECT",   
26040 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
26050 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
26060 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
26070 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f  LITE_LIMIT_VDBE_
26080 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  OP",            
26090 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44   SQLITE_LIMIT_VD
260a0 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20  BE_OP           
260b0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
260c0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
260d0 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20  ON_ARG",        
260e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e  SQLITE_LIMIT_FUN
260f0 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20  CTION_ARG       
26100 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
26110 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
26120 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53  D",            S
26130 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
26140 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
26150 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
26160 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
26170 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51  TERN_LENGTH", SQ
26180 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
26190 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
261a0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
261b0 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
261c0 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c  NUMBER",     SQL
261d0 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
261e0 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d  LE_NUMBER      }
261f0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
26200 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
26210 50 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49  PTH",       SQLI
26220 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
26230 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c  _DEPTH        },
26240 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
26250 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
26260 41 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54  ADS",      SQLIT
26270 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
26280 48 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a  HREADS       },.
26290 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20      .    /* Out 
262a0 6f 66 20 72 61 6e 67 65 20 74 65 73 74 20 63 61  of range test ca
262b0 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51  ses */.    { "SQ
262c0 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d  LITE_LIMIT_TOOSM
262d0 41 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ALL",           
262e0 20 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20   -1,            
262f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26300 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
26310 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47  ITE_LIMIT_TOOBIG
26320 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
26330 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
26340 4b 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20  KER_THREADS+1   
26350 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20    },.  };.  int 
26360 69 2c 20 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74  i, id = 0;.  int
26370 20 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68   val;.  const ch
26380 61 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20  ar *zId;..  if( 
26390 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
263a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
263b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
263c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
263d0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
263e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
263f0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
26400 22 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20  " DB ID VALUE", 
26410 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
26420 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26430 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
26440 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
26450 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
26460 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
26470 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20  CL_ERROR;.  zId 
26480 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
26490 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28  objv[2]);.  for(
264a0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49  i=0; i<sizeof(aI
264b0 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d  d)/sizeof(aId[0]
264c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
264d0 20 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64   strcmp(zId, aId
264e0 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
264f0 0a 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b  .      id = aId[
26500 69 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65  i].id;.      bre
26510 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
26520 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49  if( i>=sizeof(aI
26530 64 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d  d)/sizeof(aId[0]
26540 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
26550 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
26560 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74  , "unknown limit
26570 20 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28   type: ", zId, (
26580 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
26590 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
265a0 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
265b0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
265c0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
265d0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
265e0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
265f0 6c 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20  lite3_limit(db, 
26600 69 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f  id, val);.  Tcl_
26610 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
26620 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
26630 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
26640 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
26650 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61  *.** tclcmd:  sa
26660 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a  ve_prng_state.**
26670 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61  .** Save the sta
26680 74 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f  te of the pseudo
26690 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67  -random number g
266a0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20  enerator..** At 
266b0 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76  the same time, v
266c0 65 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74  erify that sqlit
266d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20  e3_test_control 
266e0 77 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a  works even when.
266f0 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61  ** called with a
26700 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f  n out-of-range o
26710 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
26720 20 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73   int save_prng_s
26730 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  tate(.  ClientDa
26740 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26750 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26760 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26770 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26780 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26790 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
267a0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
267b0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
267c0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
267d0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
267e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
267f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26800 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26810 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26820 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26830 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
26840 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
26850 39 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28  9999);.  assert(
26860 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d   rc==0 );.  rc =
26870 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
26880 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73  ntrol(-1);.  ass
26890 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
268a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
268b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
268c0 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b  CTRL_PRNG_SAVE);
268d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
268e0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
268f0 3a 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  :  restore_prng_
26900 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20  state.*/.static 
26910 69 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67  int restore_prng
26920 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  _state(.  Client
26930 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26940 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26950 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26960 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26970 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26980 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26990 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
269a0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
269b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
269c0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
269d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
269e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
269f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26a00 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26a10 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26a20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
26a30 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
26a40 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
26a50 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e  STORE);.  return
26a60 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
26a70 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f   tclcmd:  reset_
26a80 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74  prng_state.*/.st
26a90 61 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70  atic int reset_p
26aa0 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69  rng_state(.  Cli
26ab0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26ac0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
26ad0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
26ae0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
26af0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26b00 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26b10 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26b20 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26b30 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26b40 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
26b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26b60 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26b70 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26b80 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26b90 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26ba0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
26bb0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
26bc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
26bd0 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72  _RESET);.  retur
26be0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
26bf0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74 61  ** tclcmd:  data
26c00 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  base_may_be_corr
26c10 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
26c20 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
26c30 20 66 69 6c 65 73 20 6d 69 67 68 74 20 62 65 20   files might be 
26c40 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 74 68  corrupt.  In oth
26c50 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20 74 68  er words, set th
26c60 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61 74  e normal.** stat
26c70 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  e of operation..
26c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61  */.static int da
26c90 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
26ca0 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44  rrupt(.  ClientD
26cb0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
26cc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
26cd0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
26ce0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
26cf0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26d00 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
26d10 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
26d20 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
26d30 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
26d40 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
26d50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26d60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
26d70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
26d80 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
26d90 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
26da0 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
26db0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
26dc0 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
26dd0 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65 74  RRUPT, 0);.  ret
26de0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
26df0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74  .** tclcmd:  dat
26e00 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
26e10 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
26e20 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
26e30 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61 79   files are alway
26e40 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
26e50 54 68 69 73 20 65 6e 61 62 6c 65 73 20 65 78 74  This enables ext
26e60 72 61 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  ra assert().** s
26e70 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74  tatements that t
26e80 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  est conditions t
26e90 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
26ea0 72 75 65 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72  rue for well-for
26eb0 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  med databases..*
26ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 61 74  /.static int dat
26ed0 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
26ee0 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  upt(.  ClientDat
26ef0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26f00 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26f10 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26f20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26f30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26f40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26f50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26f60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26f70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26f80 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26f90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26fa0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26fb0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26fc0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26fd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26fe0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
26ff0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
27000 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
27010 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  UPT, 1);.  retur
27020 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
27030 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63  ** tclcmd:  pcac
27040 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74  he_stats.*/.stat
27050 69 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63  ic int test_pcac
27060 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65  he_stats(.  Clie
27070 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27080 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
27090 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
270a0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
270b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
270c0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
270d0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
270e0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
270f0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
27100 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
27110 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27120 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
27130 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
27140 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
27150 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
27160 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a  .){.  int nMin;.
27170 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e    int nMax;.  in
27180 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e  t nCurrent;.  in
27190 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20  t nRecyclable;. 
271a0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
271b0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
271c0 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c  Stats(&nCurrent,
271d0 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26   &nMax, &nMin, &
271e0 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20  nRecyclable);.. 
271f0 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
27200 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
27210 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
27220 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
27230 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
27240 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b  "current", -1));
27250 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
27260 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
27270 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
27280 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74  wIntObj(nCurrent
27290 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
272a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
272b0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
272c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
272d0 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ax", -1));.  Tcl
272e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
272f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
27300 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
27310 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f  j(nMax));.  Tcl_
27320 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27330 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27340 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
27350 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b  Obj("min", -1));
27360 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
27370 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
27380 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
27390 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a  wIntObj(nMin));.
273a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
273b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
273c0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
273d0 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63  StringObj("recyc
273e0 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20  lable", -1));.  
273f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27400 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27410 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
27420 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65  tObj(nRecyclable
27430 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ));..  Tcl_SetOb
27440 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
27450 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pRet);..  return
27460 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64   TCL_OK;.}..#ifd
27470 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
27480 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
27490 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
274a0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
274b0 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e  (void **aArg, in
274c0 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
274d0 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  i;.  for(ii=0; i
274e0 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
274f0 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54     Tcl_EvalEx((T
27500 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67  cl_Interp *)aArg
27510 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  [ii], "unlock_no
27520 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  tify", -1, TCL_E
27530 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d  VAL_GLOBAL);.  }
27540 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
27550 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
27560 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a  K_NOTIFY */../*.
27570 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
27580 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
27590 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y db.*/.#ifdef S
275a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
275b0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
275c0 63 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63  c int test_unloc
275d0 6b 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65  k_notify(.  Clie
275e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
275f0 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
27600 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27610 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
27620 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
27630 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
27640 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
27650 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
27660 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27670 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
27680 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
27690 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
276a0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
276b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
276c0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
276d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
276e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
276f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
27700 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
27710 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27720 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
27730 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
27740 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
27750 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
27760 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
27770 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
27780 20 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63   = sqlite3_unloc
27790 6b 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73  k_notify(db, tes
277a0 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f  t_unlock_notify_
277b0 63 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65  cb, (void *)inte
277c0 72 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  rp);.  Tcl_SetRe
277d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
277e0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
277f0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
27800 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27810 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
27820 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
27830 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
27840 69 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f  int db ?NAME?.*/
27850 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
27860 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
27870 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
27880 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
27890 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
278a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
278b0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
278c0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
278d0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
278e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27900 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
27910 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
27920 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
27930 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
27940 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
27950 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71  r *zDb = 0;.  sq
27960 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
27970 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
27980 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=3 && objc!=2 )
27990 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
279a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
279b0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d  , objv, "DB ?NAM
279c0 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
279d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
279e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
279f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
27a00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27a10 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
27a20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27a30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
27a40 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d  ==3 ){.    zDb =
27a50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
27a60 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72  bjv[2]);.  }.  r
27a70 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  c = sqlite3_wal_
27a80 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a  checkpoint(db, z
27a90 44 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  Db);.  Tcl_SetRe
27aa0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
27ab0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
27ac0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
27ad0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27ae0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
27af0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61  cmd:  sqlite3_wa
27b00 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20  l_checkpoint_v2 
27b10 64 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a  db MODE ?NAME?.*
27b20 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
27b30 64 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f  d calls the wal_
27b40 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20  checkpoint_v2() 
27b50 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
27b60 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d  e specified.** m
27b70 6f 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70 61  ode argument (pa
27b80 73 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72  ssive, full or r
27b90 65 73 74 61 72 74 29 2e 20 49 66 20 70 72 65 73  estart). If pres
27ba0 65 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73  ent, the databas
27bb0 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69  e name.** NAME i
27bc0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
27bd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
27be0 74 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  to wal_checkpoin
27bf0 74 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74 68  t_v2(). If it th
27c00 65 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65  e.** NAME argume
27c10 6e 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e  nt is not presen
27c20 74 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  t, a NULL pointe
27c30 72 20 69 73 20 70 61 73 73 65 64 20 69 6e 73 74  r is passed inst
27c40 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61  ead..**.** If wa
27c50 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
27c60 29 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76 61  ) returns any va
27c70 6c 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  lue other than S
27c80 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a  QLITE_BUSY or.**
27c90 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
27ca0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65   this command re
27cb0 74 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e  turns TCL_ERROR.
27cc0 20 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74 20   The Tcl result 
27cd0 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65  is set.** to the
27ce0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f   error message o
27cf0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
27d00 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a  ite3_errmsg()..*
27d10 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
27d20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  this command ret
27d30 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74  urns a list of t
27d40 68 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20 54  hree integers. T
27d50 68 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72  he first integer
27d60 0a 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c 49  .** is 1 if SQLI
27d70 54 45 5f 42 55 53 59 20 77 61 73 20 72 65 74 75  TE_BUSY was retu
27d80 72 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65 72  rned, or 0 other
27d90 77 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  wise. The follow
27da0 69 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72 73  ing two integers
27db0 0a 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c 75  .** are the valu
27dc0 65 73 20 72 65 74 75 72 6e 65 64 20 76 69 61 20  es returned via 
27dd0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
27de0 65 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68 65  eters by wal_che
27df0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a  ckpoint_v2() -.*
27e00 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
27e10 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
27e20 67 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  g and the number
27e30 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
27e40 65 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61  e log.** that ha
27e50 76 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69  ve been checkpoi
27e60 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
27e70 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
27e80 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c  ckpoint_v2(.  Cl
27e90 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
27ea0 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
27eb0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
27ec0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
27ed0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
27ee0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
27ef0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
27f00 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
27f10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27f20 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
27f30 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
27f40 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
27f50 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
27f60 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
27f70 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
27f80 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
27f90 0a 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20  .  int eMode;.  
27fa0 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b  int nLog = -555;
27fb0 0a 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d  .  int nCkpt = -
27fc0 35 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  555;.  Tcl_Obj *
27fd0 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63  pRet;..  const c
27fe0 68 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20  har * aMode[] = 
27ff0 7b 20 22 70 61 73 73 69 76 65 22 2c 20 22 66 75  { "passive", "fu
28000 6c 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c 20  ll", "restart", 
28010 22 74 72 75 6e 63 61 74 65 22 2c 20 30 20 7d 3b  "truncate", 0 };
28020 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
28030 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
28040 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20 61 73 73  SIVE==0 );.  ass
28050 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
28060 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29  KPOINT_FULL==1 )
28070 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
28080 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45  TE_CHECKPOINT_RE
28090 53 54 41 52 54 3d 3d 32 20 29 3b 0a 20 20 61 73  START==2 );.  as
280a0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
280b0 43 4b 50 4f 49 4e 54 5f 54 52 55 4e 43 41 54 45  CKPOINT_TRUNCATE
280c0 3d 3d 33 20 29 3b 0a 0a 20 20 69 66 28 20 6f 62  ==3 );..  if( ob
280d0 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=3 && objc!=4
280e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
280f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
28100 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4d 4f   1, objv, "DB MO
28110 44 45 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20  DE ?NAME?");.   
28120 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28130 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
28140 6a 63 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 44 62  jc==4 ){.    zDb
28150 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
28160 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20  (objv[3]);.  }. 
28170 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
28180 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
28190 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
281a0 2c 20 26 64 62 29 20 7c 7c 20 28 0a 20 20 20 20  , &db) || (.    
281b0 20 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65    TCL_OK!=Tcl_Ge
281c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f  tIntFromObj(0, o
281d0 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f 64 65 29 0a  bjv[2], &eMode).
281e0 20 20 20 26 26 20 54 43 4c 5f 4f 4b 21 3d 54 63     && TCL_OK!=Tc
281f0 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
28200 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
28210 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d 6f 64 65 22  ], aMode, "mode"
28220 2c 20 30 2c 20 26 65 4d 6f 64 65 29 20 0a 20 20  , 0, &eMode) .  
28230 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  )){.    return T
28240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
28250 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61   rc = sqlite3_wa
28260 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
28270 64 62 2c 20 7a 44 62 2c 20 65 4d 6f 64 65 2c 20  db, zDb, eMode, 
28280 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70 74 29 3b 0a  &nLog, &nCkpt);.
28290 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
282a0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
282b0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 63 6f  E_BUSY ){.    co
282c0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43 6f  nst char *zErrCo
282d0 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72 4e  de = sqlite3ErrN
282e0 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63 6c  ame(rc);.    Tcl
282f0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
28300 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  erp);.    Tcl_Ap
28310 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28320 70 2c 20 7a 45 72 72 43 6f 64 65 2c 20 22 20 2d  p, zErrCode, " -
28330 20 22 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69   ", (char *)sqli
28340 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
28350 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
28360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
28370 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
28380 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
28390 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
283a0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
283b0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 3d  cl_NewIntObj(rc=
283c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a 30  =SQLITE_BUSY?1:0
283d0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
283e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
283f0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
28400 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29  _NewIntObj(nLog)
28410 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
28420 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
28430 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
28440 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74 29  NewIntObj(nCkpt)
28450 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
28460 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
28470 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
28480 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
28490 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
284a0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
284b0 69 6e 74 20 64 62 20 56 41 4c 55 45 0a 2a 2f 0a  int db VALUE.*/.
284c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
284d0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
284e0 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
284f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
28500 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
28510 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
28520 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
28530 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
28540 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
28550 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
28560 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
28570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
28580 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
28590 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
285a0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
285b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
285c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
285d0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 56 61  nt rc;.  int iVa
285e0 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  l;...  if( objc!
285f0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
28600 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28610 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
28620 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74  VALUE");.    ret
28630 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28640 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
28650 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
28660 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
28670 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20  v[1]), &db) .   
28680 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
28690 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c  mObj(0, objv[2],
286a0 20 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20 20 20   &iVal).  ){.   
286b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
286c0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
286d0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
286e0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 56  heckpoint(db, iV
286f0 61 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74  al);.  Tcl_Reset
28700 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
28710 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28720 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
28730 20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20   char *zErrCode 
28740 3d 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  = sqlite3ErrName
28750 28 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  (rc);.    Tcl_Se
28760 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
28770 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
28780 4f 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20 2d 31  Obj(zErrCode, -1
28790 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
287a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
287b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
287c0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
287d0 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  :  test_sqlite3_
287e0 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a  log ?SCRIPT?.*/.
287f0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4c 6f  static struct Lo
28800 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20 54 63  gCallback {.  Tc
28810 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74 65 72  l_Interp *pInter
28820 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f  p;.  Tcl_Obj *pO
28830 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62 61 63  bj;.} logcallbac
28840 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74 61 74  k = {0, 0};.stat
28850 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61 6c 6c  ic void xLogcall
28860 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75 73 65  back(void *unuse
28870 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68 61 72  d, int err, char
28880 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c 5f 4f   *zMsg){.  Tcl_O
28890 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 44  bj *pNew = Tcl_D
288a0 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f 67 63  uplicateObj(logc
288b0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20  allback.pObj);. 
288c0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
288d0 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c 5f 4c  t(pNew);.  Tcl_L
288e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
288f0 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20 70 4e  ent(.      0, pN
28900 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ew, Tcl_NewStrin
28910 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
28920 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a 20 20  ame(err), -1).  
28930 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
28940 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
28950 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74   pNew, Tcl_NewSt
28960 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31  ringObj(zMsg, -1
28970 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
28980 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  jEx(logcallback.
28990 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  pInterp, pNew, T
289a0 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54  CL_EVAL_GLOBAL|T
289b0 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 29 3b  CL_EVAL_DIRECT);
289c0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
289d0 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73 74 61  unt(pNew);.}.sta
289e0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c  tic int test_sql
289f0 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
28a00 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28a10 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
28a20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
28a30 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
28a40 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
28a50 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
28a60 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
28a70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28a80 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
28a90 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
28aa0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
28ab0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28ac0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
28ad0 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
28ae0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28af0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
28b00 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
28b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28b20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
28b30 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
28b40 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
28b50 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
28b60 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
28b70 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
28b80 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
28b90 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
28ba0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
28bb0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
28bc0 20 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f 69 64   (void*)0, (void
28bd0 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  *)0);.  }.  if( 
28be0 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f  objc>1 ){.    lo
28bf0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d  gcallback.pObj =
28c00 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63   objv[1];.    Tc
28c10 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_IncrRefCount(l
28c20 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29  ogcallback.pObj)
28c30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
28c40 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  k.pInterp = inte
28c50 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rp;.    sqlite3_
28c60 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
28c70 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61  NFIG_LOG, xLogca
28c80 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 30  llback, (void*)0
28c90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
28ca0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
28cb0 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63       tcl_objproc
28cc0 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47   COMMANDNAME ARG
28cd0 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61  S....**.** Run a
28ce0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69   TCL command usi
28cf0 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69  ng its objProc i
28d00 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77  nterface.  Throw
28d10 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20   an error if.** 
28d20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  the command has 
28d30 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72  no objProc inter
28d40 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
28d50 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63  int runAsObjProc
28d60 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
28d70 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
28d80 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
28d90 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
28da0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
28db0 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
28dc0 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28  o cmdInfo;.  if(
28dd0 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
28de0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
28df0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
28e00 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b   "COMMAND ...");
28e10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28e20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28e30 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
28e40 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
28e50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28e60 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
28e70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
28e80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
28e90 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
28ea0 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
28eb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
28ec0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
28ed0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
28ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
28ef0 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  if( cmdInfo.objP
28f00 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  roc==0 ){.    Tc
28f10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28f20 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
28f30 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20  has no objProc: 
28f40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
28f50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
28f60 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
28f70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28f80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
28f90 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  urn cmdInfo.objP
28fa0 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  roc(cmdInfo.objC
28fb0 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
28fc0 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b  p, objc-1, objv+
28fd0 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
28fe0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
28ff0 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  IN./*.** WARNING
29000 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  : The following 
29010 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45  function, printE
29020 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
29030 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a  ) is an exact.**
29040 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65   copy of example
29050 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69   code from eqp.i
29060 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66  n (eqp.html). If
29070 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
29080 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  dified,.** then 
29090 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
290a0 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20  n copy needs to 
290b0 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77  be modified as w
290c0 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72  ell..*/./*.** Ar
290d0 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20  gument pStmt is 
290e0 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20 73  a prepared SQL s
290f0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
29100 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73  unction compiles
29110 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  .** an EXPLAIN Q
29120 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
29130 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74  d to report on t
29140 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
29150 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72  ement,.** and pr
29160 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74 20  ints the report 
29170 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20  to stdout using 
29180 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74  printf()..*/.int
29190 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
291a0 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73  ryPlan(sqlite3_s
291b0 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63  tmt *pStmt){.  c
291c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
291d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291e0 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20  * Input SQL */. 
291f0 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
29200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29210 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50   /* SQL with EXP
29220 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
29230 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73  prepended */.  s
29240 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
29250 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f  plain;         /
29260 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41  * Compiled EXPLA
29270 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
29280 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72  mmand */.  int r
29290 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
292a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
292b0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
292c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
292d0 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d  2() */..  zSql =
292e0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
292f0 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  mt);.  if( zSql=
29300 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
29310 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78  TE_ERROR;..  zEx
29320 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  plain = sqlite3_
29330 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
29340 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c   QUERY PLAN %s",
29350 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45   zSql);.  if( zE
29360 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
29370 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
29380 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
29390 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69  _prepare_v2(sqli
293a0 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
293b0 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20  tmt), zExplain, 
293c0 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
293d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
293e0 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69  e(zExplain);.  i
293f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29400 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
29410 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
29420 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
29430 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
29440 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20    int iSelectid 
29450 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
29460 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
29470 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65  );.    int iOrde
29480 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
29490 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
294a0 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72   1);.    int iFr
294b0 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om = sqlite3_col
294c0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
294d0 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
294e0 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20  char *zDetail = 
294f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
29500 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
29510 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
29520 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20  .    printf("%d 
29530 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65  %d %d %s\n", iSe
29540 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20  lectid, iOrder, 
29550 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b  iFrom, zDetail);
29560 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
29570 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
29580 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74  pExplain);.}..st
29590 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
295a0 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20  int_eqp(.  void 
295b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
295c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
295d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
295e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
295f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
29600 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
29610 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
29620 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
29630 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29640 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
29650 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
29660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29670 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
29680 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
29690 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
296a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
296b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
296c0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
296d0 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
296e0 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f  Plan(pStmt);.  /
296f0 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  * This is needed
29700 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74   on Windows so t
29710 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20  hat a test case 
29720 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a  using this .  **
29730 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70   function can op
29740 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61  en a read pipe a
29750 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  nd get the outpu
29760 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45  t of.  ** printE
29770 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
29780 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  ) immediately.. 
29790 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64   */.  fflush(std
297a0 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  out);.  Tcl_SetR
297b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
297c0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
297d0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
297e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
297f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
29800 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
29810 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  /*.** sqlite3_te
29820 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20  st_control VERB 
29830 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ARGS....*/.stati
29840 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73 74 5f  c int test_test_
29850 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20  control(.  void 
29860 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
29870 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29880 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
29890 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
298a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72   objv[].){.  str
298b0 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63  uct Verb {.    c
298c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
298d0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d  ;.    int i;.  }
298e0 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20   aVerb[] = {.   
298f0 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43   { "SQLITE_TESTC
29900 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
29910 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  ULT", SQLITE_TES
29920 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
29930 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20  FAULT }, .    { 
29940 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
29950 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20  _SORTER_MMAP",  
29960 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
29970 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20  RL_SORTER_MMAP  
29980 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51     }, .    { "SQ
29990 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
299a0 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20 20  POSTER",        
299b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
299c0 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20 20  IMPOSTER        
299d0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56  },.  };.  int iV
299e0 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67  erb;.  int iFlag
299f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
29a00 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
29a10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
29a20 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29a30 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e 2e  v, "VERB ARGS...
29a40 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
29a50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
29a60 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
29a70 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
29a80 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f  .      interp, o
29a90 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73  bjv[1], aVerb, s
29aa0 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c  izeof(aVerb[0]),
29ab0 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56 65   "VERB", 0, &iVe
29ac0 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  rb.  );.  if( rc
29ad0 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
29ae0 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d  n rc;..  iFlag =
29af0 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b   aVerb[iVerb].i;
29b00 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61 67  .  switch( iFlag
29b10 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
29b20 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
29b30 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
29b40 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
29b50 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
29b60 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
29b70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
29b80 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f  erp, 2, objv, "O
29b90 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20 20  NOFF");.        
29ba0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29bb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29bc0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
29bd0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
29be0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
29bf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
29c00 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
29c10 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
29c20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29c30 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
29c40 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
29c50 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
29c60 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
29c70 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a  TRL_SORTER_MMAP:
29c80 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c   {.      int val
29c90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
29ca0 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  *db;.      if( o
29cb0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
29cc0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29cd0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
29ce0 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54 22 29 3b  jv, "DB LIMIT");
29cf0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29d00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
29d10 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65 74   }.      if( get
29d20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
29d30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
29d40 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20 29  objv[2]), &db) )
29d50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29d60 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  R;.      if( Tcl
29d70 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
29d80 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
29d90 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
29da0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
29db0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
29dc0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
29dd0 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
29de0 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20 20 20 20  , db, val);.    
29df0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
29e00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
29e10 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
29e20 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  R: {.      int o
29e30 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20 20 20 20  nOff, tnum;.    
29e40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29e50 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  bName;.      sql
29e60 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20  ite3 *db;.      
29e70 69 66 28 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20  if( objc!=6 ){. 
29e80 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
29e90 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
29ea0 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 4e  2, objv, "DB dbN
29eb0 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75 6d 22 29  ame onOff tnum")
29ec0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
29ed0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
29ee0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65    }.      if( ge
29ef0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
29f00 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
29f10 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20  (objv[2]), &db) 
29f20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
29f30 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d  OR;.      zDbNam
29f40 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
29f50 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
29f60 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
29f70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
29f80 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29  objv[4], &onOff)
29f90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
29fa0 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ROR;.      if( T
29fb0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
29fc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
29fd0 2c 20 26 74 6e 75 6d 29 20 29 20 72 65 74 75 72  , &tnum) ) retur
29fe0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29ff0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2a000 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2a010 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2a020 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f  , db, zDbName, o
2a030 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  nOff, tnum);.   
2a040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2a050 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74    }..  Tcl_Reset
2a060 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2a070 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2a080 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2a090 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64 65 20  S_UNIX.#include 
2a0a0 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
2a0b0 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75  clude <sys/resou
2a0c0 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20 69  rce.h>..static i
2a0d0 6e 74 20 74 65 73 74 5f 67 65 74 72 75 73 61 67  nt test_getrusag
2a0e0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
2a0f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2a100 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2a110 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2a120 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2a130 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62 75 66 5b  ].){.  char buf[
2a140 31 30 32 34 5d 3b 0a 20 20 73 74 72 75 63 74 20  1024];.  struct 
2a150 72 75 73 61 67 65 20 72 3b 0a 20 20 6d 65 6d 73  rusage r;.  mems
2a160 65 74 28 26 72 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&r, 0, sizeof
2a170 28 72 29 29 3b 0a 20 20 67 65 74 72 75 73 61 67  (r));.  getrusag
2a180 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26  e(RUSAGE_SELF, &
2a190 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  r);..  sqlite3_s
2a1a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 62  nprintf(sizeof(b
2a1b0 75 66 29 2c 20 62 75 66 2c 0a 20 20 20 20 22 72  uf), buf,.    "r
2a1c0 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20  u_utime=%d.%06d 
2a1d0 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64  ru_stime=%d.%06d
2a1e0 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75   ru_minflt=%d ru
2a1f0 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20  _majflt=%d", .  
2a200 20 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d    (int)r.ru_utim
2a210 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72  e.tv_sec, (int)r
2a220 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_utime.tv_use
2a230 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72  c, .    (int)r.r
2a240 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20  u_stime.tv_sec, 
2a250 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e  (int)r.ru_stime.
2a260 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69  tv_usec, .    (i
2a270 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20  nt)r.ru_minflt, 
2a280 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74  (int)r.ru_majflt
2a290 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  .  );.  Tcl_SetO
2a2a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2a2b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2a2c0 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72  j(buf, -1));.  r
2a2d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2a2e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2a2f0 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
2a300 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73  Information pass
2a310 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ed from the main
2a320 20 74 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65   thread into the
2a330 20 77 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f   windows file lo
2a340 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75  cker.** backgrou
2a350 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74  nd thread..*/.st
2a360 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2a370 63 6b 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65  cker {.  char *e
2a380 76 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20  vName;       /* 
2a390 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f  Name of event to
2a3a0 20 73 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73   signal thread s
2a3b0 74 61 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44  tartup */.  HAND
2a3c0 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  LE h;           
2a3d0 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65  /* Handle of the
2a3e0 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
2a3f0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61  ed */.  int dela
2a400 79 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  y1;         /* D
2a410 65 6c 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b  elay before lock
2a420 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ing */.  int del
2a430 61 79 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ay2;         /* 
2a440 44 65 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c  Delay before unl
2a450 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
2a460 6f 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ok;             
2a470 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a  /* Finished ok *
2a480 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20  /.  int err;    
2a490 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a4a0 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
2a4b0 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a  rs */.};.#endif.
2a4c0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2a4d0 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72  WIN.#include <pr
2a4e0 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54  ocess.h>./*.** T
2a4f0 68 65 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68  he background th
2a500 72 65 61 64 20 74 68 61 74 20 64 6f 65 73 20 66  read that does f
2a510 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ile locking..*/.
2a520 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 33  static void win3
2a530 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28 76 6f  2_file_locker(vo
2a540 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
2a550 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
2a560 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28 73 74  eLocker *p = (st
2a570 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f  ruct win32FileLo
2a580 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61 3b 0a  cker*)pAppData;.
2a590 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d 65 20    if( p->evName 
2a5a0 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 65 76  ){.    HANDLE ev
2a5b0 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45 56 45   = OpenEvent(EVE
2a5c0 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54 45 2c  NT_MODIFY_STATE,
2a5d0 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e 61 6d   FALSE, p->evNam
2a5e0 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65 76 20  e);.    if ( ev 
2a5f0 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76 65 6e  ){.      SetEven
2a600 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43 6c 6f  t(ev);.      Clo
2a610 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2a620 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
2a630 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65 70 28  >delay1 ) Sleep(
2a640 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20 69 66  p->delay1);.  if
2a650 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c  ( LockFile(p->h,
2a660 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30 30 30   0, 0, 100000000
2a670 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c 65 65  , 0) ){.    Slee
2a680 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a 20 20  p(p->delay2);.  
2a690 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 2d 3e    UnlockFile(p->
2a6a0 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
2a6b0 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6f  00, 0);.    p->o
2a6c0 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  k = 1;.  }else{.
2a6d0 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31 3b 0a      p->err = 1;.
2a6e0 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2a6f0 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e 68 20  e(p->h);.  p->h 
2a700 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79 31  = 0;.  p->delay1
2a710 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61 79   = 0;.  p->delay
2a720 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  2 = 0;.}.#endif.
2a730 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2a740 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6c 6f  IN./*.**      lo
2a750 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49  ck_win32_file FI
2a760 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2a770 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74 20 61  LAY2.**.** Get a
2a780 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61 6e 64  n exclusive mand
2a790 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20 66 69  itory lock on fi
2a7a0 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20 6d 69  le for DELAY2 mi
2a7b0 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a 20 57  lliseconds..** W
2a7c0 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c 6c 69  ait DELAY1 milli
2a7d0 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 61  seconds before a
2a7e0 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c 6f 63  cquiring the loc
2a7f0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
2a800 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2a810 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2a820 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2a830 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2a840 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2a850 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2a860 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
2a870 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2a880 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
2a890 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
2a8a0 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
2a8b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2a8c0 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
2a8d0 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
2a8e0 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
2a8f0 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
2a900 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
2a910 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
2a920 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2a930 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2a940 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2a950 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2a960 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
2a970 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a980 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
2a990 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2a9a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2a9b0 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
2a9c0 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
2a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9e0 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
2a9f0 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
2aa00 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
2aa10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2aa20 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
2aa30 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2aa40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
2aa50 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
2aa60 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
2aa70 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
2aa80 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
2aa90 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
2aaa0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2aab0 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
2aac0 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2aad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2aae0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2aaf0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2ab00 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
2ab10 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
2ab20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
2ab30 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2ab40 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2ab50 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
2ab60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ab70 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
2ab80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2ab90 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
2aba0 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2abb0 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
2abc0 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
2abd0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2abe0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
2abf0 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
2ac00 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
2ac10 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
2ac20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2ac30 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
2ac40 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
2ac50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2ac60 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
2ac70 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
2ac80 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
2ac90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2aca0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
2acb0 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
2acc0 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
2acd0 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
2ace0 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
2acf0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ad00 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
2ad10 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
2ad20 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
2ad30 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2ad40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ad50 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
2ad60 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2ad70 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
2ad80 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
2ad90 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
2ada0 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
2adb0 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
2adc0 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
2add0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2ade0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2adf0 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
2ae00 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
2ae10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2ae20 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
2ae30 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
2ae40 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2ae50 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2ae60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ae70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
2ae80 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2ae90 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2aea0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69  ../*.**      exi
2aeb0 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50  sts_win32_path P
2aec0 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ATH.**.** Return
2aed0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2aee0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2aef0 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66   exists, whose f
2af00 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2af10 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65  ame.** may excee
2af20 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73  d 260 characters
2af30 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2af40 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2af50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2af60 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28  n32_exists_path(
2af70 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2af80 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2af90 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2afa0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2afb0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2afc0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2afd0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2afe0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2aff0 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29  1, objv, "PATH")
2b000 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2b010 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2b020 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2b030 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
2b040 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20  oleanObj(.      
2b050 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
2b060 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f  sW( Tcl_GetUnico
2b070 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e  de(objv[1]))!=IN
2b080 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2b090 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75  BUTES ));.  retu
2b0a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2b0b0 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69  .**      find_wi
2b0c0 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e  n32_file PATTERN
2b0d0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61  .**.** Returns a
2b0e0 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73   list of entries
2b0f0 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20   in a directory 
2b100 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 73  that match the s
2b110 70 65 63 69 66 69 65 64 20 70 61 74 74 65 72 6e  pecified pattern
2b120 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79  ,.** whose fully
2b130 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2b140 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 20 63  may exceed 248 c
2b150 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2b160 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2b170 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  .** "\\?\"..*/.s
2b180 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2b190 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69  find_file(.  voi
2b1a0 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
2b1b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2b1c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2b1d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2b1e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41  T objv[].){.  HA
2b1f0 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d  NDLE hFindFile =
2b200 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
2b210 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46  VALUE;.  WIN32_F
2b220 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61  IND_DATAW findDa
2b230 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ta;.  Tcl_Obj *l
2b240 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20  istObj;.  DWORD 
2b250 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28  lastErrno;.  if(
2b260 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2b270 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2b280 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2b290 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20  , "PATTERN");.  
2b2a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b2b0 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46  OR;.  }.  hFindF
2b2c0 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46  ile = FindFirstF
2b2d0 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
2b2e0 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66  ode(objv[1]), &f
2b2f0 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20  indData);.  if( 
2b300 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c  hFindFile==INVAL
2b310 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
2b320 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2b330 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2b340 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2b350 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
2b360 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
2b370 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b380 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  listObj = Tcl_Ne
2b390 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e  wObj();.  Tcl_In
2b3a0 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f  crRefCount(listO
2b3b0 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  bj);.  do {.    
2b3c0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b3d0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b3e0 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
2b3f0 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20  wUnicodeObj(.   
2b400 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46       findData.cF
2b410 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ileName, -1));. 
2b420 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2b430 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2b440 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c  rp, listObj, Tcl
2b450 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a  _NewWideIntObj(.
2b460 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61          findData
2b470 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
2b480 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20  s));.  } while( 
2b490 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46  FindNextFileW(hF
2b4a0 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61  indFile, &findDa
2b4b0 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72  ta) );.  lastErr
2b4c0 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
2b4d0 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45  r();.  if( lastE
2b4e0 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26  rrno!=NO_ERROR &
2b4f0 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
2b500 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53  OR_NO_MORE_FILES
2b510 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73   ){.    FindClos
2b520 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
2b530 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2b540 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20  nt(listObj);.   
2b550 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2b560 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2b570 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
2b580 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
2b590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b5a0 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c  OR;.  }.  FindCl
2b5b0 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
2b5c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2b5d0 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  lt(interp, listO
2b5e0 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  bj);.  return TC
2b5f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2b600 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32      delete_win32
2b610 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a  _file FILENAME.*
2b620 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65  *.** Deletes the
2b630 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
2b640 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2b650 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
2b660 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68  exceed 260.** ch
2b670 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2b680 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2b690 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2b6a0 63 20 69 6e 74 20 77 69 6e 33 32 5f 64 65 6c 65  c int win32_dele
2b6b0 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20  te_file(.  void 
2b6c0 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2b6d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b6e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2b6f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b700 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2b710 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2b720 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2b730 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2b740 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20   "FILENAME");.  
2b750 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b760 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44  OR;.  }.  if( !D
2b770 65 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47  eleteFileW(Tcl_G
2b780 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2b790 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  ])) ){.    Tcl_S
2b7a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2b7b0 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
2b7c0 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72  ntObj(GetLastErr
2b7d0 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75  or()));.    retu
2b7e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b7f0 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  }.  Tcl_ResetRes
2b800 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72  ult(interp);.  r
2b810 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b820 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65  ./*.**      make
2b830 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2b840 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74  TORY.**.** Creat
2b850 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2b860 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2b870 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2b880 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2b890 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2b8a0 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2b8b0 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2b8c0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2b8d0 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20   win32_mkdir(.  
2b8e0 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2b8f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2b900 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2b910 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2b920 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2b930 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2b940 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2b950 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2b960 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59  objv, "DIRECTORY
2b970 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2b980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b990 69 66 28 20 21 43 72 65 61 74 65 44 69 72 65 63  if( !CreateDirec
2b9a0 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69  toryW(Tcl_GetUni
2b9b0 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  code(objv[1]), N
2b9c0 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ULL) ){.    Tcl_
2b9d0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2b9e0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2b9f0 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2ba00 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2ba10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ba20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
2ba30 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2ba40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ba50 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d  ../*.**      rem
2ba60 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49  ove_win32_dir DI
2ba70 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65  RECTORY.**.** Re
2ba80 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69 66  moves the specif
2ba90 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77  ied directory, w
2baa0 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2bab0 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2bac0 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72  ceed 248.** char
2bad0 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2bae0 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2baf0 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2bb00 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64 69 72 28  int win32_rmdir(
2bb10 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2bb20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2bb30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2bb40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2bb50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2bb60 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2bb70 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2bb80 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2bb90 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54  1, objv, "DIRECT
2bba0 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORY");.    retur
2bbb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2bbc0 0a 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69  .  if( !RemoveDi
2bbd0 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74  rectoryW(Tcl_Get
2bbe0 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2bbf0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2bc00 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2bc10 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2bc20 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2bc30 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2bc40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bc50 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2bc60 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2bc70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2bc80 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  ndif.../*.**    
2bc90 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63    optimization_c
2bca0 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f  ontrol DB OPT BO
2bcb0 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62  OLEAN.**.** Enab
2bcc0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75  le or disable qu
2bcd0 65 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ery optimization
2bce0 73 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  s using the sqli
2bcf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2bd00 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
2bd10 20 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f    Disable if BOO
2bd20 4c 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e  LEAN is false an
2bd30 64 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c  d enable if BOOL
2bd40 45 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20  EAN is true..** 
2bd50 4f 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20  OPT is the name 
2bd60 6f 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  of the optimizat
2bd70 69 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ion to be disabl
2bd80 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2bd90 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63  t optimization_c
2bda0 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a  ontrol(.  void *
2bdb0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2bdc0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bdd0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2bde0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bdf0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2be00 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
2be10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2be20 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66  zOpt;.  int onof
2be30 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20  f;.  int mask = 
2be40 30 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  0;.  static cons
2be50 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
2be60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e  onst char *zOptN
2be70 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73  ame;.    int mas
2be80 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20  k;.  } aOpt[] = 
2be90 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20  {.    { "all",  
2bea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2beb0 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20  QLITE_AllOpts   
2bec0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e       },.    { "n
2bed0 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  one",           
2bee0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
2bef0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bf00 20 20 7b 20 22 71 75 65 72 79 2d 66 6c 61 74 74    { "query-flatt
2bf10 65 6e 65 72 22 2c 20 20 20 20 20 53 51 4c 49 54  ener",     SQLIT
2bf20 45 5f 51 75 65 72 79 46 6c 61 74 74 65 6e 65 72  E_QueryFlattener
2bf30 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d   },.    { "colum
2bf40 6e 2d 63 61 63 68 65 22 2c 20 20 20 20 20 20 20  n-cache",       
2bf50 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
2bf60 63 68 65 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  che    },.    { 
2bf70 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c  "groupby-order",
2bf80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72         SQLITE_Gr
2bf90 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a  oupByOrder   },.
2bfa0 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f      { "factor-co
2bfb0 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c  nstants",    SQL
2bfc0 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e  ITE_FactorOutCon
2bfd0 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73  st },.    { "dis
2bfe0 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20  tinct-opt",     
2bff0 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e     SQLITE_Distin
2c000 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20  ctOpt    },.    
2c010 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61  { "cover-idx-sca
2c020 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  n",      SQLITE_
2c030 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d  CoverIdxScan   }
2c040 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62  ,.    { "order-b
2c050 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53  y-idx-join",   S
2c060 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
2c070 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74  Join },.    { "t
2c080 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20  ransitive",     
2c090 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e       SQLITE_Tran
2c0a0 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20  sitive     },.  
2c0b0 20 20 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f    { "subquery-co
2c0c0 72 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54  routine",  SQLIT
2c0d0 45 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20  E_SubqCoroutine 
2c0e0 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d   },.    { "omit-
2c0f0 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20  noop-join",     
2c100 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70   SQLITE_OmitNoop
2c110 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Join   },.    { 
2c120 22 73 74 61 74 33 22 2c 20 20 20 20 20 20 20 20  "stat3",        
2c130 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74         SQLITE_St
2c140 61 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a  at34         },.
2c150 20 20 20 20 7b 20 22 73 74 61 74 34 22 2c 20 20      { "stat4",  
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2c170 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20 20  ITE_Stat34      
2c180 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66     },.  };..  if
2c190 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2c1a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2c1b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2c1c0 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45  v, "DB OPT BOOLE
2c1d0 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
2c1e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2c1f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2c200 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2c210 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2c220 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2c230 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2c240 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
2c250 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2c260 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29  objv[3], &onoff)
2c270 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2c280 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63  ROR;.  zOpt = Tc
2c290 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2c2a0 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
2c2b0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2c2c0 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2c2d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
2c2e0 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74  trcmp(zOpt, aOpt
2c2f0 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30  [i].zOptName)==0
2c300 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d   ){.      mask =
2c310 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20   aOpt[i].mask;. 
2c320 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2c330 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66  }.  }.  if( onof
2c340 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b  f ) mask = ~mask
2c350 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  ;.  if( i>=sizeo
2c360 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2c370 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  Opt[0]) ){.    T
2c380 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2c390 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
2c3a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20   optimization - 
2c3b0 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
2c3c0 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  :",.            
2c3d0 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29           (char*)
2c3e0 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0);.    for(i=0;
2c3f0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f   i<sizeof(aOpt)/
2c400 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b  sizeof(aOpt[0]);
2c410 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c   i++){.      Tcl
2c420 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2c430 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b  terp, " ", aOpt[
2c440 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68  i].zOptName, (ch
2c450 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ar*)0);.    }.  
2c460 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c470 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OR;.  }.  sqlite
2c480 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2c490 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
2c4a0 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62  PTIMIZATIONS, db
2c4b0 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72  , mask);.  retur
2c4c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 74 79 70  n TCL_OK;.}..typ
2c4d0 65 64 65 66 20 73 74 72 75 63 74 20 73 71 6c 69  edef struct sqli
2c4e0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2c4f0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2c500 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20 20 20 20  tines;./*.**    
2c510 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74   load_static_ext
2c520 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d 45 20 2e  ension DB NAME .
2c530 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64 20 6f 6e  ...**.** Load on
2c540 65 20 6f 72 20 6d 6f 72 65 20 73 74 61 74 69 63  e or more static
2c550 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65 78 74 65  ally linked exte
2c560 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  nsions..*/.stati
2c570 63 20 69 6e 74 20 74 63 6c 4c 6f 61 64 53 74 61  c int tclLoadSta
2c580 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64 28  ticExtensionCmd(
2c590 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2c5a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2c5b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2c5c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2c5d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2c5e0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
2c5f0 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69  sqlite3_amatch_i
2c600 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c610 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c620 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c630 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c640 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69  qlite3_closure_i
2c650 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c660 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c670 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c680 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c690 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74  qlite3_eval_init
2c6a0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2c6b0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2c6c0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2c6d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2c6e0 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
2c6f0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2c700 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2c710 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2c720 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2c730 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73  e3_fuzzer_init(s
2c740 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2c750 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2c760 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2c770 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c780 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c 69  3_ieee_init(sqli
2c790 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2c7a0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2c7b0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2c7c0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e  rn int sqlite3_n
2c7d0 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71 6c  extchar_init(sql
2c7e0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2c7f0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2c800 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2c810 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2c820 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28  percentile_init(
2c830 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2c840 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2c850 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2c860 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2c870 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 28 73  e3_regexp_init(s
2c880 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2c890 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2c8a0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2c8b0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c8c0 33 5f 73 65 72 69 65 73 5f 69 6e 69 74 28 73 71  3_series_init(sq
2c8d0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2c8e0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2c8f0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2c900 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2c910 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73  _spellfix_init(s
2c920 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2c930 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2c940 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2c950 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2c960 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71  3_totype_init(sq
2c970 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2c980 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2c990 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
2c9a0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2c9b0 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69  _wholenumber_ini
2c9c0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2c9d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2c9e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2c9f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2ca00 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
2ca10 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65  t char *zExtName
2ca20 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69  ;.    int (*pIni
2ca30 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  t)(sqlite3*,char
2ca40 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2ca50 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2ca60 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b  .  } aExtension[
2ca70 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61  ] = {.    { "ama
2ca80 74 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  tch",           
2ca90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61       sqlite3_ama
2caa0 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20  tch_init        
2cab0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2cac0 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20  "closure",      
2cad0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cae0 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20  _closure_init   
2caf0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2cb00 20 20 7b 20 22 65 76 61 6c 22 2c 20 20 20 20 20    { "eval",     
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2cb20 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 20 20  ite3_eval_init  
2cb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2cb40 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65 69 6f 22  ,.    { "fileio"
2cb50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cb60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f   sqlite3_fileio_
2cb70 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2cb80 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 75 7a     },.    { "fuz
2cb90 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  zer",           
2cba0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 7a       sqlite3_fuz
2cbb0 7a 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20  zer_init        
2cbc0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2cbd0 22 69 65 65 65 37 35 34 22 2c 20 20 20 20 20 20  "ieee754",      
2cbe0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cbf0 5f 69 65 65 65 5f 69 6e 69 74 20 20 20 20 20 20  _ieee_init      
2cc00 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2cc10 20 20 7b 20 22 6e 65 78 74 63 68 61 72 22 2c 20    { "nextchar", 
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2cc30 69 74 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e  ite3_nextchar_in
2cc40 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
2cc50 2c 0a 20 20 20 20 7b 20 22 70 65 72 63 65 6e 74  ,.    { "percent
2cc60 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
2cc70 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74   sqlite3_percent
2cc80 69 6c 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ile_init        
2cc90 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 67     },.    { "reg
2cca0 65 78 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  exp",           
2ccb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 67       sqlite3_reg
2ccc0 65 78 70 5f 69 6e 69 74 20 20 20 20 20 20 20 20  exp_init        
2ccd0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2cce0 22 73 65 72 69 65 73 22 2c 20 20 20 20 20 20 20  "series",       
2ccf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cd00 5f 73 65 72 69 65 73 5f 69 6e 69 74 20 20 20 20  _series_init    
2cd10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2cd20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c 20    { "spellfix", 
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2cd40 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
2cd50 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
2cd60 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65 22  ,.    { "totype"
2cd70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cd80 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f   sqlite3_totype_
2cd90 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2cda0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77 68 6f     },.    { "who
2cdb0 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20  lenumber",      
2cdc0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 68 6f       sqlite3_who
2cdd0 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 20 20 20  lenumber_init   
2cde0 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
2cdf0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2ce00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2ce10 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72  e;.  int i, j, r
2ce20 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
2ce30 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  sg = 0;.  if( ob
2ce40 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<3 ){.    Tcl_
2ce50 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2ce60 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2ce70 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20  B NAME ...");.  
2ce80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ce90 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2cea0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2ceb0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2cec0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2ced0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2cee0 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a  OR;.  for(j=2; j
2cef0 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <objc; j++){.   
2cf00 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
2cf10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b  String(objv[j]);
2cf20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2cf30 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e  ArraySize(aExten
2cf40 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sion); i++){.   
2cf50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
2cf60 61 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b  ame, aExtension[
2cf70 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20  i].zExtName)==0 
2cf80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
2cf90 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53     if( i>=ArrayS
2cfa0 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20  ize(aExtension) 
2cfb0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2cfc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2cfd0 2c 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e  , "no such exten
2cfe0 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20  sion: ", zName, 
2cff0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
2d000 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d010 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
2d020 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
2d030 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  Init ){.      rc
2d040 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d   = aExtension[i]
2d050 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  .pInit(db, &zErr
2d060 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Msg, 0);.    }el
2d070 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2d080 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d090 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2d0a0 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67  TE_OK || zErrMsg
2d0b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
2d0c0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2d0d0 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69  p, "initializati
2d0e0 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20  on of ", zName, 
2d0f0 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72  " failed: ", zEr
2d100 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
2d120 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
2d130 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
2d140 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sg);.      retur
2d150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2d160 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2d170 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2d180 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74       sorter_test
2d190 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a  _fakeheap BOOL.*
2d1a0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
2d1b0 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65  sorter_test_fake
2d1c0 68 65 61 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  heap(.  void * c
2d1d0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2d1e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d1f0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2d200 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2d210 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41  jv[].){.  int bA
2d220 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rg;.  if( objc!=
2d230 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2d240 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2d250 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c  , 1, objv, "BOOL
2d260 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2d270 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2d280 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2d290 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2d2a0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72  p, objv[1], &bAr
2d2b0 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  g) ){.    return
2d2c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2d2d0 0a 20 20 69 66 28 20 62 41 72 67 20 29 7b 0a 20  .  if( bArg ){. 
2d2e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2d2f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
2d300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2d310 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d320 2e 70 48 65 61 70 20 3d 20 53 51 4c 49 54 45 5f  .pHeap = SQLITE_
2d330 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a  INT_TO_PTR(-1);.
2d340 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2d350 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
2d360 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70  obalConfig.pHeap
2d370 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  ==SQLITE_INT_TO_
2d380 50 54 52 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  PTR(-1) ){.     
2d390 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2d3a0 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a  nfig.pHeap = 0;.
2d3b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c      }.  }..  Tcl
2d3c0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2d3d0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2d3e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2d3f0 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f      sorter_test_
2d400 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 44 42 20  sort4_helper DB 
2d410 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 0a  SQL1 NSTEP SQL2.
2d420 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51  **.** Compile SQ
2d430 4c 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c  L statement $SQL
2d440 31 20 61 6e 64 20 73 74 65 70 20 69 74 20 24 4e  1 and step it $N
2d450 53 54 45 50 20 74 69 6d 65 73 2e 20 46 6f 72 20  STEP times. For 
2d460 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68  each row, .** ch
2d470 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 66  eck that the lef
2d480 74 6d 6f 73 74 20 61 6e 64 20 72 69 67 68 74 6d  tmost and rightm
2d490 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  ost columns retu
2d4a0 72 6e 65 64 20 61 72 65 20 62 6f 74 68 20 69 6e  rned are both in
2d4b0 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74  tegers,.** and t
2d4c0 68 61 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e  hat both contain
2d4d0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e   the same value.
2d4e0 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63  .**.** Then exec
2d4f0 75 74 65 20 73 74 61 74 65 6d 65 6e 74 20 24 53  ute statement $S
2d500 51 4c 32 2e 20 43 68 65 63 6b 20 74 68 61 74 20  QL2. Check that 
2d510 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65  the statement re
2d520 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a  turns the same.*
2d530 2a 20 73 65 74 20 6f 66 20 69 6e 74 65 67 65 72  * set of integer
2d540 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72  s in the same or
2d550 64 65 72 20 61 73 20 69 6e 20 74 68 65 20 70 72  der as in the pr
2d560 65 76 69 6f 75 73 20 73 74 65 70 20 28 75 73 69  evious step (usi
2d570 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74  ng $SQL1)..*/.st
2d580 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 72 5f  atic int sorter_
2d590 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65  test_sort4_helpe
2d5a0 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
2d5b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2d5c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2d5d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2d5e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d5f0 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
2d600 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f 6e 73  r *zSql1;.  cons
2d610 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b 0a 20  t char *zSql2;. 
2d620 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20 20 69   int nStep; .  i
2d630 6e 74 20 69 53 74 65 70 3b 20 0a 20 20 69 6e 74  nt iStep; .  int
2d640 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20   iCksum1 = 0; . 
2d650 20 69 6e 74 20 69 43 6b 73 75 6d 32 20 3d 20 30   int iCksum2 = 0
2d660 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
2d670 6e 74 20 69 42 3b 0a 20 20 73 71 6c 69 74 65 33  nt iB;.  sqlite3
2d680 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *db;.  sqlite3_
2d690 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a  stmt *pStmt;.  .
2d6a0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
2d6b0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2d6c0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2d6d0 20 6f 62 6a 76 2c 20 22 44 42 20 53 51 4c 31 20   objv, "DB SQL1 
2d6e0 4e 53 54 45 50 20 53 51 4c 32 22 29 3b 0a 20 20  NSTEP SQL2");.  
2d6f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d700 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
2d710 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2d720 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2d730 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2d740 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d750 52 4f 52 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54  ROR;.  zSql1 = T
2d760 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2d770 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
2d780 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2d790 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
2d7a0 26 6e 53 74 65 70 29 20 29 20 72 65 74 75 72 6e  &nStep) ) return
2d7b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
2d7c0 71 6c 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ql2 = Tcl_GetStr
2d7d0 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20  ing(objv[4]);.. 
2d7e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2d7f0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
2d800 6c 31 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  l1, -1, &pStmt, 
2d810 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2d820 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
2d830 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20  ql_error;..  iB 
2d840 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2d850 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b  _count(pStmt)-1;
2d860 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20  .  for(iStep=0; 
2d870 69 53 74 65 70 3c 6e 53 74 65 70 20 26 26 20 53  iStep<nStep && S
2d880 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2d890 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20  e3_step(pStmt); 
2d8a0 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  iStep++){.    in
2d8b0 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  t a = sqlite3_co
2d8c0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2d8d0 30 29 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 73  0);.    if( a!=s
2d8e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2d8f0 74 28 70 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a  t(pStmt, iB) ){.
2d900 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2d910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2d920 64 61 74 61 20 65 72 72 6f 72 3a 20 28 61 21 3d  data error: (a!=
2d930 62 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72  b)", 0);.      r
2d940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d950 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73  .    }..    iCks
2d960 75 6d 31 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20  um1 += (iCksum1 
2d970 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20  << 3) + a;.  }. 
2d980 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
2d990 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2d9a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d9b0 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
2d9c0 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ror;..  rc = sql
2d9d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2d9e0 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c 20 26  db, zSql2, -1, &
2d9f0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
2da00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2da10 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
2da20 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20  .  for(iStep=0; 
2da30 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
2da40 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
2da50 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69   iStep++){.    i
2da60 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63  nt a = sqlite3_c
2da70 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2da80 20 30 29 3b 0a 20 20 20 20 69 43 6b 73 75 6d 32   0);.    iCksum2
2da90 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c 3c 20   += (iCksum2 << 
2daa0 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20 72 63  3) + a;.  }.  rc
2dab0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
2dac0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
2dad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dae0 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72  ) goto sql_error
2daf0 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75 6d 31  ;..  if( iCksum1
2db00 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20 20  !=iCksum2 ){.   
2db10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2db20 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65 63 6b  t(interp, "check
2db30 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20 30  sum mismatch", 0
2db40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2db50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2db60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
2db70 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63 6c  sql_error:.  Tcl
2db80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2db90 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72 6f 72  terp, "sql error
2dba0 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
2dbb0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 72  msg(db), 0);.  r
2dbc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2dbd0 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
2dbe0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2dbf0 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20  CATION.#include 
2dc00 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
2dc10 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .h"./*.** tclcmd
2dc20 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  :  sqlite3_user_
2dc30 61 75 74 68 65 6e 74 69 63 61 74 65 20 44 42 20  authenticate DB 
2dc40 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
2dc50 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  D.*/.static int 
2dc60 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e  test_user_authen
2dc70 74 69 63 61 74 65 28 0a 20 20 43 6c 69 65 6e 74  ticate(.  Client
2dc80 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2dc90 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
2dca0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2dcb0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2dcc0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2dcd0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2dce0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2dcf0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2dd00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2dd10 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2dd20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2dd30 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2dd40 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2dd50 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
2dd60 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
2dd70 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
2dd80 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 73  nPasswd = 0;.  s
2dd90 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2dda0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
2ddb0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
2ddc0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2ddd0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2dde0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
2ddf0 4f 52 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORD");.    retur
2de00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2de10 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2de20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2de30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2de40 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
2de50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2de60 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20  ;.  }.  zUser = 
2de70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2de80 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77  jv[2]);.  zPassw
2de90 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
2dea0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
2deb0 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 72  , &nPasswd);.  r
2dec0 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
2ded0 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 64 62  _authenticate(db
2dee0 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64  , zUser, zPasswd
2def0 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63  , nPasswd);.  Tc
2df00 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2df10 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
2df20 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
2df30 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
2df40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2df50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53  dif /* SQLITE_US
2df60 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2df70 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
2df80 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2df90 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63  ICATION./*.** tc
2dfa0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75  lcmd:  sqlite3_u
2dfb0 73 65 72 5f 61 64 64 20 44 42 20 55 53 45 52 4e  ser_add DB USERN
2dfc0 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
2dfd0 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  DMIN.*/.static i
2dfe0 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64  nt test_user_add
2dff0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2e000 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
2e010 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
2e020 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2e030 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2e040 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2e050 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2e060 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e080 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2e090 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2e0a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2e0b0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2e0c0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
2e0d0 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20  ar *zUser = 0;. 
2e0e0 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d   char *zPasswd =
2e0f0 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77   0;.  int nPassw
2e100 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41  d = 0;.  int isA
2e110 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dmin = 0;.  sqli
2e120 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
2e130 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
2e140 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
2e150 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2e160 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55  , 1, objv, "DB U
2e170 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
2e180 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20   ISADMIN");.    
2e190 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e1a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2e1b0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2e1c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2e1d0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
2e1e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e1f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73  ERROR;.  }.  zUs
2e200 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  er = Tcl_GetStri
2e210 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
2e220 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74  Passwd = Tcl_Get
2e230 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
2e240 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29  jv[3], &nPasswd)
2e250 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  ;.  Tcl_GetBoole
2e260 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
2e270 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64  , objv[4], &isAd
2e280 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  min);.  rc = sql
2e290 69 74 65 33 5f 75 73 65 72 5f 61 64 64 28 64 62  ite3_user_add(db
2e2a0 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64  , zUser, zPasswd
2e2b0 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d  , nPasswd, isAdm
2e2c0 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  in);.  Tcl_SetRe
2e2d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2e2e0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2e2f0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
2e300 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2e310 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2e320 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2e330 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23  ENTICATION */..#
2e340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
2e350 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2e360 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2e370 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
2e380 6e 67 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20  nge DB USERNAME 
2e390 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
2e3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2e3b0 65 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 28  est_user_change(
2e3c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2e3d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2e3e0 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2e3f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2e400 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2e410 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2e420 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2e430 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e450 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2e460 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2e470 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2e480 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2e490 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
2e4a0 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20  r *zUser = 0;.  
2e4b0 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20  char *zPasswd = 
2e4c0 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64  0;.  int nPasswd
2e4d0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64   = 0;.  int isAd
2e4e0 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  min = 0;.  sqlit
2e4f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
2e500 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
2e510 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2e520 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2e530 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53   1, objv, "DB US
2e540 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20  ERNAME PASSWORD 
2e550 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72  ISADMIN");.    r
2e560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e570 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2e580 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2e590 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2e5a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
2e5b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e5c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65  RROR;.  }.  zUse
2e5d0 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
2e5e0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50  g(objv[2]);.  zP
2e5f0 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53  asswd = Tcl_GetS
2e600 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
2e610 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b  v[3], &nPasswd);
2e620 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  .  Tcl_GetBoolea
2e630 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
2e640 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d   objv[4], &isAdm
2e650 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  in);.  rc = sqli
2e660 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 28  te3_user_change(
2e670 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73  db, zUser, zPass
2e680 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41  wd, nPasswd, isA
2e690 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dmin);.  Tcl_Set
2e6a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2e6b0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
2e6c0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
2e6d0 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
2e6e0 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
2e6f0 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  * SQLITE_USER_AU
2e700 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a  THENTICATION */.
2e710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
2e720 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2e730 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  ON./*.** tclcmd:
2e740 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64    sqlite3_user_d
2e750 65 6c 65 74 65 20 44 42 20 55 53 45 52 4e 41 4d  elete DB USERNAM
2e760 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  E.*/.static int 
2e770 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65  test_user_delete
2e780 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2e790 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
2e7a0 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
2e7b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2e7c0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2e7d0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2e7e0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2e7f0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2e800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e810 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2e820 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2e830 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2e840 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2e850 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
2e860 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20  ar *zUser = 0;. 
2e870 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2e880 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2e890 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
2e8a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2e8b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2e8c0 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29 3b 0a  "DB USERNAME");.
2e8d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e8e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2e8f0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2e900 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2e910 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2e920 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2e930 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e940 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
2e950 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2e960 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2e970 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62 2c 20  user_delete(db, 
2e980 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f 53 65  zUser);.  Tcl_Se
2e990 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2e9a0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
2e9b0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
2e9c0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
2e9d0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
2e9e0 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
2e9f0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
2ea00 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2ea10 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54 59 50  bad_behavior TYP
2ea20 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d 65 20  E.**.** Do some 
2ea30 74 68 69 6e 67 73 20 74 68 61 74 20 73 68 6f 75  things that shou
2ea40 6c 64 20 74 72 69 67 67 65 72 20 61 20 76 61 6c  ld trigger a val
2ea50 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e 69 74  grind or -fsanit
2ea60 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a 2a 2a  ize=undefined.**
2ea70 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69 73 20   warning.  This 
2ea80 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
2ea90 79 20 74 68 61 74 20 65 72 72 6f 72 73 20 61 6e  y that errors an
2eaa0 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74 70 75  d warnings outpu
2eab0 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20 74 6f  t by those.** to
2eac0 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ols are detected
2ead0 20 62 79 20 74 68 65 20 74 65 73 74 20 73 63 72   by the test scr
2eae0 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ipts..**.**     
2eaf0 20 20 54 59 50 45 20 20 20 20 20 20 20 42 45 48    TYPE       BEH
2eb00 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20 20 31  AVIOR.**       1
2eb10 20 20 20 20 20 20 20 20 20 20 4f 76 65 72 66 6c            Overfl
2eb20 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e 74 65  ow a signed inte
2eb30 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32 20 20  ger.**       2  
2eb40 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62 61 73          Jump bas
2eb50 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69  ed on an uniniti
2eb60 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c 65 0a  alized variable.
2eb70 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20 20 20  **       3      
2eb80 20 20 20 20 52 65 61 64 20 61 66 74 65 72 20 66      Read after f
2eb90 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34 20 20  ree.**       4  
2eba0 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a 2a 2f          Panic.*/
2ebb0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2ebc0 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20  _bad_behavior(. 
2ebd0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2ebe0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
2ebf0 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
2ec00 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
2ec10 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2ec20 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2ec30 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2ec40 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2ec50 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2ec60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2ec70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ec80 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2ec90 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2eca0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2ecb0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2ecc0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54  s */.){.  int iT
2ecd0 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a  ype;.  int xyz;.
2ece0 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a    int i = *(int*
2ecf0 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
2ed00 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30  nt j;.  int w[10
2ed10 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69  ];.  int *a;.  i
2ed20 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2ed30 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2ed40 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2ed50 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20  jv, "TYPE");.   
2ed60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ed70 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
2ed80 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2ed90 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
2eda0 26 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e  &iType) ) return
2edb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77   TCL_ERROR;.  sw
2edc0 69 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20  itch( iType ){. 
2edd0 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
2ede0 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66     xyz = 0x7ffff
2edf0 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78  f00 - i;.      x
2ee00 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20  yz += 0x100;.   
2ee10 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2ee20 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2ee30 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b  NewIntObj(xyz));
2ee40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ee50 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
2ee60 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35  {.      w[1] = 5
2ee70 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d  ;.      if( w[i]
2ee80 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20  >0 ) w[1]++;.   
2ee90 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2eea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2eeb0 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29  NewIntObj(w[1]))
2eec0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2eed0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
2eee0 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c   {.      a = mal
2eef0 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29  loc( sizeof(int)
2ef00 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  *10 );.      for
2ef10 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29  (j=0; j<10; j++)
2ef20 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20   a[j] = j;.     
2ef30 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20   free(a);.      
2ef40 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2ef50 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2ef60 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20  IntObj(a[i]));. 
2ef70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ef80 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  }.    case 4: {.
2ef90 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28        Tcl_Panic(
2efa0 22 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69  "Deliberate pani
2efb0 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  c");.      break
2efc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2efd0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20  turn TCL_OK;.}  
2efe0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2eff0 20 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61    register_dbsta
2f000 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20  t_vtab DB.**.** 
2f010 43 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74  Cause the dbstat
2f020 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
2f030 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  o be available o
2f040 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
2f050 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
2f060 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
2f070 64 62 73 74 61 74 5f 76 74 61 62 28 0a 20 20 76  dbstat_vtab(.  v
2f080 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
2f090 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f0a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2f0b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2f0c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
2f0d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2f0e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2f0f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2f100 28 69 6e 74 65 72 70 2c 20 22 64 62 73 74 61 74  (interp, "dbstat
2f110 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 62   not available b
2f120 65 63 61 75 73 65 20 6f 66 20 22 0a 20 20 20 20  ecause of ".    
2f130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f140 20 20 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f         "SQLITE_O
2f150 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2f160 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ", (void*)0);.  
2f170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f180 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
2f190 20 53 71 6c 69 74 65 44 62 20 7b 20 73 71 6c 69   SqliteDb { sqli
2f1a0 74 65 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68  te3 *db; };.  ch
2f1b0 61 72 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43  ar *zDb;.  Tcl_C
2f1c0 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
2f1d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2f1e0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2f1f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2f200 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
2f210 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f220 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20  ROR;.  }..  zDb 
2f230 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2f240 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20  objv[1]);.  if( 
2f250 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
2f260 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20  fo(interp, zDb, 
2f270 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20  &cmdInfo) ){.   
2f280 20 73 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 28   sqlite3* db = (
2f290 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
2f2a0 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
2f2b0 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20  entData)->db;.  
2f2c0 20 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52    sqlite3DbstatR
2f2d0 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d  egister(db);.  }
2f2e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2f2f0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
2f300 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2f310 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  ABLE */.}../*.**
2f320 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e   Register comman
2f330 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20  ds with the TCL 
2f340 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
2f350 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f  int Sqlitetest1_
2f360 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
2f370 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65  *interp){.  exte
2f380 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
2f390 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65  earch_count;.  e
2f3a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2f3b0 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20  3_found_count;. 
2f3c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2f3d0 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  te3_interrupt_co
2f3e0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
2f3f0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66  t sqlite3_open_f
2f400 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ile_count;.  ext
2f410 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2f420 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  sort_count;.  ex
2f430 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2f440 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23  _current_time;.#
2f450 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
2f460 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  X && defined(__A
2f470 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2f480 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2f490 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20  _STYLE.  extern 
2f4a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74  int sqlite3_host
2f4b0 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20  id_num;.#endif. 
2f4c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2f4d0 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65  te3_max_blobsize
2f4e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2f4f0 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65  qlite3BtreeShare
2f500 64 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69  dCacheReport(voi
2f510 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d*,.            
2f520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
2f540 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63  l_Interp*,int,Tc
2f550 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20  l_Obj*CONST*);. 
2f560 20 73 74 61 74 69 63 20 69 6e 74 20 69 5a 65 72   static int iZer
2f570 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  o = 0;.  static 
2f580 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
2f590 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
2f5a0 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72  Tcl_CmdProc *xPr
2f5b0 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d  oc;.  } aCmd[] =
2f5c0 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e   {.     { "db_en
2f5d0 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ter",           
2f5e0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f5f0 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65  CmdProc*)db_ente
2f600 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
2f610 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65  },.     { "db_le
2f620 61 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ave",           
2f630 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f640 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76  CmdProc*)db_leav
2f650 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
2f660 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f670 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c  e3_mprintf_int",
2f680 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f690 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f6a0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20  _mprintf_int    
2f6b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f6c0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
2f6d0 22 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ",         (Tcl_
2f6e0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f6f0 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20  _mprintf_int64  
2f700 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f710 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22  e3_mprintf_long"
2f720 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
2f730 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f740 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20  _mprintf_long   
2f750 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f760 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c  e3_mprintf_str",
2f770 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f780 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f790 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20  _mprintf_str    
2f7a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f7b0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22  e3_snprintf_str"
2f7c0 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
2f7d0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f7e0 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20  _snprintf_str   
2f7f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f800 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
2f810 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f  ly",       (Tcl_
2f820 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f830 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79  _mprintf_stronly
2f840 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f850 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
2f860 65 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  e",        (Tcl_
2f870 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f880 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20  _mprintf_double 
2f890 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f8a0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
2f8b0 64 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  d",        (Tcl_
2f8c0 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
2f8d0 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20  _mprintf_scaled 
2f8e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f8f0 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f  e3_mprintf_hexdo
2f900 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d  uble",   (Tcl_Cm
2f910 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d  dProc*)sqlite3_m
2f920 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
2f930 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f940 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
2f950 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
2f960 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70  CmdProc*)test_mp
2f970 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d  rintf_z        }
2f980 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f990 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74  3_mprintf_n_test
2f9a0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2f9b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
2f9c0 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c  intf_n        },
2f9d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2f9e0 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  _snprintf_int", 
2f9f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2fa00 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72  dProc*)test_snpr
2fa10 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a  intf_int     },.
2fa20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2fa30 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69  last_insert_rowi
2fa40 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  d",     (Tcl_Cmd
2fa50 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f  Proc*)test_last_
2fa60 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20  rowid       },. 
2fa70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2fa80 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20  xec_printf",    
2fa90 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2faa0 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70  roc*)test_exec_p
2fab0 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20  rintf      },.  
2fac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2fad0 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20  ec_hex",        
2fae0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2faf0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65  oc*)test_exec_he
2fb00 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  x         },.   
2fb10 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2fb20 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
2fb30 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2fb40 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20  c*)test_exec    
2fb50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2fb60 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2fb70 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  _nr",           
2fb80 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2fb90 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20  *)test_exec_nr  
2fba0 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64          },.#ifnd
2fbb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47  ef SQLITE_OMIT_G
2fbc0 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20  ET_TABLE.     { 
2fbd0 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62  "sqlite3_get_tab
2fbe0 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  le_printf",     
2fbf0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2fc00 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  est_get_table_pr
2fc10 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  intf },.#endif. 
2fc20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2fc30 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20  lose",          
2fc40 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2fc50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74  roc*)sqlite_test
2fc60 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20  _close     },.  
2fc70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
2fc80 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20  ose_v2",        
2fc90 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2fca0 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
2fcb0 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20  close_v2  },.   
2fcc0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
2fcd0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ate_function",  
2fce0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2fcf0 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66  c*)test_create_f
2fd00 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20  unction  },.    
2fd10 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2fd20 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20  te_aggregate",  
2fd30 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2fd40 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67  *)test_create_ag
2fd50 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20  gregate },.     
2fd60 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74  { "sqlite_regist
2fd70 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
2fd80 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a  ", (Tcl_CmdProc*
2fd90 29 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66  )test_register_f
2fda0 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  unc    },.     {
2fdb0 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c   "sqlite_abort",
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fdd0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2fde0 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20  sqlite_abort    
2fdf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2fe00 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20  "sqlite_bind",  
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2fe30 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20  est_bind        
2fe40 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2fe50 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20  breakpoint",    
2fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe70 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2fe80 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20  st_breakpoint   
2fe90 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2fea0 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20  qlite3_key",    
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2fec0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2fed0 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  t_key           
2fee0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2fef0 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20  lite3_rekey",   
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2ff10 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2ff20 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20  _rekey          
2ff30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2ff40 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20  ite_set_magic", 
2ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2ff60 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
2ff70 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20  e_set_magic     
2ff80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2ff90 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20  te3_interrupt", 
2ffa0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2ffb0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69  _CmdProc*)test_i
2ffc0 6e 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20  nterrupt        
2ffd0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ffe0 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
2fff0 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  n",        (Tcl_
30000 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f  CmdProc*)delete_
30010 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d  function       }
30020 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30030 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f  _delete_collatio
30040 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  n",       (Tcl_C
30050 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63  mdProc*)delete_c
30060 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c  ollation      },
30070 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30080 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22  _get_autocommit"
30090 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
300a0 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63  dProc*)get_autoc
300b0 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a  ommit        },.
300c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
300d0 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20  stack_used",    
300e0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
300f0 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b  Proc*)test_stack
30100 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20  _used       },. 
30110 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
30120 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20  usy_timeout",   
30130 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
30140 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74  roc*)test_busy_t
30150 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20  imeout     },.  
30160 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20     { "printf",  
30170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30180 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
30190 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20  oc*)test_printf 
301a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
301b0 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72    { "sqlite3IoTr
301c0 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
301d0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
301e0 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20  )test_io_trace  
301f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
30200 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65   "clang_sanitize
30210 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20  _address",      
30220 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
30230 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61  clang_sanitize_a
30240 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20  ddress },.  };. 
30250 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
30260 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
30270 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43  e;.     Tcl_ObjC
30280 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
30290 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74      void *client
302a0 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d  Data;.  } aObjCm
302b0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
302c0 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20 20  bad_behavior",  
302d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
302e0 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f  test_bad_behavio
302f0 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65 72  r,  (void*)&iZer
30300 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 67  o },.     { "reg
30310 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61  ister_dbstat_vta
30320 62 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  b",          tes
30330 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74 61  t_register_dbsta
30340 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20 20  t_vtab  },.     
30350 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
30360 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
30370 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
30380 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
30390 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
303a0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
303b0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
303c0 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
303d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
303e0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
303f0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
30400 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
30410 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
30420 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 22 2c 20  nd_zeroblob64", 
30430 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
30440 7a 65 72 6f 62 6c 6f 62 36 34 2c 20 30 20 7d 2c  zeroblob64, 0 },
30450 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30460 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20  _bind_int64",   
30470 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
30480 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d  nd_int64,    0 }
30490 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
304a0 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20  3_bind_double", 
304b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
304c0 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20  ind_double,   0 
304d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
304e0 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20  e3_bind_null",  
304f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30500 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30  bind_null     ,0
30510 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30520 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20  te3_bind_text", 
30530 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30540 5f 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c  _bind_text     ,
30550 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30560 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36  ite3_bind_text16
30570 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
30580 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20  t_bind_text16   
30590 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
305a0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22  lite3_bind_blob"
305b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
305c0 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20  st_bind_blob    
305d0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
305e0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
305f0 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74  meter_count",  t
30600 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
30610 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20  er_count, 0},.  
30620 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
30630 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
30640 65 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f  e",   test_bind_
30650 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20  parameter_name, 
30660 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
30670 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
30680 74 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73  ter_index",  tes
30690 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
306a0 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20  _index, 0},.    
306b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61   { "sqlite3_clea
306c0 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20  r_bindings",    
306d0 20 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62      test_clear_b
306e0 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20  indings, 0},.   
306f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65    { "sqlite3_sle
30700 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ep",            
30710 20 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c       test_sleep,
30720 20 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20            0},.  
30730 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
30740 72 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20  rcode",         
30750 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f        test_errco
30760 64 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  de       ,0 },. 
30770 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30780 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22  xtended_errcode"
30790 2c 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65  ,      test_ex_e
307a0 72 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a  rrcode    ,0 },.
307b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
307c0 65 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20  errmsg",        
307d0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
307e0 6d 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  msg        ,0 },
307f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30800 5f 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20  _errmsg16",     
30810 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72           test_er
30820 72 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d  rmsg16      ,0 }
30830 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30840 33 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20  3_open",        
30850 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
30860 70 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20  pen          ,0 
30870 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30880 65 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20  e3_open16",     
30890 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
308a0 6f 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30  open16        ,0
308b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
308c0 74 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20  te3_open_v2",   
308d0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
308e0 5f 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c  _open_v2       ,
308f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30900 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22  ite3_complete16"
30910 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
30920 74 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20  t_complete16    
30930 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
30940 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c  qlite3_prepare",
30950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
30960 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20  est_prepare     
30970 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30980 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
30990 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
309a0 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20  test_prepare16  
309b0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
309c0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
309d0 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
309e0 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
309f0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
30a00 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
30a10 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20  e_tkt3134",     
30a20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74    test_prepare_t
30a30 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20  kt3134, 0},.    
30a40 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
30a50 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20  are16_v2",      
30a60 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
30a70 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20  16_v2  ,0 },.   
30a80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
30a90 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
30aa0 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
30ab0 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
30ac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
30ad0 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20  mt_status",     
30ae0 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
30af0 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20  status   ,0 },. 
30b00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
30b10 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
30b20 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
30b30 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
30b40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30b50 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
30b60 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
30b70 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
30b80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30b90 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
30ba0 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
30bb0 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
30bc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30bd0 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
30be0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
30bf0 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
30c00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30c10 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
30c20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30c30 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
30c40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30c50 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20  te3_sql",       
30c60 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30c70 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c  _sql           ,
30c80 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30c90 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c  ite3_next_stmt",
30ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
30cb0 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20  t_next_stmt     
30cc0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
30cd0 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
30ce0 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74 65  nly",         te
30cf0 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  st_stmt_readonly
30d00 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30d10 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
30d20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
30d30 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20  est_stmt_busy   
30d40 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30d50 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
30d60 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
30d70 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
30d80 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20  l ,0 },..     { 
30d90 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65  "sqlite3_release
30da0 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20  _memory",       
30db0 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65   test_release_me
30dc0 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20  mory,     0},.  
30dd0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
30de0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22  _release_memory"
30df0 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65  ,     test_db_re
30e00 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30  lease_memory,  0
30e10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30e20 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  e3_db_cacheflush
30e30 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
30e40 64 62 5f 63 61 63 68 65 66 6c 75 73 68 2c 20 20  db_cacheflush,  
30e50 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
30e60 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
30e70 61 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ame",           
30e80 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  test_db_filename
30e90 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
30ea0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
30eb0 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20  readonly",      
30ec0 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 61       test_db_rea
30ed0 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20 20 30 7d  donly,        0}
30ee0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30ef0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
30f00 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73  t",       test_s
30f10 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20  oft_heap_limit, 
30f20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
30f30 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
30f40 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74  eanup",        t
30f50 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
30f60 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  up,     0},.    
30f70 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65   { "sqlite3_page
30f80 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20  r_refcounts",   
30f90 20 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72      test_pager_r
30fa0 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c  efcounts,    0},
30fb0 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
30fc0 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
30fd0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c  ",        test_l
30fe0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20  oad_extension,  
30ff0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
31000 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
31010 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74  ad_extension", t
31020 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c  est_enable_load,
31030 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
31040 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
31050 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
31060 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65  s", test_extende
31070 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20  d_result_codes, 
31080 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
31090 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  te3_limit",     
310a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
310b0 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  _limit,         
310c0 20 20 20 20 20 20 20 20 30 7d 2c 0a 0a 20 20 20          0},..   
310d0 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67 5f 73    { "save_prng_s
310e0 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  tate",          
310f0 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67 5f 73       save_prng_s
31100 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20  tate,    0 },.  
31110 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f 70 72     { "restore_pr
31120 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20  ng_state",      
31130 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f 70 72        restore_pr
31140 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20  ng_state, 0 },. 
31150 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70 72 6e      { "reset_prn
31160 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20  g_state",       
31170 20 20 20 20 20 20 20 72 65 73 65 74 5f 70 72 6e         reset_prn
31180 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a  g_state,   0 },.
31190 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
311a0 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22 2c  _never_corrupt",
311b0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
311c0 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 2c 20  _never_corrupt, 
311d0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61  0},.     { "data
311e0 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  base_may_be_corr
311f0 75 70 74 22 2c 20 20 20 20 20 20 20 64 61 74 61  upt",       data
31200 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72  base_may_be_corr
31210 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  upt, 0},.     { 
31220 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f  "optimization_co
31230 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20  ntrol",         
31240 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f   optimization_co
31250 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51  ntrol,0},.#if SQ
31260 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20  LITE_OS_WIN.    
31270 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66   { "lock_win32_f
31280 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
31290 20 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c      win32_file_l
312a0 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  ock,    0 },.   
312b0 20 20 7b 20 22 65 78 69 73 74 73 5f 77 69 6e 33    { "exists_win3
312c0 32 5f 70 61 74 68 22 2c 20 20 20 20 20 20 20 20  2_path",        
312d0 20 20 20 20 20 77 69 6e 33 32 5f 65 78 69 73 74       win32_exist
312e0 73 5f 70 61 74 68 2c 20 20 30 20 7d 2c 0a 20 20  s_path,  0 },.  
312f0 20 20 20 7b 20 22 66 69 6e 64 5f 77 69 6e 33 32     { "find_win32
31300 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  _file",         
31310 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6e 64        win32_find
31320 5f 66 69 6c 65 2c 20 20 20 20 30 20 7d 2c 0a 20  _file,    0 },. 
31330 20 20 20 20 7b 20 22 64 65 6c 65 74 65 5f 77 69      { "delete_wi
31340 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20  n32_file",      
31350 20 20 20 20 20 20 20 77 69 6e 33 32 5f 64 65 6c         win32_del
31360 65 74 65 5f 66 69 6c 65 2c 20 20 30 20 7d 2c 0a  ete_file,  0 },.
31370 20 20 20 20 20 7b 20 22 6d 61 6b 65 5f 77 69 6e       { "make_win
31380 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20  32_dir",        
31390 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 6d 6b          win32_mk
313a0 64 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  dir,        0 },
313b0 0a 20 20 20 20 20 7b 20 22 72 65 6d 6f 76 65 5f  .     { "remove_
313c0 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20  win32_dir",     
313d0 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 72           win32_r
313e0 6d 64 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d  mdir,        0 }
313f0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
31400 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20  "tcl_objproc",  
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20   runAsObjProc,  
31430 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20       0 },..     
31440 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  /* sqlite3_colum
31450 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20  n_*() API */.   
31460 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
31470 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20  umn_count",     
31480 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
31490 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20  _count  ,0 },.  
314a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61     { "sqlite3_da
314b0 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  ta_count",      
314c0 20 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f        test_data_
314d0 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20  count    ,0 },. 
314e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
314f0 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20  olumn_type",    
31500 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
31510 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a  mn_type   ,0 },.
31520 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31530 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20  column_blob",   
31540 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
31550 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c  umn_blob   ,0 },
31560 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31570 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c  _column_double",
31580 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
31590 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d  lumn_double ,0 }
315a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
315b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c  3_column_int64",
315c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
315d0 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20  olumn_int64  ,0 
315e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
315f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c  e3_column_text",
31600 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66     test_stmt_utf
31610 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  8,  (void*)sqlit
31620 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d  e3_column_text }
31630 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31640 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20  3_column_name", 
31650 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
31660 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
31670 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c  3_column_name },
31680 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31690 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20  _column_int",   
316a0 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
316b0 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
316c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a  _column_int  },.
316d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
316e0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20  column_bytes",  
316f0 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
31700 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
31710 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23  column_bytes},.#
31720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31730 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20  IT_DECLTYPE.    
31740 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
31750 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73  mn_decltype",tes
31760 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
31770 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31780 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e  n_decltype},.#en
31790 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
317a0 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
317b0 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69  METADATA.{ "sqli
317c0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
317d0 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73  ase_name",test_s
317e0 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
317f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
31800 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b  atabase_name},.{
31810 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
31820 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73  _table_name",tes
31830 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
31840 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31850 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b  n_table_name},.{
31860 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
31870 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65  _origin_name",te
31880 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f  st_stmt_utf8,(vo
31890 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
318a0 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c  mn_origin_name},
318b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
318c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
318d0 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  16.     { "sqlit
318e0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
318f0 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e  6", test_stmt_in
31900 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  t, (void*)sqlite
31910 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
31920 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
31930 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
31940 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
31950 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
31960 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
31970 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  16},.     { "sql
31980 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
31990 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  16",  test_stmt_
319a0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
319b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
319c0 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64  e16},.     { "ad
319d0 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
319e0 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64  _collations", ad
319f0 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74  d_alignment_test
31a00 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20  _collations, 0  
31a10 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
31a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
31a30 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  YPE.     { "sqli
31a40 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
31a50 79 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74  ype16",test_stmt
31a60 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71  _utf16,(void*)sq
31a70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
31a80 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66  ltype16},.#endif
31a90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
31aa0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
31ab0 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f  ADATA.{"sqlite3_
31ac0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
31ad0 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f  name16",.  test_
31ae0 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
31af0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31b00 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31  n_database_name1
31b10 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
31b20 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
31b30 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  6", test_stmt_ut
31b40 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
31b50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
31b60 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
31b70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
31b80 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  n_name16", test_
31b90 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
31ba0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31bb0 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d  n_origin_name16}
31bc0 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  ,.#endif.#endif.
31bd0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31be0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
31bf0 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74  _v2", test_creat
31c00 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20  e_collation_v2, 
31c10 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
31c20 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
31c30 76 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67  ver",     test_g
31c40 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30  lobal_recover, 0
31c50 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f     },.     { "wo
31c60 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22  rking_64bit_int"
31c70 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69  ,          worki
31c80 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20  ng_64bit_int,   
31c90 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
31ca0 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c  fs_unlink_test",
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f              vfs_
31cc0 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20  unlink_test,    
31cd0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
31ce0 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73  vfs_initfail_tes
31cf0 74 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73  t",          vfs
31d00 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20  _initfail_test, 
31d10 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
31d20 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f  "vfs_unregister_
31d30 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
31d40 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
31d50 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
31d60 20 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72   "vfs_reregister
31d70 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76  _all",         v
31d80 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
31d90 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  l,  0   },.     
31da0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
31db0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20  test",          
31dc0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
31dd0 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  t,   0   },.    
31de0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
31df0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 22  _lasterrno_test"
31e00 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  , file_control_l
31e10 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20  asterrno_test,  
31e20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
31e30 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
31e40 70 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69 6c  proxy_test", fil
31e50 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72  e_control_lockpr
31e60 6f 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20 7d  oxy_test,  0   }
31e70 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
31e80 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
31e90 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
31ea0 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
31eb0 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
31ec0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
31ed0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 22  l_sizehint_test"
31ee0 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ,  file_control_
31ef0 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20 20  sizehint_test,  
31f00 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c 49   0   },.#if SQLI
31f10 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b  TE_OS_WIN.     {
31f20 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77   "file_control_w
31f30 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c 20  in32_av_retry", 
31f40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
31f50 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30 20  32_av_retry,  0 
31f60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
31f70 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
31f80 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69 6c  set_handle", fil
31f90 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
31fa0 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20 7d  set_handle, 0  }
31fb0 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
31fc0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65  "file_control_pe
31fd0 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66  rsist_wal",    f
31fe0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
31ff0 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20  ist_wal,     0  
32000 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
32010 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
32020 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69  fe_overwrite",fi
32030 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
32040 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30  safe_overwrite,0
32050 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
32060 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22  control_vfsname"
32070 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f  ,        file_co
32080 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20  ntrol_vfsname,  
32090 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20         0   },.  
320a0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
320b0 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 22  ol_tempfilename"
320c0 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ,   file_control
320d0 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20 20  _tempfilename,  
320e0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
320f0 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73  "sqlite3_vfs_lis
32100 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66  t",           vf
32110 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20  s_list,     0   
32120 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32130 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
32140 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65  on_v2", test_cre
32150 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c  ate_function_v2,
32160 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46   0 },..     /* F
32170 75 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73  unctions from os
32180 2e 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .h */.#ifndef SQ
32190 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
321a0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
321b0 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20  _collate",      
321c0 20 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20    test_collate, 
321d0 30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  0            },.
321e0 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
321f0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22  _collate_needed"
32200 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  , test_collate_n
32210 65 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a  eeded, 0     },.
32220 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
32230 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20  _function",     
32240 20 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c    test_function,
32250 20 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a   0           },.
32260 20 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74       { "add_test
32270 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
32280 65 22 2c 20 20 20 20 74 65 73 74 5f 75 74 66 31  e",    test_utf1
32290 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c 20 30 20  6bin_collate, 0 
322a0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
322b0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
322c0 5f 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20  _test_errstr",  
322d0 20 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20     test_errstr, 
322e0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  0             },
322f0 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72  .     { "tcl_var
32300 69 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20  iable_type",    
32310 20 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f     tcl_variable_
32320 74 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c  type, 0       },
32330 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32340 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
32350 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
32360 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
32370 63 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61  cache", test_ena
32380 62 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d  ble_shared, 0  }
32390 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
323a0 33 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72  3_shared_cache_r
323b0 65 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42  eport", sqlite3B
323c0 74 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52  treeSharedCacheR
323d0 65 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69  eport, 0},.#endi
323e0 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
323f0 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
32400 62 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65  ber", test_libve
32410 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20  rsion_number, 0 
32420 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32430 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
32440 5f 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74  _metadata", test
32450 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
32460 74 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 69  tadata, 0  },.#i
32470 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32480 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
32490 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  { "sqlite3_blob_
324a0 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c  reopen", test_bl
324b0 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c  ob_reopen, 0  },
324c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
324d0 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20  pcache_stats",  
324e0 20 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65       test_pcache
324f0 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69  _stats, 0  },.#i
32500 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
32510 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
32520 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32530 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  _unlock_notify",
32540 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
32550 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  ify, 0  },.#endi
32560 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
32570 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
32580 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68  ",   test_wal_ch
32590 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a  eckpoint, 0  },.
325a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
325b0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
325c0 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  2",test_wal_chec
325d0 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c  kpoint_v2, 0  },
325e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
325f0 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
32600 69 6e 74 22 2c 74 65 73 74 5f 77 61 6c 5f 61 75  int",test_wal_au
32610 74 6f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20  tocheckpoint, 0 
32620 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74   },.     { "test
32630 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20  _sqlite3_log",  
32640 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69         test_sqli
32650 74 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23  te3_log, 0  },.#
32660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32670 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20  IT_EXPLAIN.     
32680 7b 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e  { "print_explain
32690 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65  _query_plan", te
326a0 73 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20  st_print_eqp, 0 
326b0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
326c0 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
326d0 63 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74  control", test_t
326e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23  est_control },.#
326f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
32700 58 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73  X.     { "getrus
32710 61 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75  age", test_getru
32720 73 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  sage },.#endif. 
32730 20 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74      { "load_stat
32740 69 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74  ic_extension", t
32750 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
32760 6e 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20  nsionCmd },.    
32770 20 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f   { "sorter_test_
32780 66 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65  fakeheap", sorte
32790 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20  r_test_fakeheap 
327a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65  },.     { "sorte
327b0 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
327c0 70 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73  per", sorter_tes
327d0 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d  t_sort4_helper }
327e0 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ,.#ifdef SQLITE_
327f0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
32800 49 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  ION.     { "sqli
32810 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
32820 69 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73 65  icate", test_use
32830 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c 20  r_authenticate, 
32840 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32850 69 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c 20  ite3_user_add", 
32860 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 75 73           test_us
32870 65 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20 20  er_add,         
32880 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
32890 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
328a0 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75  e",       test_u
328b0 73 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20 20  ser_change,     
328c0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
328d0 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
328e0 74 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  te",       test_
328f0 75 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20 20  user_delete,    
32900 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
32910 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
32920 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
32930 54 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  TUS.     { "sqli
32940 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
32950 74 75 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  tus",       test
32960 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
32970 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
32980 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63  "sqlite3_stmt_sc
32990 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22 2c  anstatus_reset",
329a0 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73   test_stmt_scans
329b0 74 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20 30  tatus_reset,   0
329c0 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   },.#endif.#ifde
329d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
329e0 53 51 4c 4c 4f 47 0a 20 20 20 20 20 7b 20 22 73  SQLLOG.     { "s
329f0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 71  qlite3_config_sq
32a00 6c 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74  llog",         t
32a10 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f  est_config_sqllo
32a20 67 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66  g,   0 },.#endif
32a30 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 63 75 72  .     { "vfs_cur
32a40 72 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34 22  rent_time_int64"
32a50 2c 20 20 20 20 20 20 20 20 20 20 20 76 66 73 43  ,           vfsC
32a60 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
32a70 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73     0 },.  };.  s
32a80 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73  tatic int bitmas
32a90 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  k_size = sizeof(
32aa0 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 73 74  Bitmask)*8;.  st
32ab0 61 74 69 63 20 69 6e 74 20 6c 6f 6e 67 64 6f 75  atic int longdou
32ac0 62 6c 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f  ble_size = sizeo
32ad0 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50  f(LONGDOUBLE_TYP
32ae0 45 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 65  E);.  int i;.  e
32af0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
32b00 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73 71  3_sync_count, sq
32b10 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
32b20 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
32b30 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
32b40 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  emp_count;.  ext
32b50 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32b60 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  like_count;.  ex
32b70 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32b80 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a  _xferopt_count;.
32b90 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
32ba0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
32bb0 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  b_count;.  exter
32bc0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
32bd0 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
32be0 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
32bf0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
32c00 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66 20  itej_count;.#if 
32c10 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
32c20 65 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61  extern LONG vola
32c30 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73 5f  tile sqlite3_os_
32c40 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  type;.#endif.#if
32c50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
32c60 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
32c70 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 3b  lite3WhereTrace;
32c80 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
32c90 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20 20  lite3OSTrace;.  
32ca0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
32cb0 65 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64  e3WalTrace;.#end
32cc0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
32cd0 5f 54 45 53 54 0a 23 69 66 64 65 66 20 53 51 4c  _TEST.#ifdef SQL
32ce0 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a  ITE_ENABLE_FTS3.
32cf0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
32d00 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
32d10 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23 65  _parentheses;.#e
32d20 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66  ndif.#endif..  f
32d30 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
32d40 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43  (aCmd)/sizeof(aC
32d50 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  md[0]); i++){.  
32d60 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d    Tcl_CreateComm
32d70 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d 64  and(interp, aCmd
32d80 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b  [i].zName, aCmd[
32d90 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b  i].xProc, 0, 0);
32da0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
32db0 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  i<sizeof(aObjCmd
32dc0 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64  )/sizeof(aObjCmd
32dd0 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
32de0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
32df0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f 62  mand(interp, aOb
32e00 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a  jCmd[i].zName, .
32e10 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b          aObjCmd[
32e20 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d  i].xProc, aObjCm
32e30 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c  d[i].clientData,
32e40 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c   0);.  }.  Tcl_L
32e50 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32e60 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63 6f  sqlite_search_co
32e70 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
32e80 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65 61  ar*)&sqlite3_sea
32e90 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  rch_count, TCL_L
32ea0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
32eb0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
32ec0 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f  "sqlite_found_co
32ed0 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
32ee0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f 75  ar*)&sqlite3_fou
32ef0 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  nd_count, TCL_LI
32f00 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
32f10 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32f20 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e  sqlite_sort_coun
32f30 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
32f40 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  *)&sqlite3_sort_
32f50 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
32f60 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
32f70 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
32f80 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
32f90 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  e", .      (char
32fa0 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  *)&sqlite3_max_b
32fb0 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e  lobsize, TCL_LIN
32fc0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
32fd0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
32fe0 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74  qlite_like_count
32ff0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
33000 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  )&sqlite3_like_c
33010 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
33020 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
33030 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
33040 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  te_interrupt_cou
33050 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
33060 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74 65  r*)&sqlite3_inte
33070 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  rrupt_count, TCL
33080 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
33090 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
330a0 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  , "sqlite_open_f
330b0 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ile_count", .   
330c0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
330d0 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
330e0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
330f0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
33100 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
33110 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20  _current_time", 
33120 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
33130 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
33140 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ime, TCL_LINK_IN
33150 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  T);.#if SQLITE_O
33160 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
33170 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
33180 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33190 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63  CKING_STYLE.  Tc
331a0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
331b0 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69 64  , "sqlite_hostid
331c0 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28 63  _num", .      (c
331d0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f  har*)&sqlite3_ho
331e0 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49  stid_num, TCL_LI
331f0 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
33200 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
33210 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 78  terp, "sqlite3_x
33220 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20  feropt_count",. 
33230 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
33240 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite3_xferopt_cou
33250 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
33260 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
33270 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
33280 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
33290 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
332a0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67  ar*)&sqlite3_pag
332b0 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c  er_readdb_count,
332c0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
332d0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
332e0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
332f0 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
33300 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
33310 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72  *)&sqlite3_pager
33320 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20  _writedb_count, 
33330 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
33340 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
33350 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
33360 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
33370 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
33380 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  &sqlite3_pager_w
33390 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c  ritej_count, TCL
333a0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e  _LINK_INT);.#ifn
333b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
333c0 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b  UTF16.  Tcl_Link
333d0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  Var(interp, "una
333e0 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
333f0 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28 63  unter",.      (c
33400 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f  har*)&unaligned_
33410 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20  string_counter, 
33420 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
33430 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
33440 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
33450 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
33460 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61  terp, "sqlite_la
33470 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74  st_needed_collat
33480 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ion",.      (cha
33490 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c  r*)&pzNeededColl
334a0 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ation, TCL_LINK_
334b0 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f  STRING|TCL_LINK_
334c0 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64  READ_ONLY);.#end
334d0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  if.#if SQLITE_OS
334e0 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  _WIN.  Tcl_LinkV
334f0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
33500 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20  te_os_type",.   
33510 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
33520 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f  e3_os_type, TCL_
33530 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64  LINK_LONG);.#end
33540 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
33550 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73 74  _TEST.  {.    st
33560 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
33570 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22 2a  *query_plan = "*
33580 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52 49  ** OBSOLETE VARI
33590 41 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20 54  ABLE ***";.    T
335a0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
335b0 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72 79  p, "sqlite_query
335c0 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20 28  _plan",.       (
335d0 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c 61  char*)&query_pla
335e0 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
335f0 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
33600 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e 64  _ONLY);.  }.#end
33610 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
33620 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69 6e  _DEBUG.  Tcl_Lin
33630 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
33640 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63 65  lite_where_trace
33650 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
33660 26 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  &sqlite3WhereTra
33670 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
33680 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
33690 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
336a0 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20 20  _os_trace",.    
336b0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
336c0 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  3OSTrace, TCL_LI
336d0 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66  NK_INT);.#ifndef
336e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
336f0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
33700 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77  nterp, "sqlite_w
33710 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20  al_trace",.     
33720 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
33730 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  WalTrace, TCL_LI
33740 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
33750 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
33760 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
33770 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  O.  Tcl_LinkVar(
33780 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
33790 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22 2c  opentemp_count",
337a0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
337b0 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
337c0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
337d0 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  INT);.#endif.  T
337e0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
337f0 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  p, "sqlite_stati
33800 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a 20  c_bind_value",. 
33810 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
33820 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
33830 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  value, TCL_LINK_
33840 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
33850 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
33860 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
33870 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20 20  nd_nbyte",.     
33880 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
33890 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
338a0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
338b0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
338c0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
338d0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22 2c  temp_directory",
338e0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
338f0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
33900 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  ctory, TCL_LINK_
33910 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c  STRING);.  Tcl_L
33920 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
33930 73 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72 65  sqlite_data_dire
33940 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63  ctory",.      (c
33950 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64 61  har*)&sqlite3_da
33960 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43  ta_directory, TC
33970 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a  L_LINK_STRING);.
33980 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
33990 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f 73  terp, "bitmask_s
339a0 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ize",.      (cha
339b0 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a 65  r*)&bitmask_size
339c0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54  , TCL_LINK_INT|T
339d0 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
339e0 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  Y);.  Tcl_LinkVa
339f0 72 28 69 6e 74 65 72 70 2c 20 22 6c 6f 6e 67 64  r(interp, "longd
33a00 6f 75 62 6c 65 5f 73 69 7a 65 22 2c 0a 20 20 20  ouble_size",.   
33a10 20 20 20 28 63 68 61 72 2a 29 26 6c 6f 6e 67 64     (char*)&longd
33a20 6f 75 62 6c 65 5f 73 69 7a 65 2c 20 54 43 4c 5f  ouble_size, TCL_
33a30 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e  LINK_INT|TCL_LIN
33a40 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20  K_READ_ONLY);.  
33a50 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
33a60 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e 63  rp, "sqlite_sync
33a70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
33a80 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73  char*)&sqlite3_s
33a90 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
33aa0 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
33ab0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
33ac0 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e 63  "sqlite_fullsync
33ad0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
33ae0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66  char*)&sqlite3_f
33af0 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54  ullsync_count, T
33b00 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
33b10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
33b20 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26 26  _ENABLE_FTS3) &&
33b30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
33b40 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b  TEST).  Tcl_Link
33b50 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
33b60 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  ite_fts3_enable_
33b70 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20 20  parentheses",.  
33b80 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
33b90 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f  te3_fts3_enable_
33ba0 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43 4c  parentheses, TCL
33bb0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
33bc0 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
33bd0 4f 4b 3b 0a 7d 0a                                OK;.}.