/ Hex Artifact Content
Login

Artifact e0f186189b3eb8994e25430ba271e15ece38e433:


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 23 69 66 6e 64 65 66 20 53 51 4c  zDb;.#ifndef SQL
d400: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
d410: 54 45 4e 53 49 4f 4e 0a 20 20 63 68 61 72 20 2a  TENSION.  char *
d420: 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  zFile;.  char *z
d430: 50 72 6f 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Proc = 0;.#endif
d440: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
d450: 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
d460: 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  4 && objc!=3 ){.
d470: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d480: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
d490: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
d4a0: 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29 3b 0a   FILE ?PROC?");.
d4b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d4c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
d4d0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
d4e0: 6f 62 6a 76 5b 31 5d 29 3b 0a 23 69 66 6e 64 65  objv[1]);.#ifnde
d4f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
d500: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 7a  AD_EXTENSION.  z
d510: 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  File = Tcl_GetSt
d520: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
d530: 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a   if( objc==4 ){.
d540: 20 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f      zProc = Tcl_
d550: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
d560: 5d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ]);.  }.#endif..
d570: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
d580: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
d590: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
d5a0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
d5b0: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
d5c0: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
d5d0: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
d5e0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
d5f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d600: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
d610: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
d620: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
d630: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d640: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
d650: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
d660: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
d670: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
d680: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  (db);..  /* Call
d690: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
d6a0: 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61  C function. If a
d6b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
d6c0: 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20  set rc to .  ** 
d6d0: 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f  TCL_ERROR and lo
d6e0: 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72  ad any error str
d6f0: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ing into the int
d700: 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20  erpreter. If no 
d710: 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  .  ** error occu
d720: 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43  rs, set rc to TC
d730: 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  L_OK..  */.#ifde
d740: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
d750: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72  AD_EXTENSION.  r
d760: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
d770: 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  ;.  zErr = sqlit
d780: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73  e3_mprintf("this
d790: 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c   build omits sql
d7a0: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
d7b0: 69 6f 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20  ion()");.#else. 
d7c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f   rc = sqlite3_lo
d7d0: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c  ad_extension(db,
d7e0: 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26   zFile, zProc, &
d7f0: 7a 45 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zErr);.#endif.  
d800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d810: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  K ){.    Tcl_Set
d820: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
d830: 45 72 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c  Err ? zErr : "",
d840: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
d850: 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52      rc = TCL_ERR
d860: 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
d870: 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20   rc = TCL_OK;.  
d880: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
d890: 28 7a 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72  (zErr);..  retur
d8a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
d8b0: 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e  sage: sqlite3_en
d8c0: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
d8d0: 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e  ion DB-HANDLE ON
d8e0: 4f 46 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OFF.*/.static in
d8f0: 74 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f  t test_enable_lo
d900: 61 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ad(.  ClientData
d910: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
d920: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
d930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
d940: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
d950: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
d960: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
d970: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
d980: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
d990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
d9a0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
d9b0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
d9c0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
d9d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
d9e0: 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d    Tcl_CmdInfo cm
d9f0: 64 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  dInfo;.  sqlite3
da00: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44   *db;.  char *zD
da10: 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  b;.  int onoff;.
da20: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
da30: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
da40: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
da50: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
da60: 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20  LE ONOFF");.    
da70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
da80: 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
da90: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
daa0: 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72  [1]);..  /* Extr
dab0: 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62 61  act the C databa
dac0: 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74  se handle from t
dad0: 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e  he Tcl command n
dae0: 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63  ame */.  if( !Tc
daf0: 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
db00: 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
db10: 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
db20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
db30: 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
db40: 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a   not found: ", z
db50: 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Db, (char*)0);. 
db60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
db70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  ROR;.  }.  db = 
db80: 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ((struct SqliteD
db90: 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c  b*)cmdInfo.objCl
dba0: 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20  ientData)->db;. 
dbb0: 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20   assert(db);..  
dbc0: 2f 2a 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66  /* Get the onoff
dbd0: 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
dbe0: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
dbf0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
dc00: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66  , objv[2], &onof
dc10: 66 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  f) ){.    return
dc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
dc30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
dc40: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
dc50: 4f 4e 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  ON.  Tcl_AppendR
dc60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74  esult(interp, "t
dc70: 68 69 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20  his build omits 
dc80: 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
dc90: 65 6e 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65  ension()");.  re
dca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
dcb0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f  #else.  sqlite3_
dcc0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
dcd0: 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29  nsion(db, onoff)
dce0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
dcf0: 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  K;.#endif.}../*.
dd00: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
dd10: 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68  e_abort.**.** Sh
dd20: 75 74 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65  utdown the proce
dd30: 73 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ss immediately. 
dd40: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63   This is not a c
dd50: 6c 65 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a  lean shutdown..*
dd60: 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  * This command i
dd70: 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
dd80: 68 65 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74  he recoverabilit
dd90: 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
dda0: 69 6e 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20  in.** the event 
ddb0: 6f 66 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61  of a program cra
ddc0: 73 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  sh..*/.static in
ddd0: 74 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a  t sqlite_abort(.
dde0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
ddf0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
de00: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
de10: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
de20: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
de30: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
de40: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
de50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
de60: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
de70: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
de80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
de90: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
dea0: 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66  nt */.){.#if def
deb0: 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20  ined(_MSC_VER). 
dec0: 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20   /* We do this, 
ded0: 6f 74 68 65 72 77 69 73 65 20 74 68 65 20 74 65  otherwise the te
dee0: 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74  st will halt wit
def0: 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67  h a popup messag
df00: 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65 20 68  e.   * that we h
df10: 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61  ave to click awa
df20: 79 20 62 65 66 6f 72 65 20 74 68 65 20 74 65 73  y before the tes
df30: 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e  t will continue.
df40: 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62  .   */.  _set_ab
df50: 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c  ort_behavior( 0,
df60: 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55   _CALL_REPORTFAU
df70: 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65  LT );.#endif.  e
df80: 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65  xit(255);.  asse
df90: 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b  rt( interp==0 );
dfa0: 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20     /* This will 
dfb0: 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20  always fail */. 
dfc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
dfd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
dfe0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
dff0: 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64  s a user-defined
e000: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68   SQL function wh
e010: 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69  ose purpose.** i
e020: 73 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 71  s to test the sq
e030: 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28  lite_set_result(
e040: 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  ) API..*/.static
e050: 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73   void testFunc(s
e060: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
e070: 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67  context, int arg
e080: 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  c, sqlite3_value
e090: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c   **argv){.  whil
e0a0: 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  e( argc>=2 ){.  
e0b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
e0c0: 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  rg0 = (char*)sql
e0d0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
e0e0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
e0f0: 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20  ( zArg0 ){.     
e100: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
e110: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69  trICmp(zArg0, "i
e120: 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nt") ){.        
e130: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69  sqlite3_result_i
e140: 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69  nt(context, sqli
e150: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72  te3_value_int(ar
e160: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
e170: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
e180: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69  StrICmp(zArg0,"i
e190: 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  nt64")==0 ){.   
e1a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
e1b0: 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78  ult_int64(contex
e1c0: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
e1d0: 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29  _int64(argv[1]))
e1e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e1f0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e200: 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29  (zArg0,"string")
e210: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e220: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
e230: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
e240: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
e250: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20  _text(argv[1]), 
e260: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1,.            
e270: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
e280: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e290: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
e2a0: 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22  p(zArg0,"double"
e2b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e2c0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64  sqlite3_result_d
e2d0: 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73  ouble(context, s
e2e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75  qlite3_value_dou
e2f0: 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20  ble(argv[1]));. 
e300: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e310: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
e320: 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29  rg0,"null")==0 )
e330: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e340: 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f  3_result_null(co
e350: 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65  ntext);.      }e
e360: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
e370: 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61  trICmp(zArg0,"va
e380: 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lue")==0 ){.    
e390: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e3a0: 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74  lt_value(context
e3b0: 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76  , argv[sqlite3_v
e3c0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d  alue_int(argv[1]
e3d0: 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  )]);.      }else
e3e0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
e3f0: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  rror_out;.      
e400: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
e410: 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
e420: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67  t;.    }.    arg
e430: 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76  c -= 2;.    argv
e440: 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74   += 2;.  }.  ret
e450: 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  urn;..error_out:
e460: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
e470: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
e480: 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20  "first argument 
e490: 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66  should be one of
e4a0: 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69  : ".      "int i
e4b0: 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62  nt64 string doub
e4c0: 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20  le null value", 
e4d0: 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  -1);.}../*.** Us
e4e0: 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65  age:   sqlite_re
e4f0: 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63  gister_test_func
e500: 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a  tion  DB  NAME.*
e510: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68  *.** Register th
e520: 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74  e test SQL funct
e530: 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ion on the datab
e540: 61 73 65 20 44 42 20 75 6e 64 65 72 20 74 68 65  ase DB under the
e550: 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73   name NAME..*/.s
e560: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72  tatic int test_r
e570: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e580: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e590: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e5a0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e5b0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e5c0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e5d0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e5e0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e5f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e600: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e610: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e620: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e630: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e640: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e650: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e660: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e670: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e680: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e690: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e6a0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e6b0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e6c0: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e6d0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e6e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e6f0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e700: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e710: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e720: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e730: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e740: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e750: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
e760: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
e770: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
e780: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
e790: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
e7a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e7b0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
e7c0: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
e7d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e7e0: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
e7f0: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
e800: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
e810: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
e820: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
e830: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
e840: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
e850: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
e860: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
e870: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
e880: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66  tatic int test_f
e890: 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20  inalize(.  void 
e8a0: 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
e8b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
e8c0: 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
e8d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
e8e0: 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
e8f0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
e900: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
e910: 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a  lite3 *db = 0;..
e920: 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
e930: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e940: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e950: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e960: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
e970: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
e980: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
e990: 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c  , 0), " <STMT>",
e9a0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
e9b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
e9c0: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
e9d0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
e9e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
e9f0: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
ea00: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ea10: 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
ea20: 0a 20 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f  .    db = StmtTo
ea30: 44 62 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  Db(pStmt);.  }. 
ea40: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
ea50: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
ea60: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ea70: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
ea80: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
ea90: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  TCL_STATIC);.  i
eaa0: 66 28 20 64 62 20 26 26 20 73 71 6c 69 74 65 33  f( db && sqlite3
eab0: 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
eac0: 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
ead0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
eae0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
eaf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
eb00: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
eb10: 74 61 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44  tatus  STMT  COD
eb20: 45 20 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a  E  RESETFLAG.**.
eb30: 2a 2a 20 47 65 74 20 74 68 65 20 76 61 6c 75 65  ** Get the value
eb40: 20 6f 66 20 61 20 73 74 61 74 75 73 20 63 6f 75   of a status cou
eb50: 6e 74 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74  nter from a stat
eb60: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
eb70: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73   int test_stmt_s
eb80: 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20  tatus(.  void * 
eb90: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eba0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ebb0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
ebc0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
ebd0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69  bjv[].){.  int i
ebe0: 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20  Value;.  int i, 
ebf0: 6f 70 20 3d 20 30 2c 20 72 65 73 65 74 46 6c 61  op = 0, resetFla
ec00: 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g;.  const char 
ec10: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  *zOpName;.  sqli
ec20: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
ec30: 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ..  static const
ec40: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
ec50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
ec60: 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 7d  .    int op;.  }
ec70: 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b   aOp[] = {.    {
ec80: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
ec90: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
eca0: 50 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54 4d  P",   SQLITE_STM
ecb0: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
ecc0: 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20 7b  _STEP   },.    {
ecd0: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
ece0: 54 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20 20  TUS_SORT",      
ecf0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d        SQLITE_STM
ed00: 54 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20 20  TSTATUS_SORT    
ed10: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
ed20: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
ed30: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c 20  TUS_AUTOINDEX", 
ed40: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d        SQLITE_STM
ed50: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
ed60: 58 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  X       },.    {
ed70: 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41   "SQLITE_STMTSTA
ed80: 54 55 53 5f 56 4d 5f 53 54 45 50 22 2c 20 20 20  TUS_VM_STEP",   
ed90: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54 4d        SQLITE_STM
eda0: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 20  TSTATUS_VM_STEP 
edb0: 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a          },.  };.
edc0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
edd0: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
ede0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
edf0: 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41 52   objv, "STMT PAR
ee00: 41 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41 47  AMETER RESETFLAG
ee10: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
ee20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ee30: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ee40: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ee50: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
ee60: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ee70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ee80: 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zOpName = Tcl_G
ee90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
eea0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
eeb0: 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b 20  ArraySize(aOp); 
eec0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
eed0: 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d  rcmp(aOp[i].zNam
eee0: 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20 29  e, zOpName)==0 )
eef0: 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f 70  {.      op = aOp
ef00: 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62 72  [i].op;.      br
ef10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
ef20: 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
ef30: 65 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69 66  e(aOp) ){.    if
ef40: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
ef50: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
ef60: 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74 75  [2], &op) ) retu
ef70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ef80: 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  }.  if( Tcl_GetB
ef90: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
efa0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
efb0: 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65 74  resetFlag) ) ret
efc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
efd0: 20 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74 65   iValue = sqlite
efe0: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 53  3_stmt_status(pS
eff0: 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46 6c  tmt, op, resetFl
f000: 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ag);.  Tcl_SetOb
f010: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
f020: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 56  Tcl_NewIntObj(iV
f030: 61 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  alue));.  return
f040: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64   TCL_OK;.}..#ifd
f050: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f060: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
f070: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
f080: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
f090: 73 74 61 74 75 73 20 53 54 4d 54 20 49 44 58 0a  status STMT IDX.
f0a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
f0b0: 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  st_stmt_scanstat
f0c0: 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  us(.  void * cli
f0d0: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f0e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f0f0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f100: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f110: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
f120: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
f130: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
f140: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69   argument */.  i
f150: 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f170: 2a 20 53 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  * Second argumen
f180: 74 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68  t */..  const ch
f190: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e  ar *zName;.  con
f1a0: 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  st char *zExplai
f1b0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  n;.  sqlite3_int
f1c0: 36 34 20 6e 4c 6f 6f 70 3b 0a 20 20 73 71 6c 69  64 nLoop;.  sqli
f1d0: 74 65 33 5f 69 6e 74 36 34 20 6e 56 69 73 69 74  te3_int64 nVisit
f1e0: 3b 0a 20 20 64 6f 75 62 6c 65 20 72 45 73 74 3b  ;.  double rEst;
f1f0: 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 69  .  int res;..  i
f200: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
f210: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f220: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f230: 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 22 29 3b  jv, "STMT IDX");
f240: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
f250: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
f260: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
f270: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
f280: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
f290: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
f2a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
f2b0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
f2c0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
f2d0: 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
f2e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
f2f0: 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
f300: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
f310: 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49  pStmt, idx, SQLI
f320: 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f  TE_SCANSTAT_NLOO
f330: 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70  P, (void*)&nLoop
f340: 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  );.  if( res==0 
f350: 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  ){.    Tcl_Obj *
f360: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
f370: 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  j();.    Tcl_Lis
f380: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f390: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f3a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 4c 6f  ewStringObj("nLo
f3b0: 6f 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  op", -1));.    T
f3c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f3d0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f3e0: 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
f3f0: 62 6a 28 6e 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  bj(nLoop));.    
f400: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
f410: 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69  nstatus(pStmt, i
f420: 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53  dx, SQLITE_SCANS
f430: 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69  TAT_NVISIT, (voi
f440: 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20  d*)&nVisit);.   
f450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f460: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f470: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
f480: 4f 62 6a 28 22 6e 56 69 73 69 74 22 2c 20 2d 31  Obj("nVisit", -1
f490: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f4a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f4b0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f4c0: 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 56 69 73  wWideIntObj(nVis
f4d0: 69 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  it));.    sqlite
f4e0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f4f0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f500: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53  LITE_SCANSTAT_ES
f510: 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29  T, (void*)&rEst)
f520: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
f530: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
f540: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
f550: 74 72 69 6e 67 4f 62 6a 28 22 6e 45 73 74 22 2c  tringObj("nEst",
f560: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
f570: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f580: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f590: 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 45  _NewDoubleObj(rE
f5a0: 73 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  st));.    sqlite
f5b0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f5c0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f5d0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 41  LITE_SCANSTAT_NA
f5e0: 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 4e 61 6d  ME, (void*)&zNam
f5f0: 65 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  e);.    Tcl_List
f600: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f610: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f620: 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 4e 61 6d  wStringObj("zNam
f630: 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  e", -1));.    Tc
f640: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f650: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
f660: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f670: 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  (zName, -1));.  
f680: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
f690: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f6a0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f6b0: 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28  NSTAT_EXPLAIN, (
f6c0: 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29  void*)&zExplain)
f6d0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
f6e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
f6f0: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
f700: 74 72 69 6e 67 4f 62 6a 28 22 7a 45 78 70 6c 61  tringObj("zExpla
f710: 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  in", -1));.    T
f720: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f730: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f740: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f750: 6a 28 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 29 29  j(zExplain, -1))
f760: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
f770: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
f780: 52 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Ret);.  }else{. 
f790: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
f7a0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  lt(interp);.  }.
f7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f7c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
f7d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
f7e0: 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 20  canstatus_reset 
f7f0: 20 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20   STMT.*/.static 
f800: 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 63  int test_stmt_sc
f810: 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28 0a  anstatus_reset(.
f820: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f830: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f840: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f850: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f860: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f870: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f880: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
f890: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
f8a0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20 6f  ument */.  if( o
f8b0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
f8c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f8d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f8e0: 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
f8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f900: 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
f910: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
f920: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f930: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
f940: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f950: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OR;.  sqlite3_st
f960: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
f970: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  set(pStmt);.  re
f980: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
f990: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
f9a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
f9b0: 4f 47 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OG./*.** Usage: 
f9c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f   sqlite3_config_
f9d0: 73 71 6c 6c 6f 67 0a 2a 2a 0a 2a 2a 20 5a 65 72  sqllog.**.** Zer
f9e0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  o the SQLITE_CON
f9f0: 46 49 47 5f 53 51 4c 4c 4f 47 20 63 6f 6e 66 69  FIG_SQLLOG confi
fa00: 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  guration.*/.stat
fa10: 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6e 66  ic int test_conf
fa20: 69 67 5f 73 71 6c 6c 6f 67 28 0a 20 20 76 6f 69  ig_sqllog(.  voi
fa30: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fa40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fa50: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fa60: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fa70: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
fa80: 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
fa90: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
faa0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fab0: 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
fac0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fad0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e   }.  sqlite3_con
fae0: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
faf0: 47 5f 53 51 4c 4c 4f 47 2c 20 30 2c 20 30 29 3b  G_SQLLOG, 0, 0);
fb00: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
fb10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
fb20: 2a 20 55 73 61 67 65 3a 20 76 66 73 5f 63 75 72  * Usage: vfs_cur
fb30: 72 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34 0a  rent_time_int64.
fb40: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
fb50: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
fb60: 62 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  by the default V
fb70: 46 53 27 73 20 78 43 75 72 72 65 6e 74 54 69 6d  FS's xCurrentTim
fb80: 65 49 6e 74 36 34 20 6d 65 74 68 6f 64 2e 0a 2a  eInt64 method..*
fb90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
fba0: 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
fbb0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
fbc0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
fbd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
fbe0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
fbf0: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
fc00: 0a 29 7b 0a 20 20 69 36 34 20 74 3b 0a 20 20 73  .){.  i64 t;.  s
fc10: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
fc20: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
fc30: 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 6f 62  ind(0);.  if( ob
fc40: 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
fc50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
fc60: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
fc70: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
fc80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
fc90: 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  pVfs->xCurrentTi
fca0: 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 74  meInt64(pVfs, &t
fcb0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
fcc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
fcd0: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
fce0: 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
fcf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  L_OK;.}..#ifdef 
fd00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
fd10: 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61  APSHOT./*.** Usa
fd20: 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ge: sqlite3_snap
fd30: 73 68 6f 74 5f 67 65 74 20 44 42 20 44 42 4e 41  shot_get DB DBNA
fd40: 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ME.*/.static int
fd50: 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67   test_snapshot_g
fd60: 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
fd70: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
fd80: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
fd90: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
fda0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
fdb0: 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
fdc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
fdd0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
fde0: 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
fdf0: 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b   *pSnapshot = 0;
fe00: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
fe10: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
fe20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fe30: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
fe40: 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
fe50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
fe60: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
fe70: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
fe80: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
fe90: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
fea0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
feb0: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
fec0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ring(objv[2]);..
fed0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
fee0: 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62 2c 20  napshot_get(db, 
fef0: 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f  zName, &pSnapsho
ff00: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
ff10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
ff20: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
ff30: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
ff40: 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
ff50: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
ff60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ff70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
ff80: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
ff90: 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20 73 71  100];.    if( sq
ffa0: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
ffb0: 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
ffc0: 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f 74 29  zBuf, pSnapshot)
ffd0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ffe0: 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ROR;.    Tcl_Set
fff0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
10000 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10010 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b 0a 20  bj(zBuf, -1));. 
10020 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
10030 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
10040 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
10050 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
10060 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10070 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10080 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10090 61 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44  apshot_open DB D
100a0 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a  BNAME SNAPSHOT.*
100b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
100c0 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28  t_snapshot_open(
100d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
100e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
100f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10100 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10110 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10120 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10130 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
10140 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
10150 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
10160 53 6e 61 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28  Snapshot;..  if(
10170 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
10180 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10190 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
101a0 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41  , "DB DBNAME SNA
101b0 50 53 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74  PSHOT");.    ret
101c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
101d0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
101e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
101f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10200 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10220 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
10230 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
10240 0a 20 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28  .  pSnapshot = (
10250 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10260 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10270 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10280 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a  ring(objv[3]));.
10290 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
102a0 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62  snapshot_open(db
102b0 2c 20 7a 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68  , zName, pSnapsh
102c0 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ot);.  if( rc!=S
102d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
102e0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
102f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10300 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
10310 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31  3ErrName(rc), -1
10320 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
10330 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10340 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10350 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10360 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10370 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  T */..#ifdef SQL
10380 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
10390 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  HOT./*.** Usage:
103a0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
103b0 74 5f 66 72 65 65 20 53 4e 41 50 53 48 4f 54 0a  t_free SNAPSHOT.
103c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
103d0 73 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65  st_snapshot_free
103e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
103f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10400 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10410 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10420 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10430 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  .){.  sqlite3_sn
10440 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f  apshot *pSnapsho
10450 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  t;.  if( objc!=2
10460 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
10470 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10480 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53   1, objv, "SNAPS
10490 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
104a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
104b0 0a 20 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28  .  pSnapshot = (
104c0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
104d0 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
104e0 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
104f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a  ring(objv[1]));.
10500 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
10510 6f 74 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f  ot_free(pSnapsho
10520 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
10530 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
10540 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10550 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a  NAPSHOT */../*.*
10560 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10570 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20  3_next_stmt  DB 
10580 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10590 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74  rn the next stat
105a0 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65  ment in sequence
105b0 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a   after STMT..*/.
105c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
105d0 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69  next_stmt(.  voi
105e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
105f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
10600 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
10610 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
10620 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
10630 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
10640 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  mt;.  sqlite3 *d
10650 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  b = 0;.  char zB
10660 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  uf[50];..  if( o
10670 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
10680 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10690 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
106a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
106b0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
106c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
106d0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
106e0 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20   DB STMT", 0);. 
106f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10700 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
10710 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
10720 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10730 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
10740 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10750 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53  RROR;.  if( getS
10760 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
10770 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10780 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d  (objv[2]), &pStm
10790 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
107a0 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d  ERROR;.  pStmt =
107b0 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
107c0 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20  mt(db, pStmt);. 
107d0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
107e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
107f0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
10800 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
10810 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10820 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
10830 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10840 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
10850 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
10860 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10870 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
10880 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d  mt_readonly  STM
10890 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
108a0 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61  rue if STMT is a
108b0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72   NULL pointer or
108c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
108d0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61  statement.** tha
108e0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
108f0 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  to leave the dat
10900 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64  abase unmodified
10910 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10920 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  test_stmt_readon
10930 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ly(.  void * cli
10940 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10950 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10960 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10970 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10980 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
10990 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
109a0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
109b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
109c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
109d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
109e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
109f0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
10a00 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
10a10 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
10a20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
10a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
10a50 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
10a60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10a70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
10a80 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
10a90 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
10aa0 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
10ab0 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  nly(pStmt);.  Tc
10ac0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10ad0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
10ae0 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20  oleanObj(rc));. 
10af0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10b00 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
10b10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
10b20 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  sy  STMT.**.** R
10b30 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54  eturn true if ST
10b40 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  MT is a non-NULL
10b50 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
10b60 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20  atement.** that 
10b70 68 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64  has been stepped
10b80 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70   but not to comp
10b90 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  letion..*/.stati
10ba0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
10bb0 62 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  busy(.  void * c
10bc0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10bd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10be0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10bf0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10c00 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10c10 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
10c20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10c30 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10c40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10c50 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10c60 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10c70 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
10c80 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
10c90 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10ca0 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
10cb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10cc0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
10cd0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
10ce0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10cf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
10d00 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
10d10 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
10d20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
10d30 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  y(pStmt);.  Tcl_
10d40 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10d50 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
10d60 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  eanObj(rc));.  r
10d70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
10d80 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75  ./*.** Usage:  u
10d90 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
10da0 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74    STMT.**.** Ret
10db0 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54  urn true if STMT
10dc0 20 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e   uses a statemen
10dd0 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
10de0 61 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73 74  atic int uses_st
10df0 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f  mt_journal(.  vo
10e00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
10e10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10e20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10e30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10e40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10e50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
10e60 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
10e70 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
10e80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10e90 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
10ea0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
10eb0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
10ec0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10ed0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
10ee0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
10ef0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10f00 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
10f10 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
10f20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
10f30 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
10f40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10f50 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ROR;.  sqlite3_s
10f60 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74  tmt_readonly(pSt
10f70 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  mt);.  Tcl_SetOb
10f80 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10f90 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
10fa0 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74  j(((Vdbe *)pStmt
10fb0 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  )->usesStmtJourn
10fc0 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
10fd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
10fe0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10ff0 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a  _reset  STMT .**
11000 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74  .** Reset a stat
11010 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f  ement handle..*/
11020 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
11030 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
11040 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11050 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11060 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11070 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11080 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
11090 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
110a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
110b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
110c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
110d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
110e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
110f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
11100 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11110 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
11120 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
11130 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11140 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
11150 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11160 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11170 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11180 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
11190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
111a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
111b0 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
111c0 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
111d0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
111e0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
111f0 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20  tmt), rc) ){.   
11200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11210 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
11220 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
11230 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
11240 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
11250 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63  IC);./*.  if( rc
11260 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
11270 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f  CL_ERROR;.  }.*/
11280 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
11290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
112a0 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  :  sqlite3_expir
112b0 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  ed STMT .**.** R
112c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
112d0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
112e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
112f0 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a  s recommended..*
11300 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
11310 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69  t_expired(.  voi
11320 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11330 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11340 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11350 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
11360 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
11370 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11380 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
11390 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
113a0 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  t;.  if( objc!=2
113b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
113c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
113d0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
113e0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
113f0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
11400 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
11410 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
11420 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
11430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11440 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
11450 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
11460 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11470 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
11480 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11490 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
114a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
114b0 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
114c0 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28  sqlite3_expired(
114d0 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66  pStmt)));.#endif
114e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
114f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
11500 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  :  sqlite3_trans
11510 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f  fer_bindings FRO
11520 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a  MSTMT TOSTMT.**.
11530 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20  ** Transfer all 
11540 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52  bindings from FR
11550 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54  OMSTMT over to T
11560 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20  OSTMT.*/.static 
11570 69 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65  int test_transfe
11580 72 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  r_bind(.  void *
11590 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
115a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
115b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
115c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
115d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
115e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
115f0 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74  PRECATED.  sqlit
11600 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c  e3_stmt *pStmt1,
11610 20 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20   *pStmt2;.  if( 
11620 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
11630 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11640 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
11650 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
11660 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
11670 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
11680 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
11690 22 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53  " FROM-STMT TO-S
116a0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
116b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
116c0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
116d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
116e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
116f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31  bjv[1]), &pStmt1
11700 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
11710 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
11720 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
11730 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
11740 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
11750 32 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  2)) return TCL_E
11760 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
11770 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11780 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
11790 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61  tObj(sqlite3_tra
117a0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70  nsfer_bindings(p
117b0 53 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b  Stmt1,pStmt2)));
117c0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
117d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
117e0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
117f0 33 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a  3_changes DB.**.
11800 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
11810 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
11820 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
11830 62 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74  base by the last
11840 20 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f   SQL.** executio
11850 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
11860 20 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20   test_changes(. 
11870 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11880 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11890 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
118a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
118b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
118c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
118d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
118e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
118f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
11900 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
11910 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
11920 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
11930 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
11940 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11960 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
11970 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11980 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11990 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
119a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
119b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
119c0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
119d0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61  tObj(sqlite3_cha
119e0 6e 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65  nges(db)));.  re
119f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11a00 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
11a10 65 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  e "static_bind_v
11a20 61 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61  alue" that varia
11a30 62 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74  bles are bound t
11a40 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c  o when.** the FL
11a50 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c  AG option of sql
11a60 69 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74  ite3_bind is "st
11a70 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20  atic".*/.static 
11a80 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61  char *sqlite_sta
11a90 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d  tic_bind_value =
11aa0 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73   0;.static int s
11ab0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11ac0 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a  d_nbyte = 0;../*
11ad0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
11ae0 74 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44  te3_bind  VM  ID
11af0 58 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a  X  VALUE  FLAGS.
11b00 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76  **.** Sets the v
11b10 61 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d  alue of the IDX-
11b20 74 68 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66  th occurrence of
11b30 20 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67   "?" in the orig
11b40 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69  inal SQL.** stri
11b50 6e 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68  ng.  VALUE is th
11b60 65 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66  e new value.  If
11b70 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74   FLAGS=="null" t
11b80 68 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20  hen VALUE is.** 
11b90 69 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20  ignored and the 
11ba0 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
11bb0 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d  NULL.  If FLAGS=
11bc0 3d 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a  ="static" then.*
11bd0 2a 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73  * the value is s
11be0 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
11bf0 6f 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69  of a static vari
11c00 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73  able named.** "s
11c10 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11c20 64 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c  d_value".  If FL
11c30 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68  AGS=="normal" th
11c40 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  en a copy.** of 
11c50 74 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64  the VALUE is mad
11c60 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62  e.  If FLAGS=="b
11c70 6c 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56 41  lob10" then a VA
11c80 4c 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a  LUE is ignored.*
11c90 2a 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62  * an a 10-byte b
11ca0 6c 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c  lob "abc\000xyz\
11cb0 30 30 30 70 71 22 20 69 73 20 69 6e 73 65 72 74  000pq" is insert
11cc0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
11cd0 74 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76  t test_bind(.  v
11ce0 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
11cf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11d00 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
11d10 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
11d20 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
11d30 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
11d40 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
11d50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11d60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
11d70 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
11d80 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
11d90 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
11da0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
11db0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
11dc0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
11dd0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
11de0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
11df0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
11e00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
11e10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
11e20 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
11e30 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e   VM IDX VALUE (n
11e40 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61  ull|static|norma
11e50 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  l)\"", 0);.    r
11e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11e70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
11e80 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
11e90 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d  , argv[1], &pStm
11ea0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
11eb0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
11ec0 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
11ed0 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  argv[2], &idx) )
11ee0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
11ef0 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
11f00 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d  argv[4],"null")=
11f10 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
11f20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
11f30 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
11f40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11f50 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63  (argv[4],"static
11f60 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
11f70 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  = sqlite3_bind_t
11f80 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ext(pStmt, idx, 
11f90 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
11fa0 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29  nd_value, -1, 0)
11fb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
11fc0 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74  rcmp(argv[4],"st
11fd0 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30  atic-nbytes")==0
11fe0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11ff0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
12000 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74  Stmt, idx, sqlit
12010 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
12020 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  lue,.           
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12050 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
12060 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  byte, 0);.  }els
12070 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
12080 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d  v[4],"normal")==
12090 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
120a0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
120b0 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76  pStmt, idx, argv
120c0 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [3], -1, SQLITE_
120d0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
120e0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
120f0 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29  rgv[4],"blob10")
12100 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12110 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12120 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61  t(pStmt, idx, "a
12130 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
12140 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41  , 10, SQLITE_STA
12150 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TIC);.  }else{. 
12160 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12170 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68  ult(interp, "4th
12180 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
12190 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c   be ".        "\
121a0 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61  "null\" or \"sta
121b0 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61  tic\" or \"norma
121c0 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  l\"", 0);.    re
121d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
121e0 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
121f0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
12200 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
12210 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
12220 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12230 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68  if( rc ){.    ch
12240 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
12250 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
12260 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
12270 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
12280 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
12290 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
122a0 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45 72   zBuf, sqlite3Er
122b0 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20  rStr(rc), 0);.  
122c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
122d0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
122e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
122f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12300 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61 67  UTF16./*.** Usag
12310 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
12320 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75 74  ate <db ptr> <ut
12330 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
12340 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68  tf16be>.**.** Th
12350 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
12360 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74  sed to test that
12370 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20   SQLite selects 
12380 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c 6c  the correct coll
12390 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e 63  ation.** sequenc
123a0 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  e callback when 
123b0 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
123c0 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
123d0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
123e0 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
123f0 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
12400 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
12410 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c 6c  gisters the coll
12420 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 22  ation sequence "
12430 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a 2a  test_collate".**
12440 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20 68   with database h
12450 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65 20  andle <db>. The 
12460 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
12470 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f  must be a list o
12480 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c 65  f three.** boole
12490 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74 68  an values. If th
124a0 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65 2c  e first is true,
124b0 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e 20   then a version 
124c0 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
124d0 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  is.** registered
124e0 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
124f0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72 75  he second is tru
12500 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73 20  e, a version is 
12510 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a 2a  registered for.*
12520 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  * UTF-16le, if t
12530 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75 65  he third is true
12540 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65 72  , a UTF-16be ver
12550 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
12560 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20 76  e..** Previous v
12570 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74 5f  ersions of test_
12580 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c 65  collate are dele
12590 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ted..**.** The c
125a0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
125b0 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 69  e test_collate i
125c0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
125d0 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20   calling the.** 
125e0 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
125f0 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
12600 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e 63  est_collate <enc
12610 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a 2a  > <lhs> <rhs>".*
12620 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20 61  *.** The <lhs> a
12630 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68 65  nd <rhs> are the
12640 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69 6e   two values bein
12650 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63 6f  g compared, enco
12660 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  ded in UTF-8..**
12670 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61 6d   The <enc> param
12680 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63 6f  eter is the enco
12690 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c 6c  ding of the coll
126a0 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 74  ation function t
126b0 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  hat.** SQLite se
126c0 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e 20  lected to call. 
126d0 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72  The TCL test scr
126e0 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ipt implements t
126f0 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c 6c  he.** "test_coll
12700 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a  ate" proc..**.**
12710 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
12720 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20 77  will only work w
12730 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70 72 65  ith one interpre
12740 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20 61  ter at a time, a
12750 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70 20  s the.** interp 
12760 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20 77  pointer to use w
12770 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20 74  hen evaluating t
12780 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73  he TCL script is
12790 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70 54   stored in.** pT
127a0 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
127b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c 5f  ..*/.static Tcl_
127c0 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f 6c  Interp* pTestCol
127d0 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61 74  lateInterp;.stat
127e0 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c  ic int test_coll
127f0 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ate_func(.  void
12800 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
12810 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  A, const void *z
12820 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e  A,.  int nB, con
12830 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20  st void *zB.){. 
12840 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20 3d   Tcl_Interp *i =
12850 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12860 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69 6e  erp;.  int encin
12870 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
12880 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20 69 6e  _INT(pCtx);.  in
12890 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a  t res;.  int n;.
128a0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
128b0 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f 62   *pVal;.  Tcl_Ob
128c0 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20 54  j *pX;..  pX = T
128d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
128e0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
128f0 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  -1);.  Tcl_IncrR
12900 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20 20  efCount(pX);..  
12910 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29 7b  switch( encin ){
12920 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
12930 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63 6c  _UTF8:.      Tcl
12940 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
12950 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
12960 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
12970 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  -8",-1));.      
12980 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12990 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a 0a  SQLITE_UTF16LE:.
129a0 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62        Tcl_ListOb
129b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
129c0 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e  ,pX,Tcl_NewStrin
129d0 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c  gObj("UTF-16LE",
129e0 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  -1));.      brea
129f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
12a00 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20 20  TE_UTF16BE:.    
12a10 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
12a20 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c  endElement(i,pX,
12a30 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12a40 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29 29  ("UTF-16BE",-1))
12a50 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
12a60 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
12a70 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
12a80 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ..  sqlite3Begin
12a90 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
12aa0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
12ab0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 69  ValueNew(0);.  i
12ac0 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20 73  f( pVal ){.    s
12ad0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12ae0 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c 20  r(pVal, nA, zA, 
12af0 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
12b00 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
12b10 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
12b20 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
12b30 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12b40 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
12b50 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
12b60 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
12b70 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
12b80 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
12b90 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
12ba0 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c 20  r(pVal, nB, zB, 
12bb0 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53 54  encin, SQLITE_ST
12bc0 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20 73  ATIC);.    n = s
12bd0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
12be0 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54 63  es(pVal);.    Tc
12bf0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12c00 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20 20  lement(i,pX,.   
12c10 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
12c20 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
12c30 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
12c40 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20 73  pVal),n));.    s
12c50 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
12c60 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pVal);.  }.  sql
12c70 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
12c80 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45 76  loc();..  Tcl_Ev
12c90 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20 30  alObjEx(i, pX, 0
12ca0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
12cb0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
12cc0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
12cd0 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  , Tcl_GetObjResu
12ce0 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20 20  lt(i), &res);.  
12cf0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74  return res;.}.st
12d00 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
12d10 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20  llate(.  void * 
12d20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
12d30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12d40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
12d50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
12d60 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
12d70 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
12d80 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  l;.  sqlite3_val
12d90 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20  ue *pVal;.  int 
12da0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12db0 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =5 ) goto bad_ar
12dc0 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61  gs;.  pTestColla
12dd0 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  teInterp = inter
12de0 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  p;.  if( getDbPo
12df0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
12e00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12e10 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
12e20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
12e30 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
12e40 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
12e50 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
12e60 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
12e70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12e80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
12e90 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64  eate_collation(d
12ea0 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
12eb0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
12ec0 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
12ed0 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20   *)SQLITE_UTF8, 
12ee0 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  val?test_collate
12ef0 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20  _func:0);.  if( 
12f00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12f10 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
12f20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28  *zUtf16;.    if(
12f30 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
12f40 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
12f50 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
12f60 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
12f70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63  CL_ERROR;.    rc
12f80 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12f90 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
12fa0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
12fb0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
12fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
12fd0 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31  id *)SQLITE_UTF1
12fe0 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f  6LE, val?test_co
12ff0 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20  llate_func:0);. 
13000 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
13010 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
13020 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13030 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[4], &val) ) re
13040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13050 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73  .#if 0.    if( s
13060 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
13070 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71  il>0 ){.      sq
13080 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
13090 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  l++;.    }.#endi
130a0 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  f.    sqlite3_mu
130b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
130c0 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
130d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
130e0 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
130f0 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
13100 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c  l, -1, "test_col
13110 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
13120 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
13130 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d  C);.    zUtf16 =
13140 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
13150 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
13160 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20  TF16NATIVE);.   
13170 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
13180 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
13190 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
131a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
131b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
131c0 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
131d0 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53  16(db, zUtf16, S
131e0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
131f0 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
13200 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  *)SQLITE_UTF16BE
13210 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
13220 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20  te_func:0);.    
13230 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  }.    sqlite3Val
13240 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
13250 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13260 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
13270 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
13280 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
13290 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
132a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
132b0 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d  R;.  .  if( rc!=
132c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
132d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
132e0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
132f0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
13300 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
13310 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13320 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
13330 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70  d_args:.  Tcl_Ap
13340 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
13350 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
13360 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
13370 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .      Tcl_GetSt
13380 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
13390 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20  [0], 0), " <DB> 
133a0 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
133b0 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b   <utf16be>", 0);
133c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
133d0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  ROR;.}../*.** Us
133e0 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 75 74  age: add_test_ut
133f0 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20 3c  f16bin_collate <
13400 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41 64  db ptr>.**.** Ad
13410 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c 61  d a utf-16 colla
13420 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
13430 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22 20 74  med "utf16bin" t
13440 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
13450 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 63  * handle. This c
13460 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
13470 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67 75 6d  e compares argum
13480 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65  ents in the same
13490 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 62   way as the.** b
134a0 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6f  uilt-in collatio
134b0 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a 73  n "binary"..*/.s
134c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75  tatic int test_u
134d0 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f  tf16bin_collate_
134e0 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43  func(.  void *pC
134f0 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63  tx, .  int nA, c
13500 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20  onst void *zA,. 
13510 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76   int nB, const v
13520 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e 74  oid *zB.){.  int
13530 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20 3f   nCmp = (nA>nB ?
13540 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e 74   nB : nA);.  int
13550 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 41   res = memcmp(zA
13560 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20 69  , zB, nCmp);.  i
13570 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20  f( res==0 ) res 
13580 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65 74  = nA - nB;.  ret
13590 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69  urn res;.}.stati
135a0 63 20 69 6e 74 20 74 65 73 74 5f 75 74 66 31 36  c int test_utf16
135b0 62 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  bin_collate(.  v
135c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
135d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
135e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
135f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
13600 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
13610 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
13620 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
13630 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61  bjc!=2 ) goto ba
13640 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
13650 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
13660 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
13670 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
13680 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13690 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
136a0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
136b0 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 62  tion(db, "utf16b
136c0 69 6e 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  in", SQLITE_UTF1
136d0 36 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73  6, 0, .      tes
136e0 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
136f0 74 65 5f 66 75 6e 63 0a 20 20 29 3b 0a 20 20 69  te_func.  );.  i
13700 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
13710 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
13720 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
13740 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f  rn TCL_OK;..bad_
13750 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e  args:.  Tcl_Wron
13760 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13770 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
13780 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
13790 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  ROR;.}../*.** Wh
137a0 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  en the collation
137b0 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b   needed callback
137c0 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63   is invoked, rec
137d0 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ord the name of 
137e0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
137f0 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  d collating func
13800 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20  tion here.  The 
13810 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73  recorded name is
13820 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20   linked.** to a 
13830 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64  TCL variable and
13840 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
13850 72 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75  re that the requ
13860 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a  ested collation.
13870 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65  ** name is corre
13880 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ct..*/.static ch
13890 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74  ar zNeededCollat
138a0 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63  ion[200];.static
138b0 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43   char *pzNeededC
138c0 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64  ollation = zNeed
138d0 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f  edCollation;.../
138e0 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
138f0 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
13900 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e  uence is needed.
13910 20 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69    Registered usi
13920 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f  ng.** sqlite3_co
13930 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36  llation_needed16
13940 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
13950 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  id test_collate_
13960 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69  needed_cb(.  voi
13970 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69  d *pCtx, .  sqli
13980 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65  te3 *db,.  int e
13990 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74  TextRep,.  const
139a0 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a   void *pName.){.
139b0 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28    int enc = ENC(
139c0 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db);.  int i;.  
139d0 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a  char *z;.  for(z
139e0 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c   = (char*)pName,
139f0 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d   i=0; *z || z[1]
13a00 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; z++){.    if( 
13a10 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  *z ) zNeededColl
13a20 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b  ation[i++] = *z;
13a30 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f  .  }.  zNeededCo
13a40 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a  llation[i] = 0;.
13a50 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
13a60 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20  _collation(.    
13a70 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c    db, "test_coll
13a80 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 53  ate", ENC(db), S
13a90 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
13aa0 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c  (enc), test_coll
13ab0 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a  ate_func);.}../*
13ac0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
13ad0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
13ae0 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20  ed DB.*/.static 
13af0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  int test_collate
13b00 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69 64 20  _needed(.  void 
13b10 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13b20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13b30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13b40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13b50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13b60 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
13b70 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
13b80 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72  =2 ) goto bad_ar
13b90 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  gs;.  if( getDbP
13ba0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13bb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13bc0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
13bd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13be0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
13bf0 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31  ollation_needed1
13c00 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f  6(db, 0, test_co
13c10 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 29  llate_needed_cb)
13c20 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  ;.  zNeededColla
13c30 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69  tion[0] = 0;.  i
13c40 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
13c50 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
13c60 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
13c70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
13c80 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f  rn TCL_OK;..bad_
13c90 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e  args:.  Tcl_Wron
13ca0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
13cb0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
13cc0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
13cd0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  ROR;.}../*.** tc
13ce0 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c 69 67  lcmd:   add_alig
13cf0 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
13d00 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20  tions  DB.**.** 
13d10 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c  Add two new coll
13d20 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20  ating sequences 
13d30 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13d40 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66  DB.**.**     utf
13d50 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20  16_aligned.**   
13d60 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65    utf16_unaligne
13d70 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c  d.**.** Both col
13d80 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
13d90 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 73 6f   use the same so
13da0 72 74 20 6f 72 64 65 72 20 61 73 20 42 49 4e 41  rt order as BINA
13db0 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  RY..** The only 
13dc0 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 74 68  difference is th
13dd0 61 74 20 74 68 65 20 75 74 66 31 36 5f 61 6c 69  at the utf16_ali
13de0 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a  gned collating.*
13df0 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20 64 65  * sequence is de
13e00 63 6c 61 72 65 64 20 77 69 74 68 20 74 68 65 20  clared with the 
13e10 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
13e20 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f  GNED flag..** Bo
13e30 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  th collating fun
13e40 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74  ctions increment
13e50 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 75   the unaligned u
13e60 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20  tf16 counter.** 
13e70 77 68 65 6e 65 76 65 72 20 74 68 65 79 20 73 65  whenever they se
13e80 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
13e90 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64  begins on an odd
13ea0 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a   byte boundary..
13eb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
13ec0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
13ed0 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74 61 74  ounter = 0;.stat
13ee0 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74  ic int alignment
13ef0 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
13f00 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74   *NotUsed,.  int
13f10 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
13f20 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
13f30 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
13f40 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
13f50 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
13f60 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
13f70 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69  ey1 : nKey2;.  i
13f80 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d  f( nKey1>0 && 1=
13f90 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52 5f  =(1&(SQLITE_PTR_
13fa0 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29 29 20  TO_INT(pKey1))) 
13fb0 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  ) unaligned_stri
13fc0 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ng_counter++;.  
13fd0 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26 20 31  if( nKey2>0 && 1
13fe0 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54 52  ==(1&(SQLITE_PTR
13ff0 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29 29 29  _TO_INT(pKey2)))
14000 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72   ) unaligned_str
14010 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  ing_counter++;. 
14020 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
14030 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
14040 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
14050 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
14060 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key2;.  }.  retu
14070 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
14080 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  int add_alignmen
14090 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
140a0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
140b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
140c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
140d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
140e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
140f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
14100 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d  db;.  if( objc>=
14110 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  2 ){.    if( get
14120 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
14130 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14140 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
14150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
14160 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  R;.    sqlite3_c
14170 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
14180 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69  db, "utf16_unali
14190 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
141a0 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  F16, .        0,
141b0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
141c0 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
141d0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
141e0 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c 69  n(db, "utf16_ali
141f0 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
14200 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
14210 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
14220 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
14230 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14240 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
14250 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14260 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
14270 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
14280 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
14290 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
142a0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
142b0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
142c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
142d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
142e0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
142f0 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
14300 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
14310 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
14320 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
14330 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
14340 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
14350 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
14360 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
14370 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
14380 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
14390 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
143a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
143b0 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
143c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
143d0 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
143e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
143f0 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
14400 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
14410 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
14420 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
14430 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
14440 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
14450 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
14460 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
14470 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
14480 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
14490 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
144a0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
144b0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
144c0 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
144d0 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
144e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
144f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
14500 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
14510 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
14520 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
14530 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
14540 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
14550 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
14560 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
14570 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
14580 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
14590 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
145a0 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
145b0 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
145c0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
145d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
145e0 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
145f0 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
14600 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
14610 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
14620 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
14630 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
14640 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
14650 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
14660 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
14670 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
14680 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
14690 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
146a0 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
146b0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
146c0 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
146d0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
146e0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
146f0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
14700 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
14710 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
14720 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
14730 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
14740 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
14750 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14760 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
14770 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14780 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
14790 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
147a0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
147b0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
147c0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
147d0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
147e0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
147f0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
14800 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14810 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14820 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
14830 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
14840 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
14850 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14860 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
14870 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
14880 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
14890 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
148a0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
148b0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
148c0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
148d0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
148e0 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
148f0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
14900 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
14910 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
14920 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14930 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
14940 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14950 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
14960 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
14970 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
14980 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
14990 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
149a0 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
149b0 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
149c0 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
149d0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
149e0 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
149f0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
14a00 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
14a10 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
14a20 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
14a30 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
14a40 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
14a50 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
14a60 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
14a70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
14a80 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
14a90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
14aa0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
14ab0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
14ac0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
14ad0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
14ae0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
14af0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
14b00 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
14b10 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
14b20 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
14b30 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
14b40 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
14b50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
14b60 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
14b70 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
14b80 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
14b90 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
14ba0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
14bb0 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
14bc0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
14bd0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
14be0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
14bf0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
14c00 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
14c10 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
14c20 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
14c30 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
14c40 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
14c50 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
14c60 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
14c70 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
14c80 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
14c90 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
14ca0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
14cb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
14cc0 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
14cd0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
14ce0 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
14cf0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
14d00 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
14d10 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
14d20 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
14d30 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
14d40 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
14d50 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
14d60 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
14d70 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
14d80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
14d90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
14da0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
14db0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
14dc0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
14dd0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
14de0 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
14df0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14e00 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
14e10 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
14e20 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
14e30 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e40 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14e50 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
14e60 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
14e70 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
14e80 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14e90 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
14ea0 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
14eb0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
14ec0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
14ed0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
14ee0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
14ef0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
14f00 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
14f10 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
14f20 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14f30 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
14f40 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14f50 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
14f60 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
14f70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
14f80 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
14f90 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
14fa0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
14fb0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
14fc0 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
14fd0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
14fe0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
14ff0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
15000 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
15010 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
15020 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
15030 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
15040 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
15050 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
15060 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
15070 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
15080 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
15090 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
150a0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
150b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
150c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
150d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
150e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
150f0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69  _function(.  voi
15100 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15110 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15120 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15130 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15140 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
15150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15160 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
15170 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b   *db;.  int val;
15180 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
15190 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
151a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
151b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
151c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
151d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
151e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
151f0 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
15200 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
15210 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
15220 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
15230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15240 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
15250 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
15260 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
15270 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
15280 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20  LITE_UTF8, .    
15290 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
152a0 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20  _function_utf8, 
152b0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
152c0 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74   TCL_OK!=Tcl_Get
152d0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
152e0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
152f0 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
15300 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15310 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  val ){.    sqlit
15320 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
15330 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e  on(db, "test_fun
15340 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54  ction", 1, SQLIT
15350 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20  E_UTF16LE, .    
15360 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74      interp, test
15370 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c  _function_utf16l
15380 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  e, 0, 0);.  }.  
15390 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f  if( TCL_OK!=Tcl_
153a0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
153b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
153c0 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
153d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
153e0 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71  f( val ){.    sq
153f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
15400 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ction(db, "test_
15410 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51  function", 1, SQ
15420 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
15430 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74         interp, t
15440 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
15450 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  16be, 0, 0);.  }
15460 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
15470 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  K;.bad_args:.  T
15480 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
15490 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
154a0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
154b0 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f   \"",.      Tcl_
154c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
154d0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
154e0 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  <DB> <utf8> <utf
154f0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22  16le> <utf16be>"
15500 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  , 0);.#endif /* 
15510 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
15520 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
15530 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
15540 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  * Usage:        
15550 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72   sqlite3_test_er
15560 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a  rstr <err code>.
15570 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20  **.** Test that 
15580 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67  the english lang
15590 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75 69  uage string equi
155a0 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69  valents for sqli
155b0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a  te error codes.*
155c0 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20  * are sane. The 
155d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
155e0 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65 6e  integer represen
155f0 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65  ting an sqlite e
15600 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68  rror code..** Th
15610 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69  e result is a li
15620 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e  st of two elemen
15630 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72  ts, the string r
15640 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
15650 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   the.** error co
15660 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69  de and the engli
15670 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
15680 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  anation..*/.stat
15690 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 73  ic int test_errs
156a0 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  tr(.  void * cli
156b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
156c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
156d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
156e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
156f0 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43  [].){.  char *zC
15700 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ode;.  int i;.  
15710 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20  if( objc!=1 ){. 
15720 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
15730 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
15740 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64  bjv, "<error cod
15750 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f  e>");.  }..  zCo
15760 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  de = Tcl_GetStri
15770 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66  ng(objv[1]);.  f
15780 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69  or(i=0; i<200; i
15790 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
157a0 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e 61  strcmp(t1ErrorNa
157b0 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29 20  me(i), zCode) ) 
157c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c  break;.  }.  Tcl
157d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
157e0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
157f0 65 33 45 72 72 53 74 72 28 69 29 2c 20 30 29 3b  e3ErrStr(i), 0);
15800 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15820 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a  :    breakpoint.
15830 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
15840 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f 6e  ne exists for on
15850 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20 70  e purpose - to p
15860 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20 74  rovide a place t
15870 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b  o put a.** break
15880 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20 74  point with GDB t
15890 68 61 74 20 63 61 6e 20 62 65 20 74 72 69 67 67  hat can be trigg
158a0 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20 63  ered using TCL c
158b0 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a  ode.  The use.**
158c0 20 66 6f 72 20 74 68 69 73 20 69 73 20 77 68 65   for this is whe
158d0 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74  n a particular t
158e0 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73 61  est fails on (sa
158f0 79 29 20 74 68 65 20 31 34 38 35 74 68 20 69 74  y) the 1485th it
15900 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74  eration..** In t
15910 68 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69  he TCL test scri
15920 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20 63  pt, we can add c
15930 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  ode like this:.*
15940 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69 3d  *.**     if {$i=
15950 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e  =1485} breakpoin
15960 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e  t.**.** Then run
15970 20 74 65 73 74 66 69 78 74 75 72 65 20 69 6e 20   testfixture in 
15980 74 68 65 20 64 65 62 75 67 67 65 72 20 61 6e 64  the debugger and
15990 20 77 61 69 74 20 66 6f 72 20 74 68 65 20 62 72   wait for the br
159a0 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66  eakpoint to.** f
159b0 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69 74  ire.  Then addit
159c0 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74  ional breakpoint
159d0 73 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20  s can be set to 
159e0 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20 62  trace down the b
159f0 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
15a00 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  t test_breakpoin
15a10 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
15a20 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
15a30 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
15a40 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
15a50 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
15a60 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
15a70 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
15a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15a90 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
15aa0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
15ab0 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
15ac0 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
15ad0 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65  ument */.){.  re
15ae0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20  turn TCL_OK;    
15af0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
15b00 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ng */.}../*.** U
15b10 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
15b20 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53  bind_zeroblob  S
15b30 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20  TMT IDX N.**.** 
15b40 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
15b50 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69  _bind_zeroblob i
15b60 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
15b70 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
15b80 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20  atement..** IDX 
15b90 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
15ba0 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68  a wildcard in th
15bb0 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
15bc0 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d  ment.  This comm
15bd0 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e  and.** binds a N
15be0 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  -byte zero-fille
15bf0 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69  d BLOB to the wi
15c00 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
15c10 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
15c20 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  zeroblob(.  void
15c30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15c40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15c50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15c60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15c70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15c80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15c90 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
15ca0 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b  int n;.  int rc;
15cb0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
15cc0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
15cd0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
15ce0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49  1, objv, "STMT I
15cf0 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  DX N");.    retu
15d00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15d10 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
15d20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15d30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15d40 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
15d50 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15d60 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
15d70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15d80 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
15d90 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
15da0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
15db0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
15dc0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
15dd0 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
15de0 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
15df0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
15e00 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78  oblob(pStmt, idx
15e10 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , n);.  if( sqli
15e20 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15e30 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15e40 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15e50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15e60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
15e80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
15e90 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
15ea0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
15eb0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
15ec0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20 53 54  d_zeroblob64  ST
15ed0 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54  MT IDX N.**.** T
15ee0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
15ef0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20  bind_zeroblob64 
15f00 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
15f10 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
15f20 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58  tatement..** IDX
15f30 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15f40 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15f50 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15f60 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
15f70 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
15f80 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c 6c  N-byte zero-fill
15f90 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77  ed BLOB to the w
15fa0 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
15fb0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
15fc0 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20 76  _zeroblob64(.  v
15fd0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15fe0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15ff0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16000 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16010 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16020 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16030 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16040 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e  .  Tcl_WideInt n
16050 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
16060 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
16070 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
16080 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
16090 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
160a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
160b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
160c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
160d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
160e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
160f0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16110 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16120 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16130 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16140 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16150 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
16160 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
16170 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
16180 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  n) ) return TCL_
16190 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
161a0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
161b0 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69 64  blob64(pStmt, id
161c0 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
161d0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
161e0 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
161f0 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
16200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16210 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
16230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16240 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
16250 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
16260 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16270 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
16280 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
16290 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
162a0 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d  e3_bind_int  STM
162b0 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
162c0 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
162d0 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66  _bind_int interf
162e0 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
162f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16300 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
16310 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
16320 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
16330 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
16340 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
16350 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69  binds a 32-bit i
16360 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20  nteger VALUE to 
16370 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a  that wildcard..*
16380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
16390 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f  t_bind_int(.  vo
163a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
163b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
163c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
163d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
163e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
163f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
16400 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
16410 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69    int value;.  i
16420 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
16430 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
16440 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
16450 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
16460 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
16470 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
16480 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
16490 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
164a0 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
164b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
164c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
164d0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
164e0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
164f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
16500 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
16510 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16520 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
16530 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
16540 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
16550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16560 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16570 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16580 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
16590 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
165a0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
165b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
165c0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
165d0 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
165e0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
165f0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
16600 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
16610 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16620 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16630 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16640 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
16650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
16660 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
16670 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16680 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56  _int64  STMT N V
16690 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
166a0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
166b0 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65  _int64 interface
166c0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
166d0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
166e0 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
166f0 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
16700 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
16710 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
16720 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
16730 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ds a 64-bit inte
16740 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61  ger VALUE to tha
16750 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  t wildcard..*/.s
16760 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
16770 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  ind_int64(.  voi
16780 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16790 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
167a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
167b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
167c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
167d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
167e0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
167f0 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c   Tcl_WideInt val
16800 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
16810 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
16820 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16830 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16840 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16850 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16860 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16870 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16880 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
16890 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
168a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
168b0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
168c0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
168d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
168e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
168f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16900 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
16910 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
16920 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
16930 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
16940 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
16950 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
16960 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
16970 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20  v[3], &value) ) 
16980 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16990 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
169a0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74  3_bind_int64(pSt
169b0 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b  mt, idx, value);
169c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
169d0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
169e0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
169f0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16a00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16a10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16a20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
16a30 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16a40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16a50 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
16a60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
16a70 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c  uble  STMT N VAL
16a80 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
16a90 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  e sqlite3_bind_d
16aa0 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e  ouble interface.
16ab0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
16ac0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
16ad0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
16ae0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
16af0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
16b00 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
16b10 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
16b20 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
16b30 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
16b40 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
16b50 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
16b60 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  nd_double(.  voi
16b70 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16b80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16b90 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16ba0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16bb0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16bc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16bd0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
16be0 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20 3d 20   double value = 
16bf0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  0;.  int rc;.  c
16c00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b  onst char *zVal;
16c10 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
16c20 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
16c30 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
16c40 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20   *zName;     /* 
16c50 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63  Name of the spec
16c60 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  ial floating poi
16c70 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20  nt value */.    
16c80 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70  unsigned int iUp
16c90 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20  per;   /* Upper 
16ca0 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75  32 bits */.    u
16cb0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77  nsigned int iLow
16cc0 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33  er;   /* Lower 3
16cd0 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53  2 bits */.  } aS
16ce0 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20  pecialFp[] = {. 
16cf0 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20     {  "NaN",    
16d00 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78    0x7fffffff, 0x
16d10 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
16d20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30  {  "SNaN",     0
16d30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66  x7ff7ffff, 0xfff
16d40 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
16d50 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66  "-NaN",     0xff
16d60 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  ffffff, 0xffffff
16d70 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53  ff },.    {  "-S
16d80 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66  NaN",    0xfff7f
16d90 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20  fff, 0xffffffff 
16da0 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22  },.    {  "+Inf"
16db0 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30  ,     0x7ff00000
16dc0 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
16dd0 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20      {  "-Inf",  
16de0 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30     0xfff00000, 0
16df0 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20  x00000000 },.   
16e00 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20   {  "Epsilon",  
16e10 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x00000000, 0x00
16e20 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
16e30 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38   "-Epsilon", 0x8
16e40 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30  0000000, 0x00000
16e50 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e  001 },.    {  "N
16e60 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38  aN0",     0x7ff8
16e70 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
16e80 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
16e90 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30  0",    0xfff8000
16ea0 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
16eb0 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
16ec0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
16ed0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16ee0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16ef0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16f00 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
16f10 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16f20 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
16f30 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
16f40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16f50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
16f60 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16f70 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16f80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16f90 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16fb0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16fc0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16fd0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16ff0 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74  ..  /* Intercept
17000 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e   the string "NaN
17010 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61  " and generate a
17020 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69   NaN value for i
17030 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65  t..  ** All othe
17040 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61  r strings are pa
17050 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
17060 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
17070 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c  mObj()..  ** Tcl
17080 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62  _GetDoubleFromOb
17090 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72  j() should under
170a0 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20  stand "NaN" but 
170b0 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20  some versions.  
170c0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67  ** contain a bug
170d0 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20  ..  */.  zVal = 
170e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
170f0 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[3]);.  for(i=
17100 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65  0; i<sizeof(aSpe
17110 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61  cialFp)/sizeof(a
17120 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69  SpecialFp[0]); i
17130 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
17140 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69  cmp(aSpecialFp[i
17150 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d  ].zName, zVal)==
17160 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
17170 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20  e3_uint64 x;.   
17180 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46     x = aSpecialF
17190 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20  p[i].iUpper;.   
171a0 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20     x <<= 32;.   
171b0 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c     x |= aSpecial
171c0 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20  Fp[i].iLower;.  
171d0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
171e0 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a  of(value)==8 );.
171f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
17200 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20  zeof(x)==8 );.  
17210 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75      memcpy(&valu
17220 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20  e, &x, 8);.     
17230 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
17240 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
17250 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69  f(aSpecialFp)/si
17260 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b  zeof(aSpecialFp[
17270 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  0]) &&.         
17280 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
17290 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
172a0 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b  v[3], &value) ){
172b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
172c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
172d0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64  = sqlite3_bind_d
172e0 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78  ouble(pStmt, idx
172f0 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20  , value);.  if( 
17300 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
17310 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
17320 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
17330 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
17340 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
17350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17370 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
17380 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17390 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
173a0 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54  _bind_null  STMT
173b0 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68   N.**.** Test th
173c0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  e sqlite3_bind_n
173d0 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20  ull interface.  
173e0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
173f0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
17400 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
17410 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
17420 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
17430 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
17440 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
17450 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69  a NULL to the wi
17460 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
17470 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
17480 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  null(.  void * c
17490 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
174a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
174b0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
174c0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
174d0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
174e0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
174f0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
17500 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
17510 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
17520 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17530 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17540 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17550 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
17560 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
17570 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
17580 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  T N", 0);.    re
17590 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
175a0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
175b0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
175c0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
175d0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
175e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
175f0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
17600 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
17610 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
17620 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
17630 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17640 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
17650 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a  ll(pStmt, idx);.
17660 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
17670 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
17680 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
17690 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
176a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
176b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
176c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
176d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
176e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
176f0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17700 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17710 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20    STMT N STRING 
17720 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74  BYTES.**.** Test
17730 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
17740 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65  d_text interface
17750 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17760 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17770 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17780 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17790 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
177a0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
177b0 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
177c0 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e  ds a UTF-8 strin
177d0 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
177e0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
177f0 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
17800 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
17810 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17820 5f 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f  _bind_text(.  vo
17830 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17840 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17850 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17860 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17870 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17880 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
17890 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
178a0 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
178b0 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e  har *value;.  in
178c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
178d0 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
178e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
178f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
17900 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
17910 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
17920 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
17930 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
17940 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45  TMT N VALUE BYTE
17950 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
17960 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17970 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
17980 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
17990 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
179a0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
179b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
179c0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
179d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
179e0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
179f0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
17a00 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
17a10 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
17a20 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
17a30 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
17a40 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
17a50 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17a60 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
17a70 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
17a80 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17a90 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
17aa0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
17ab0 75 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54  ue, bytes, SQLIT
17ac0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
17ad0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17ae0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
17af0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
17b00 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
17b10 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
17b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17b30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17b40 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
17b50 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
17b60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
17b70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
17b80 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17b90 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17ba0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
17bb0 65 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20  ext16 ?-static? 
17bc0 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
17bd0 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
17be0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
17bf0 74 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65  text16 interface
17c00 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
17c10 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
17c20 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
17c30 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
17c40 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
17c50 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
17c60 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
17c70 64 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69  ds a UTF-16 stri
17c80 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
17c90 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
17ca0 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
17cb0 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
17cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
17cd0 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20  t_bind_text16(. 
17ce0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17cf0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17d00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17d10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17d20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17d30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d40 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
17d50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17d60 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
17d70 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
17d80 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
17d90 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65  c;..  void (*xDe
17da0 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a  l)(void*) = (obj
17db0 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54  c==6?SQLITE_STAT
17dc0 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  IC:SQLITE_TRANSI
17dd0 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ENT);.  Tcl_Obj 
17de0 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76  *oStmt    = objv
17df0 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f  [objc-4];.  Tcl_
17e00 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20  Obj *oN       = 
17e10 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20  objv[objc-3];.  
17e20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67  Tcl_Obj *oString
17e30 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d    = objv[objc-2]
17e40 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79  ;.  Tcl_Obj *oBy
17e50 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a  tes   = objv[obj
17e60 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  c-1];..  if( obj
17e70 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29  c!=5 && objc!=6)
17e80 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
17e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
17ea0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
17eb0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
17ec0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
17ed0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
17ee0 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
17ef0 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29  VALUE BYTES", 0)
17f00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17f10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17f20 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17f30 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17f40 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20  tString(oStmt), 
17f50 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17f70 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17f80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20  Obj(interp, oN, 
17f90 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
17fa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75  CL_ERROR;.  valu
17fb0 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  e = (char*)Tcl_G
17fc0 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
17fd0 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a  bj(oString, 0);.
17fe0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
17ff0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
18000 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73 29 20  oBytes, &bytes) 
18010 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18020 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
18030 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  te3_bind_text16(
18040 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69  pStmt, idx, (voi
18050 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73  d *)value, bytes
18060 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73  , xDel);.  if( s
18070 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
18080 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
18090 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
180a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
180b0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
180c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
180d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
180e0 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
180f0 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
18100 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18110 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66  ROR;.  }..#endif
18120 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
18130 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
18140 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
18150 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
18160 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d  te3_bind_blob ?-
18170 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44  static? STMT N D
18180 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20  ATA BYTES.**.** 
18190 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
181a0 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72  _bind_blob inter
181b0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
181c0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
181d0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
181e0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
181f0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
18200 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
18210 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
18220 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f   binds a BLOB to
18230 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
18240 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45  The BLOB is BYTE
18250 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  S bytes in size.
18260 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18270 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
18280 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18290 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
182a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
182b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
182c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
182d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
182e0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
182f0 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
18300 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
18310 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
18320 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
18330 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
18340 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
18350 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
18360 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
18370 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18380 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18390 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
183a0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
183b0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
183c0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
183d0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
183e0 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
183f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18400 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
18410 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
18420 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
18430 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
18440 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
18450 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
18460 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
18470 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
18480 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
18490 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
184a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
184b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
184c0 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
184d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
184e0 0a 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47  .  value = Tcl_G
184f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
18500 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
18510 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18520 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
18530 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
18540 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
18550 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
18560 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
18570 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
18580 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
18590 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
185a0 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
185b0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
185c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
185d0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
185e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
185f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18600 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
18610 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
18620 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
18630 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
18640 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
18650 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18660 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
18670 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
18680 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
18690 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
186a0 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
186b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
186c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
186d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
186e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
186f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18700 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
18710 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
18720 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
18730 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
18740 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
18750 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
18760 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18770 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
18780 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18790 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
187a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
187b0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
187c0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
187d0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
187e0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
187f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
18800 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
18810 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
18820 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
18830 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
18840 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
18850 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
18860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18870 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
18880 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
18890 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
188a0 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
188b0 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
188c0 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
188d0 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
188e0 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
188f0 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
18900 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
18910 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
18920 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
18930 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18940 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18950 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18960 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18970 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18980 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18990 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  t i;..  if( objc
189a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
189b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
189c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
189d0 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  MT N");.    retu
189e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
189f0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
18a00 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18a10 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18a20 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18a40 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18a50 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18a60 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20  p, objv[2], &i) 
18a70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18a80 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
18a90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a  Result(interp, .
18aa0 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
18ab0 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69  ngObj(sqlite3_bi
18ac0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
18ad0 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20  e(pStmt,i),-1). 
18ae0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
18af0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18b00 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
18b10 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
18b20 64 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a  dex  STMT  NAME.
18b30 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18b40 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69   index of the wi
18b50 6c 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41  ldcard called NA
18b60 4d 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66  ME.  Return 0 if
18b70 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
18b80 73 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a  such wildcard..*
18b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
18ba0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
18bb0 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a  _index(.  void *
18bc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18bd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18be0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18bf0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18c00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18c10 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
18c20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
18c30 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18c40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18c50 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
18c60 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
18c70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18c80 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
18c90 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18ca0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18cb0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
18cc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18cd0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
18ce0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
18cf0 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
18d00 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  (.       sqlite3
18d10 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
18d20 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f  index(pStmt,Tcl_
18d30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
18d40 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a  ])).     ).  );.
18d50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
18d70 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72     sqlite3_clear
18d80 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a  _bindings STMT.*
18d90 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
18da0 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69  test_clear_bindi
18db0 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ngs(.  void * cl
18dc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
18dd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
18de0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18df0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18e00 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18e10 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
18e20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18e30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
18e40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
18e50 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
18e60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18e70 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18e80 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
18e90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
18ea0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
18eb0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
18ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
18ed0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18ee0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
18ef0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  bj(sqlite3_clear
18f00 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29  _bindings(pStmt)
18f10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
18f20 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 55  _OK;.}../*. ** U
18f30 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18f40 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53  clear_bindings S
18f50 54 4d 54 0a 20 2a 2a 0a 20 2a 2f 0a 73 74 61 74  TMT. **. */.stat
18f60 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61  ic int test_clea
18f70 72 5f 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c 28  r_bindings_null(
18f80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18f90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18fa0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18fb0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18fc0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18fd0 29 7b 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ){  .  if( objc!
18fe0 3d 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =1 ){.    return
18ff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19000 20 20 2f 2a 20 74 65 73 74 20 66 6f 72 20 68 61    /* test for ha
19010 6e 64 6c 69 6e 67 20 4e 55 4c 4c 20 3c 72 64 61  ndling NULL <rda
19020 72 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 36 34 36  r://problem/6646
19030 33 33 31 3e 20 2a 2f 0a 20 20 54 63 6c 5f 53 65  331> */.  Tcl_Se
19040 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
19050 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
19060 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  (sqlite3_clear_b
19070 69 6e 64 69 6e 67 73 28 30 29 29 29 3b 0a 20 20  indings(0)));.  
19080 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19090 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
190a0 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d   sqlite3_sleep M
190b0 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73  ILLISECONDS.*/.s
190c0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
190d0 6c 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  leep(.  void * c
190e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
190f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19100 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19110 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19120 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73  jv[].){.  int ms
19130 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
19140 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
19150 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
19160 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49   1, objv, "MILLI
19170 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72  SECONDS");.    r
19180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19190 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
191a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
191b0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d  erp, objv[1], &m
191c0 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  s) ){.    return
191d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
191e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
191f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
19200 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
19210 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20  _sleep(ms)));.  
19220 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19230 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
19240 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
19250 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a  errcode DB.**.**
19260 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
19270 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
19280 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
19290 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
192a0 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  PI.** error code
192b0 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45  . e.g. "SQLITE_E
192c0 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  RROR"..*/.static
192d0 20 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72   int test_ex_err
192e0 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  code(.  void * c
192f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19300 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19310 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19320 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19330 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
19340 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
19350 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
19360 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19370 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19380 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19390 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
193a0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
193b0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
193c0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
193d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
193e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
193f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
19400 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19410 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
19420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19430 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
19440 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64  tended_errcode(d
19450 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  b);.  Tcl_Append
19460 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
19470 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
19480 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
19490 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
194a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
194b0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42  lite3_errcode DB
194c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
194d0 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
194e0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
194f0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
19500 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
19510 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
19520 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
19530 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19540 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20  errcode(.  void 
19550 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
19560 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
19570 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
19580 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
19590 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
195a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
195b0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
195c0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
195d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
195e0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
195f0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19600 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19610 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19620 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
19630 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19640 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
19650 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
19660 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19670 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
19680 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19690 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
196a0 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
196b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
196c0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
196d0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
196e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
196f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
19700 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
19710 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a  _errmsg DB.**.**
19720 20 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46   Returns the UTF
19730 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  -8 representatio
19740 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d  n of the error m
19750 65 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f  essage string fo
19760 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  r the.** most re
19770 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
19780 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  PI call..*/.stat
19790 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d  ic int test_errm
197a0 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
197b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
197c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
197d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
197e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
197f0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
19800 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
19810 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
19820 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
19830 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
19840 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
19850 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
19860 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19870 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19880 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
19890 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
198a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
198b0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
198c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
198d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
198e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
198f0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
19900 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
19910 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
19920 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
19930 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
19940 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
19950 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
19960 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
19970 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
19980 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
19990 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
199a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
199b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
199c0 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
199d0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
199e0 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
199f0 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
19a00 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
19a10 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
19a20 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
19a30 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
19a40 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
19a50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
19a60 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
19a70 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
19a80 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36  nt test_errmsg16
19a90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19aa0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19ab0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19ac0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19ad0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19ae0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
19af0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
19b00 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
19b10 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b  onst void *zErr;
19b20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
19b30 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20  ;.  int bytes = 
19b40 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
19b50 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
19b60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19b70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19b80 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19b90 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19ba0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19bb0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
19bc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19bd0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
19be0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
19bf0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
19c00 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
19c10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19c20 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  ..  zErr = sqlit
19c30 65 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b  e3_errmsg16(db);
19c40 0a 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20  .  if( zErr ){. 
19c50 20 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20     z = zErr;.   
19c60 20 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b   for(bytes=0; z[
19c70 62 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65  bytes] || z[byte
19c80 73 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b  s+1]; bytes+=2){
19c90 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  }.  }.  Tcl_SetO
19ca0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
19cb0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
19cc0 79 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73  yObj(zErr, bytes
19cd0 29 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ));.#endif /* SQ
19ce0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
19cf0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
19d00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
19d10 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
19d20 61 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73  are DB sql bytes
19d30 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
19d40 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
19d50 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
19d60 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
19d70 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
19d80 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
19d90 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
19da0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
19db0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
19dc0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
19dd0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
19de0 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
19df0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
19e00 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
19e10 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
19e20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
19e30 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
19e40 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a  repare(.  void *
19e50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19e60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19e70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19e80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19e90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
19ea0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
19eb0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
19ec0 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
19ed0 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
19ee0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
19ef0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
19f00 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
19f10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
19f20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
19f30 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
19f40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19f50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
19f60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
19f70 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
19f80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19f90 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
19fa0 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a  ?tailvar?", 0);.
19fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19fc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
19fd0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
19fe0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19ff0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1a000 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a010 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1a020 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a030 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
1a040 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a050 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1a060 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1a070 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1a080 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1a090 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  are(db, zSql, by
1a0a0 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
1a0b0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1a0c0 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  0);.  Tcl_ResetR
1a0d0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1a0e0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a0f0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1a100 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1a110 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a120 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e  ( zTail && objc>
1a130 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79  =5 ){.    if( by
1a140 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes>=0 ){.      
1a150 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20  bytes = bytes - 
1a160 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c  (int)(zTail-zSql
1a170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a180 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61   (int)strlen(zTa
1a190 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20  il)<bytes ){.   
1a1a0 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29     bytes = (int)
1a1b0 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20  strlen(zTail);. 
1a1c0 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a     }.    Tcl_Obj
1a1d0 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1a1e0 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f  objv[4], 0, Tcl_
1a1f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61  NewStringObj(zTa
1a200 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a  il, bytes), 0);.
1a210 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1a220 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a230 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20  ssert( pStmt==0 
1a240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
1a250 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
1a260 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64  Buf), zBuf, "(%d
1a270 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63  ) ", rc);.    Tc
1a280 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a290 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c  nterp, zBuf, sql
1a2a0 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
1a2b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a2c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a2d0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
1a2e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
1a2f0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1a300 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
1a310 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1a320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
1a330 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a340 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1a350 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1a360 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a370 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72  sage: sqlite3_pr
1a380 65 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20  epare_v2 DB sql 
1a390 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1a3a0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1a3b0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1a3c0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1a3d0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1a3e0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1a3f0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1a400 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1a410 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1a420 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1a430 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1a440 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1a450 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1a460 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1a470 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1a480 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1a490 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a4a0 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
1a4b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a4c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a4d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a4e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a4f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a500 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a510 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a520 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Sql;.  char *zCo
1a530 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  py = 0;         
1a540 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63         /* malloc
1a550 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20  () copy of zSql 
1a560 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  */.  int bytes;.
1a570 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1a580 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1a590 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1a5a0 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1a5b0 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
1a5c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1a5d0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1a5e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a5f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a600 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a610 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1a620 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a630 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1a640 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
1a650 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1a660 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a670 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1a680 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1a690 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1a6a0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1a6b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1a6c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1a6d0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
1a6e0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a6f0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a700 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1a710 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a720 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f 66  .  /* Instead of
1a730 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72 65   using zSql dire
1a740 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f 70  ctly, make a cop
1a750 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20  y into a buffer 
1a760 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64 69  obtained.  ** di
1a770 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c 6c  rectly from mall
1a780 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20 69  oc(). The idea i
1a790 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73  s to make it eas
1a7a0 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e 64  ier for valgrind
1a7b0 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62 75  .  ** to spot bu
1a7c0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e 20  ffer overreads. 
1a7d0 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73 3e   */.  if( bytes>
1a7e0 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79 20  =0 ){.    zCopy 
1a7f0 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b  = malloc(bytes);
1a800 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70  .    memcpy(zCop
1a810 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29 3b  y, zSql, bytes);
1a820 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1a830 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1a840 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20 20  n(zSql) + 1;.   
1a850 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28   zCopy = malloc(
1a860 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  n);.    memcpy(z
1a870 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b 0a  Copy, zSql, n);.
1a880 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1a890 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1a8a0 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c 20  , zCopy, bytes, 
1a8b0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1a8c0 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1a8d0 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20   free(zCopy);.  
1a8e0 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a  zTail = &zSql[(z
1a8f0 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a  Tail - zCopy)];.
1a900 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1a910 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1a920 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  ==0);.  Tcl_Rese
1a930 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1a940 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1a950 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1a960 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1a970 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a980 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1a990 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62  K && zTail && ob
1a9a0 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1a9b0 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1a9c0 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1a9d0 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1a9e0 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1a9f0 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1aa00 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1aa10 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
1aa20 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
1aa30 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
1aa40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aa50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1aa60 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1aa70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1aa80 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1aa90 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1aaa0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1aab0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1aac0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1aad0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1aae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aaf0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1ab00 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1ab10 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1ab20 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1ab30 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1ab40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ab50 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1ab60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1ab70 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1ab80 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1ab90 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1aba0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
1abb0 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65  3134 DB.**.** Ge
1abc0 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65  nerate a prepare
1abd0 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  d statement for 
1abe0 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69  a zero-byte stri
1abf0 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20  ng as a test.** 
1ac00 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34  for ticket #3134
1ac10 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68  .  The string sh
1ac20 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65 64  ould be preceded
1ac30 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
1ac40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1ac50 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
1ac60 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
1ac70 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ac80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1ac90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1aca0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1acb0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1acc0 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
1acd0 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
1ace0 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
1acf0 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
1ad00 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1ad10 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1ad20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1ad30 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1ad40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1ad50 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1ad60 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1ad70 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1ad80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ad90 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1ada0 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
1adb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1adc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1add0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1ade0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1adf0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ae00 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1ae10 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1ae20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1ae30 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
1ae40 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
1ae50 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1ae60 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1ae70 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
1ae80 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1ae90 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1aea0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aeb0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1aec0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1aed0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1aee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1aef0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1af00 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20  f), zBuf, "(%d) 
1af10 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
1af20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1af30 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
1af40 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
1af50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1af60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1af70 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1af80 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1af90 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1afa0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1afb0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1afc0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
1afd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1afe0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1aff0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1b000 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b010 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1b020 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74  are16 DB sql byt
1b030 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a  es tailvar.**.**
1b040 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
1b050 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
1b060 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
1b070 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
1b080 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1b090 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
1b0a0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
1b0b0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
1b0c0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
1b0d0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
1b0e0 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
1b0f0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
1b100 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
1b110 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
1b120 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1b130 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
1b140 72 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64  repare16(.  void
1b150 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b160 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b170 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b180 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b190 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1b1a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b1b0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1b1c0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1b1d0 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74  d *zSql;.  const
1b1e0 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30   void *zTail = 0
1b1f0 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61  ;.  Tcl_Obj *pTa
1b200 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
1b210 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1b220 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
1b230 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20  0]; .  int rc;. 
1b240 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20   int bytes;     
1b250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b260 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66  e integer specif
1b270 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a  ied as arg 3 */.
1b280 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20    int objlen;   
1b290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b2a0 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65  he byte-array le
1b2b0 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f  ngth of arg 2 */
1b2c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1b2d0 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1b2e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b2f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b300 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b310 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1b320 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b330 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1b340 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1b350 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1b360 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b370 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1b380 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1b390 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b3a0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1b3b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b3c0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
1b3d0 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1b3e0 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
1b3f0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1b400 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1b410 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
1b420 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1b430 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
1b440 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1b450 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  (db, zSql, bytes
1b460 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1b470 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1b480 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b490 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1b4a0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1b4b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b4c0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
1b4d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b4e0 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e    }..  if( objc>
1b4f0 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54  =5 ){.    if( zT
1b500 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a  ail ){.      obj
1b510 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28  len = objlen - (
1b520 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c  int)((u8 *)zTail
1b530 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20  -(u8 *)zSql);.  
1b540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f    }else{.      o
1b550 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  bjlen = 0;.    }
1b560 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c  .    pTail = Tcl
1b570 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1b580 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62  ((u8 *)zTail, ob
1b590 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49  jlen);.    Tcl_I
1b5a0 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ncrRefCount(pTai
1b5b0 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53  l);.    Tcl_ObjS
1b5c0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
1b5d0 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c  bjv[4], 0, pTail
1b5e0 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  , 0);.    Tcl_De
1b5f0 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1b600 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  );.  }..  if( pS
1b610 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1b620 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1b630 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1b640 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1b650 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b660 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65  ;.  }.  Tcl_Appe
1b670 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b680 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69   zBuf, 0);.#endi
1b690 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1b6a0 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
1b6b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b6c0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1b6d0 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  e3_prepare16_v2 
1b6e0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1b6f0 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
1b700 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
1b710 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
1b720 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
1b730 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
1b740 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1b750 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
1b760 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
1b770 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1b780 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
1b790 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
1b7a0 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
1b7b0 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
1b7c0 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
1b7d0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
1b7e0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1b7f0 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
1b800 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20  re16_v2(.  void 
1b810 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b820 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b830 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b840 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b850 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1b860 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1b870 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
1b880 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
1b890 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20   *zSql;.  const 
1b8a0 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  void *zTail = 0;
1b8b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69  .  Tcl_Obj *pTai
1b8c0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
1b8d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1b8e0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1b8f0 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ]; .  int rc;.  
1b900 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20  int bytes;      
1b910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1b920 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69   integer specifi
1b930 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20  ed as arg 3 */. 
1b940 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20   int objlen;    
1b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1b960 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e  e byte-array len
1b970 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a  gth of arg 2 */.
1b980 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1b990 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1b9a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b9b0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1b9c0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1b9d0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1b9e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b9f0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1ba00 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1ba10 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ba20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ba30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1ba40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1ba50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ba60 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1ba70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1ba80 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
1ba90 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1baa0 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
1bab0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1bac0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1bad0 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
1bae0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1baf0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1bb00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
1bb10 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  v2(db, zSql, byt
1bb20 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63  es, &pStmt, objc
1bb30 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30  >=5 ? &zTail : 0
1bb40 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1bb50 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1bb60 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1bb70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bb80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1bb90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bba0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a  ;.  }..  if( obj
1bbb0 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
1bbc0 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f  zTail ){.      o
1bbd0 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d  bjlen = objlen -
1bbe0 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61   (int)((u8 *)zTa
1bbf0 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a  il-(u8 *)zSql);.
1bc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bc10 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20   objlen = 0;.   
1bc20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54   }.    pTail = T
1bc30 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1bc40 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20  bj((u8 *)zTail, 
1bc50 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c  objlen);.    Tcl
1bc60 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _IncrRefCount(pT
1bc70 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ail);.    Tcl_Ob
1bc80 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c  jSetVar2(interp,
1bc90 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61   objv[4], 0, pTa
1bca0 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f  il, 0);.    Tcl_
1bcb0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  DecrRefCount(pTa
1bcc0 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  il);.  }..  if( 
1bcd0 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1bce0 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1bcf0 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1bd00 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1bd10 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1bd20 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70  OR;.  }.  Tcl_Ap
1bd30 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1bd40 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1bd50 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1bd60 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1bd70 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bd80 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1bd90 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61  ite3_open filena
1bda0 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  me ?options-list
1bdb0 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
1bdc0 74 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69  test_open(.  voi
1bdd0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bde0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bdf0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1be00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1be10 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
1be20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1be30 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  name;.  sqlite3 
1be40 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  *db;.  char zBuf
1be50 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
1be60 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=3 && objc!=2
1be70 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
1be80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1be90 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1bea0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1beb0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1bec0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1bed0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65  objv[0]), " file
1bee0 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73  name options-lis
1bef0 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  t", 0);.    retu
1bf00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1bf10 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  }..  zFilename =
1bf20 20 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65   objc>1 ? Tcl_Ge
1bf30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1bf40 20 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   : 0;.  sqlite3_
1bf50 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
1bf60 26 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73  &db);.  .  if( s
1bf70 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1bf80 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1bf90 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74   zBuf, db) ) ret
1bfa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bfb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bfc0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1bfd0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
1bfe0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1bff0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1c000 6e 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c  n_v2 FILENAME FL
1c010 41 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69  AGS VFS.*/.stati
1c020 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f  c int test_open_
1c030 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  v2(.  void * cli
1c040 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c050 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c060 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c070 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c080 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  [].){.  const ch
1c090 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
1c0a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
1c0b0 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1c0c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
1c0d0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  b;.  int rc;.  c
1c0e0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1c0f0 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54    int nFlag;.  T
1c100 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b  cl_Obj **apFlag;
1c110 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
1c120 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1c130 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1c140 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1c150 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47  , "FILENAME FLAG
1c160 53 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74  S VFS");.    ret
1c170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c180 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
1c190 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c1a0 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20  bjv[1]);.  zVfs 
1c1b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1c1c0 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  objv[3]);.  if( 
1c1d0 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20  zVfs[0]==0x00 ) 
1c1e0 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20  zVfs = 0;..  rc 
1c1f0 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74  = Tcl_ListObjGet
1c200 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
1c210 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67   objv[2], &nFlag
1c220 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66  , &apFlag);.  if
1c230 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
1c240 65 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28  eturn rc;.  for(
1c250 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b  i=0; i<nFlag; i+
1c260 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61  +){.    int iFla
1c270 67 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70  g;.    struct Op
1c280 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63  enFlag {.      c
1c290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67  onst char *zFlag
1c2a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
1c2b0 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20  ;.    } aFlag[] 
1c2c0 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c  = {.      { "SQL
1c2d0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1c2e0 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y", SQLITE_OPEN_
1c2f0 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
1c300 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c310 5f 52 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c  _READWRITE", SQL
1c320 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1c330 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  TE },.      { "S
1c340 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1c350 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1c360 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
1c370 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  { "SQLITE_OPEN_D
1c380 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53  ELETEONCLOSE", S
1c390 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1c3a0 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20  EONCLOSE },.    
1c3b0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c3c0 5f 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c  _EXCLUSIVE", SQL
1c3d0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1c3e0 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  VE },.      { "S
1c3f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1c400 52 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ROXY", SQLITE_OP
1c410 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a  EN_AUTOPROXY },.
1c420 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1c430 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53  OPEN_MAIN_DB", S
1c440 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1c450 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  DB },.      { "S
1c460 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1c470 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1c480 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20  _TEMP_DB },.    
1c490 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c4a0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20  _TRANSIENT_DB", 
1c4b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1c4c0 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20  SIENT_DB },.    
1c4d0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c4e0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _MAIN_JOURNAL", 
1c4f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1c500 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c510 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c520 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20  _TEMP_JOURNAL", 
1c530 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1c540 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c550 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c560 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  _SUBJOURNAL", SQ
1c570 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
1c580 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  RNAL },.      { 
1c590 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  "SQLITE_OPEN_MAS
1c5a0 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51  TER_JOURNAL", SQ
1c5b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1c5c0 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  _JOURNAL },.    
1c5d0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c5e0 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  _NOMUTEX", SQLIT
1c5f0 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d  E_OPEN_NOMUTEX }
1c600 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1c610 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1c620 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  ", SQLITE_OPEN_F
1c630 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20  ULLMUTEX },.    
1c640 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1c650 5f 53 48 41 52 45 44 43 41 43 48 45 22 2c 20 53  _SHAREDCACHE", S
1c660 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
1c670 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
1c680 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  { "SQLITE_OPEN_P
1c690 52 49 56 41 54 45 43 41 43 48 45 22 2c 20 53 51  RIVATECACHE", SQ
1c6a0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
1c6b0 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
1c6c0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  { "SQLITE_OPEN_W
1c6d0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1c6e0 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20  _WAL },.      { 
1c6f0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  "SQLITE_OPEN_URI
1c700 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  ", SQLITE_OPEN_U
1c710 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c  RI },.      { 0,
1c720 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20   0 }.    };.    
1c730 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65  rc = Tcl_GetInde
1c740 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69  xFromObjStruct(i
1c750 6e 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d  nterp, apFlag[i]
1c760 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28  , aFlag, sizeof(
1c770 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20  aFlag[0]), .    
1c780 20 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26      "flag", 0, &
1c790 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20  iFlag.    );.   
1c7a0 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1c7b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1c7c0 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b   flags |= aFlag[
1c7d0 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d  iFlag].flag;.  }
1c7e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1c7f0 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61  _open_v2(zFilena
1c800 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20  me, &db, flags, 
1c810 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c  zVfs);.  if( sql
1c820 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1c830 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1c840 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1c850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1c860 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c870 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1c880 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1c890 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1c8a0 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  e: sqlite3_open1
1c8b0 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  6 filename optio
1c8c0 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ns.*/.static int
1c8d0 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20   test_open16(.  
1c8e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1c8f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1c900 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1c910 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1c920 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1c930 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c940 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73  MIT_UTF16.  cons
1c950 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d  t void *zFilenam
1c960 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
1c970 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1c980 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
1c990 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1c9a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c9b0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1c9c0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1c9d0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1c9e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1c9f0 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69   " filename opti
1ca00 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ons-list", 0);. 
1ca10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ca20 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c  ROR;.  }..  zFil
1ca30 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42  ename = Tcl_GetB
1ca40 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1ca50 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73  objv[1], 0);.  s
1ca60 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46  qlite3_open16(zF
1ca70 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20  ilename, &db);. 
1ca80 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54   .  if( sqlite3T
1ca90 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1caa0 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1cab0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1cac0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70  _ERROR;.  Tcl_Ap
1cad0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cae0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e  p, zBuf, 0);.#en
1caf0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1cb00 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
1cb10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1cb20 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1cb30 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20  ite3_complete16 
1cb40 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a  <UTF-16 string>.
1cb50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69  **.** Return 1 i
1cb60 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61  f the supplied a
1cb70 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d  rgument is a com
1cb80 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d  plete SQL statem
1cb90 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20  ent, or zero.** 
1cba0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1cbb0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1cbc0 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64  mplete16(.  void
1cbd0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1cbe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1cbf0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1cc00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1cc10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1cc20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1cc30 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26  OMIT_COMPLETE) &
1cc40 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1cc50 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20  E_OMIT_UTF16).  
1cc60 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
1cc70 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1cc80 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1cc90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1cca0 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
1ccb0 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
1ccc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1ccd0 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29    zBuf = (char*)
1cce0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1ccf0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
1cd00 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
1cd10 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1cd20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1cd30 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
1cd40 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
1cd50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1cd60 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49  COMPLETE && SQLI
1cd70 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1cd80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cda0 3a 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53  : sqlite3_step S
1cdb0 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63  TMT.**.** Advanc
1cdc0 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
1cdd0 74 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e  to the next row.
1cde0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1cdf0 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64  est_step(.  void
1ce00 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1ce10 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1ce20 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1ce30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1ce40 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1ce50 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ce60 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
1ce70 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1ce80 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ce90 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1cea0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ceb0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1cec0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1ced0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1cee0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1cef0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cf00 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1cf10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1cf20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cf30 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1cf40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1cf50 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1cf60 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a  3_step(pStmt);..
1cf70 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c    /* if( rc!=SQL
1cf80 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d  ITE_DONE && rc!=
1cf90 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74  SQLITE_ROW ) ret
1cfa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a  urn TCL_ERROR; *
1cfb0 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  /.  Tcl_SetResul
1cfc0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1cfd0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1cfe0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1cff0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1d000 63 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a  c int test_sql(.
1d010 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d020 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1d030 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1d040 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1d050 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1d060 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1d070 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1d080 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1d090 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1d0a0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1d0b0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1d0c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d0d0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1d0e0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1d0f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1d100 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1d110 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d120 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
1d130 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1d140 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71  har *)sqlite3_sq
1d150 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f  l(pStmt), TCL_VO
1d160 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
1d170 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d180 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d190 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53  3_column_count S
1d1a0 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1d1b0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1d1c0 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1d1d0 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1d1e0 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1d1f0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1d200 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76  olumn_count(.  v
1d210 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1d220 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1d230 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d240 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d250 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1d260 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d270 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1d280 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1d290 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d2a0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d2b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d2c0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d2d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d2e0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1d2f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d310 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1d320 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1d330 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1d340 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1d350 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d360 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1d370 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d380 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1d390 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
1d3a0 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1d3b0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d3c0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d3d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
1d3e0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
1d3f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  ** Return the ty
1d400 70 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  pe of the data i
1d410 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1d420 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1d430 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1d440 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1d450 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  type(.  void * c
1d460 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d470 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d480 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d490 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d4a0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d4b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1d4c0 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20   int col;.  int 
1d4d0 74 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  tp;..  if( objc!
1d4e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d4f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d500 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d510 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d520 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d530 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d540 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d550 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d560 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d570 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d580 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d590 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d5a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d5b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d5c0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d5d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d5e0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d5f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d600 4f 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69  OR;..  tp = sqli
1d610 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
1d620 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73  pStmt, col);.  s
1d630 77 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20  witch( tp ){.   
1d640 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
1d650 45 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c  EGER: .      Tcl
1d660 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1d670 70 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43  p, "INTEGER", TC
1d680 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1d690 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1d6a0 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20  e SQLITE_NULL:. 
1d6b0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1d6c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c  lt(interp, "NULL
1d6d0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1d6e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1d6f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c    case SQLITE_FL
1d700 4f 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  OAT:.      Tcl_S
1d710 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1d720 20 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54   "FLOAT", TCL_ST
1d730 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1d740 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
1d750 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20  LITE_TEXT:.     
1d760 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1d770 6e 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54  nterp, "TEXT", T
1d780 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1d790 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1d7a0 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a  se SQLITE_BLOB:.
1d7b0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1d7c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f  ult(interp, "BLO
1d7d0 42 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  B", TCL_STATIC);
1d7e0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1d7f0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
1d800 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d    assert(0);.  }
1d810 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1d820 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d830 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d840 6e 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c  n_int64 STMT col
1d850 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  umn.**.** Return
1d860 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c   the data in col
1d870 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20  umn 'column' of 
1d880 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20  the current row 
1d890 63 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69  cast as an.** wi
1d8a0 64 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65  de (64-bit) inte
1d8b0 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ger..*/.static i
1d8c0 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69  nt test_column_i
1d8d0 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
1d8e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d8f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d900 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d910 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d920 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d930 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1d940 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20   int col;.  i64 
1d950 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  iVal;..  if( obj
1d960 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1d970 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d980 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d990 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d9a0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d9b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d9c0 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1d9d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1d9e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1d9f0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1da00 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1da10 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1da20 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1da30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1da40 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1da50 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1da60 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1da70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1da80 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20  RROR;..  iVal = 
1da90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
1daa0 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29  nt64(pStmt, col)
1dab0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1dac0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1dad0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69  _NewWideIntObj(i
1dae0 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1daf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1db00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1db10 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54  column_blob STMT
1db20 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1db30 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d  c int test_colum
1db40 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
1db50 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1db60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1db70 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1db80 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1db90 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1dba0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1dbb0 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69  .  int col;..  i
1dbc0 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  nt len;.  const 
1dbd0 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20  void *pBlob;..  
1dbe0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1dbf0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1dc00 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1dc10 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1dc20 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1dc30 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1dc40 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1dc50 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1dc60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dc70 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1dc80 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1dc90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1dca0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1dcb0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1dcc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1dcd0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1dce0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1dcf0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1dd00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1dd10 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  len = sqlite3_co
1dd20 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1dd30 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  , col);.  pBlob 
1dd40 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1dd50 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c  _blob(pStmt, col
1dd60 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1dd70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1dd80 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1dd90 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a  j(pBlob, len));.
1dda0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ddb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ddc0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ddd0 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75  double STMT colu
1dde0 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1ddf0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1de00 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1de10 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1de20 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e  ast as a double.
1de30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1de40 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
1de50 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1de60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1de70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1de80 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1de90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1dea0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1deb0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1dec0 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20  t col;.  double 
1ded0 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  rVal;..  if( obj
1dee0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1def0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1df00 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1df10 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1df20 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1df30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1df40 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1df50 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1df60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1df70 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1df80 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1df90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1dfa0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1dfb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dfc0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1dfd0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1dfe0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1dff0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e000 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20  RROR;..  rVal = 
1e010 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1e020 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c  ouble(pStmt, col
1e030 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1e040 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1e050 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
1e060 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1e070 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e080 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1e090 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20  data_count STMT 
1e0a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1e0b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1e0c0 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
1e0d0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
1e0e0 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
1e0f0 63 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f  c int test_data_
1e100 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1e110 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e120 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e130 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e140 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e150 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1e160 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1e170 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1e180 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e190 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e1a0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e1b0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e1c0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e1d0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1e1e0 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1e1f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e200 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1e210 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1e220 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1e230 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1e240 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1e250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1e260 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1e270 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1e280 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
1e290 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  ata_count(pStmt)
1e2a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1e2b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e2c0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1e2d0 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f  umn_text STMT co
1e2e0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1e2f0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1e300 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63  _decltype STMT c
1e310 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1e320 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1e330 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75  n_name STMT colu
1e340 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  mn.*/.static int
1e350 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
1e360 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e370 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
1e380 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1e390 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1e3a0 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
1e3b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e3c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e3d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e3e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1e3f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1e400 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1e410 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
1e420 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1e430 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73  t*, int);.  cons
1e440 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
1e450 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
1e460 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65  char *(*)(sqlite
1e470 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
1e480 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
1e490 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1e4a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1e4b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1e4c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1e4d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1e4e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1e4f0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1e500 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1e510 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e520 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1e530 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1e540 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e550 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1e560 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e570 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1e580 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1e590 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1e5a0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1e5b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
1e5c0 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1e5d0 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
1e5e0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
1e5f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e600 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
1e610 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1e620 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1e630 74 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65  t test_global_re
1e640 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
1e650 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e660 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e670 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e680 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e690 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1e6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
1e6b0 52 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63  RECATED.  int rc
1e6c0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
1e6d0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1e6e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1e6f0 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
1e700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e710 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
1e720 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
1e730 63 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53  cover();.  Tcl_S
1e740 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1e750 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1e760 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
1e770 41 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ATIC);.#endif.  
1e780 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e790 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e7a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1e7b0 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  xt STMT column.*
1e7c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1e7d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
1e7e0 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  ype STMT column.
1e7f0 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
1e800 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
1e810 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1e820 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e830 73 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f  stmt_utf16(.  vo
1e840 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e850 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1e860 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
1e870 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
1e880 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
1e890 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e8a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e8b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e8c0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1e8d0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1e8e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1e8f0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1e900 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
1e910 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1e920 7a 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74  zName16;.  const
1e930 20 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28   void *(*xFunc)(
1e940 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1e950 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1e960 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29  (const void *(*)
1e970 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1e980 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b  int))clientData;
1e990 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
1e9a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1e9b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1e9c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1e9d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1e9e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1e9f0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
1ea00 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b  TMT column", 0);
1ea10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ea20 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1ea30 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
1ea40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ea50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1ea60 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
1ea70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1ea80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1ea90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1eaa0 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65  v[2], &col) ) re
1eab0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1eac0 0a 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75  .  zName16 = xFu
1ead0 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a  nc(pStmt, col);.
1eae0 20 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b    if( zName16 ){
1eaf0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
1eb00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1eb10 7a 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72  zName16;.    for
1eb20 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b  (n=0; z[n] || z[
1eb30 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20  n+1]; n+=2){}.  
1eb40 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
1eb50 42 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61  ByteArrayObj(zNa
1eb60 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20  me16, n+2);.    
1eb70 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1eb80 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
1eb90 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1eba0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1ebb0 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  */..  return TCL
1ebc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ebd0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1ebe0 75 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c  umn_int STMT col
1ebf0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1ec00 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1ec10 62 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d  bytes STMT colum
1ec20 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
1ec30 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1ec40 74 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d  tes16 STMT colum
1ec50 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n.**.*/.static i
1ec60 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  nt test_stmt_int
1ec70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1ec80 74 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69  tData,    /* Poi
1ec90 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1eca0 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1ecb0 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1ecc0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ecd0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ece0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ecf0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1ed00 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1ed10 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e  .  int col;.  in
1ed20 74 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  t (*xFunc)(sqlit
1ed30 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a  e3_stmt*, int);.
1ed40 0a 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20  .  xFunc = (int 
1ed50 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
1ed60 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
1ed70 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
1ed80 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1ed90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1eda0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1edb0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1edc0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1edd0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1ede0 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1edf0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1ee00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1ee10 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1ee20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1ee30 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1ee40 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1ee50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ee60 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1ee70 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1ee80 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1ee90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1eea0 52 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  R;..  Tcl_SetObj
1eeb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1eec0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75  cl_NewIntObj(xFu
1eed0 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29  nc(pStmt, col)))
1eee0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1eef0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1ef00 65 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  e:  sqlite_set_m
1ef10 61 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d  agic  DB  MAGIC-
1ef20 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74  NUMBER.**.** Set
1ef30 20 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76   the db->magic v
1ef40 61 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75  alue.  This is u
1ef50 73 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f  sed to test erro
1ef60 72 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63  r recovery logic
1ef70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ef80 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
1ef90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1efa0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1efb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1efc0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1efd0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1efe0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1eff0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1f000 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f010 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f020 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f030 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
1f040 20 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49         " DB MAGI
1f050 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  C", 0);.    retu
1f060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f070 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1f080 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1f090 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1f0a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f0b0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
1f0c0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
1f0d0 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a  IC_OPEN")==0 ){.
1f0e0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1f0f0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
1f100 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  N;.  }else if( s
1f110 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
1f120 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1f130 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  SED")==0 ){.    
1f140 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1f150 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b  TE_MAGIC_CLOSED;
1f160 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
1f170 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
1f180 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22  LITE_MAGIC_BUSY"
1f190 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1f1a0 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1f1b0 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  AGIC_BUSY;.  }el
1f1c0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
1f1d0 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
1f1e0 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20  AGIC_ERROR")==0 
1f1f0 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63  ){.    db->magic
1f200 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
1f210 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69  ERROR;.  }else i
1f220 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
1f230 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28  terp, argv[2], (
1f240 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29  int*)&db->magic)
1f250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1f260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f270 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1f280 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1f290 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
1f2a0 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69  t  DB .**.** Tri
1f2b0 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70  gger an interrup
1f2c0 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  t on DB.*/.stati
1f2d0 63 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72  c int test_inter
1f2e0 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
1f2f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1f300 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f310 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1f320 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1f330 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1f340 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
1f350 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f360 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f370 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f380 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1f390 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1f3a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f3b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f3c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f3d0 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1f3e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f3f0 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
1f400 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
1f410 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f420 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69  .static u8 *sqli
1f430 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1f440 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46  ne = 0;../*.** F
1f450 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69  ill the stack wi
1f460 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61  th a known bitpa
1f470 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ttern..*/.static
1f480 20 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28   void prepStack(
1f490 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  void){.  int i;.
1f4a0 20 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35    u32 bigBuf[655
1f4b0 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  36];.  for(i=0; 
1f4c0 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29  i<sizeof(bigBuf)
1f4d0 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30  /sizeof(bigBuf[0
1f4e0 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b  ]); i++) bigBuf[
1f4f0 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b  i] = 0xdeadbeef;
1f500 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  .  sqlite3_stack
1f510 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a  _baseline = (u8*
1f520 29 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b  )&bigBuf[65536];
1f530 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68  .}../*.** Get th
1f540 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20  e current stack 
1f550 64 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72  depth.  Used for
1f560 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
1f570 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53  .*/.u64 sqlite3S
1f580 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b  tackDepth(void){
1f590 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72  .  u8 x;.  retur
1f5a0 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f  n (u64)(sqlite3_
1f5b0 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d  stack_baseline -
1f5c0 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   &x);.}../*.** U
1f5d0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
1f5e0 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c  tack_used DB SQL
1f5f0 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65  .**.** Try to me
1f600 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74  asure the amount
1f610 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20   of stack space 
1f620 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74  used by a call t
1f630 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a  o sqlite3_exec.*
1f640 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1f650 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20  t_stack_used(.  
1f660 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f670 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f680 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1f690 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1f6a0 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
1f6b0 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
1f6c0 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1f6d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1f6e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1f6f0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1f700 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1f710 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1f720 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
1f730 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f740 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1f750 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1f760 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1f770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f780 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b  ;.  prepStack();
1f790 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
1f7a0 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
1f7b0 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66  ], 0, 0, 0);.  f
1f7c0 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30  or(i=65535; i>=0
1f7d0 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74   && ((u32*)sqlit
1f7e0 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1f7f0 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65  e)[-i]==0xdeadbe
1f800 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c  ef; i--){}.  Tcl
1f810 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f820 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1f830 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74  Obj(i*4));.  ret
1f840 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f850 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f860 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
1f870 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e  on DB function-n
1f880 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
1f890 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1f8a0 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  on 'function-nam
1f8b0 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
1f8c0 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a   handle DB. It.*
1f8d0 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  * is assumed tha
1f8e0 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  t the user funct
1f8f0 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20  ion was created 
1f900 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d  as UTF8, any num
1f910 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
1f920 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65  nts (the way the
1f930 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
1f940 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
1f950 69 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75  ic int delete_fu
1f960 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
1f970 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f980 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f990 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1f9a0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1f9b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1f9c0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1f9d0 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1f9e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f9f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1fa00 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1fa10 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1fa20 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1fa30 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1fa40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fa50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1fa60 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1fa70 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1fa80 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1fa90 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1faa0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1fab0 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
1fac0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
1fad0 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  F8, 0, 0, 0, 0);
1fae0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1faf0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1fb00 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1fb10 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
1fb20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fb30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fb40 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
1fb50 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61  llation DB colla
1fb60 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
1fb70 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61  Delete the colla
1fb80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63  tion sequence 'c
1fb90 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  ollation-name' f
1fba0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
1fbb0 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69  dle .** DB. It i
1fbc0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1fbd0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1fbe0 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65  uence was create
1fbf0 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a  d as UTF8 (the .
1fc00 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  ** way the TCL i
1fc10 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
1fc20 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1fc30 20 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f   delete_collatio
1fc40 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1fc50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1fc60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1fc70 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1fc80 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74   **argv.){.  int
1fc90 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
1fca0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
1fcb0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1fcc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fcd0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fce0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fcf0 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
1fd00 20 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d    " DB function-
1fd10 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  name", 0);.    r
1fd20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fd30 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1fd40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1fd50 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
1fd60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fd70 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1fd80 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
1fd90 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53  n(db, argv[2], S
1fda0 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30  QLITE_UTF8, 0, 0
1fdb0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1fdc0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1fdd0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1fde0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1fdf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1fe00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1fe10 3a 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  : sqlite3_get_au
1fe20 74 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a  tocommit DB.**.*
1fe30 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1fe40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
1fe50 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   is currently in
1fe60 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64   auto-commit mod
1fe70 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  e..** Return fal
1fe80 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  se if not..*/.st
1fe90 61 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74  atic int get_aut
1fea0 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20  ocommit(.  void 
1feb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1fec0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fed0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1fee0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1fef0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
1ff00 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1ff10 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1ff20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ff30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ff40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ff50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1ff60 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
1ff70 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1ff80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1ff90 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1ffa0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1ffb0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1ffc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ffd0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1ffe0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
1fff0 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71  , zBuf, "%d", sq
20000 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
20010 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c  mmit(db));.  Tcl
20020 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
20030 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
20040 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20060 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
20070 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a  meout DB MS.**.*
20080 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 74  * Set the busy t
20090 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73  imeout.  This is
200a0 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e   more easily don
200b0 65 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65  e using the time
200c0 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66  out.** method of
200d0 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
200e0 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  ce.  But we need
200f0 20 61 20 77 61 79 20 74 6f 20 74 65 73 74 20 74   a way to test t
20100 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65  he case.** where
20110 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
20120 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74  TE_MISUSE..*/.st
20130 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75  atic int test_bu
20140 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f  sy_timeout(.  vo
20150 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20160 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20170 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
20180 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
20190 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73  .){.  int rc, ms
201a0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
201b0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
201c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
201d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
201e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
201f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
20200 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
20210 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
20220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20230 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
20240 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
20250 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
20260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20270 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
20280 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
20290 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
202a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
202b0 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f   = sqlite3_busy_
202c0 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b  timeout(db, ms);
202d0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
202e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
202f0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
20300 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
20310 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
20320 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62  age:  tcl_variab
20330 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45  le_type VARIABLE
20340 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
20350 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
20360 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
20370 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  sentation for th
20380 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
20390 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65  e given variable
203a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
203b0 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
203c0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
203d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
203e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
203f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20400 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20410 5d 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ].){.  Tcl_Obj *
20420 70 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63  pVar;.  if( objc
20430 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
20440 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
20450 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41  rp, 1, objv, "VA
20460 52 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65  RIABLE");.    re
20470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20480 20 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c    }.  pVar = Tcl
20490 5f 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72  _GetVar2Ex(inter
204a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
204b0 28 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43  (objv[1]), 0, TC
204c0 4c 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29  L_LEAVE_ERR_MSG)
204d0 3b 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20  ;.  if( pVar==0 
204e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
204f0 4f 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e  OR;.  if( pVar->
20500 74 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54  typePtr ){.    T
20510 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
20520 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
20530 74 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74  tringObj(pVar->t
20540 79 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31  ypePtr->name, -1
20550 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
20560 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20570 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
20580 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
20590 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d   ?N?.**.** Attem
205a0 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  pt to release me
205b0 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68  mory currently h
205c0 65 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75  eld but not actu
205d0 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a  ally required..*
205e0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20  * The integer N 
205f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
20600 20 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72   bytes we are tr
20610 79 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e  ying to release.
20620 20 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e    The .** return
20630 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d   value is the am
20640 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61  ount of memory a
20650 63 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64  ctually released
20660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20670 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  test_release_mem
20680 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ory(.  void * cl
20690 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
206a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
206b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
206c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
206d0 76 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e  v[].){.#if defin
206e0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
206f0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
20700 4e 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  NT) && !defined(
20710 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
20720 49 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69  IO).  int N;.  i
20730 6e 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62  nt amt;.  if( ob
20740 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
20750 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
20760 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
20770 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29   1, objv, "?N?")
20780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20790 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
207a0 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
207b0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
207c0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
207d0 62 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65  bjv[1], &N) ) re
207e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
207f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d    }else{.    N =
20800 20 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d   -1;.  }.  amt =
20810 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
20820 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63  _memory(N);.  Tc
20830 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
20840 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
20850 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64  tObj(amt));.#end
20860 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
20870 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
20880 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
20890 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
208a0 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  DB.**.** Attempt
208b0 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
208c0 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
208d0 64 20 62 79 20 64 61 74 61 62 61 73 65 20 44 42  d by database DB
208e0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a  .  Return the.**
208f0 20 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68   result code (wh
20900 69 63 68 20 69 6e 20 74 68 65 20 63 75 72 72 65  ich in the curre
20910 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
20920 6e 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f  n is always zero
20930 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
20940 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
20950 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
20960 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20970 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20980 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20990 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
209a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
209b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
209c0 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rc;.  if( objc!=
209d0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
209e0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
209f0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
20a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20a10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
20a20 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20a30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20a40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20a50 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20a60 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
20a70 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
20a80 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20  e_memory(db);.  
20a90 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
20aa0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
20ab0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
20ac0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
20ad0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
20ae0 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
20af0 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  lush DB.**.** At
20b00 74 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20 61  tempt to flush a
20b10 6e 79 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ny dirty pages t
20b20 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
20b30 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 63 61  c int test_db_ca
20b40 63 68 65 66 6c 75 73 68 28 0a 20 20 76 6f 69 64  cheflush(.  void
20b50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20b60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20b70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
20b80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20b90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
20ba0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
20bb0 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
20bc0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
20bd0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
20be0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
20bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20c00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
20c10 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
20c20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
20c30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
20c40 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
20c50 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
20c60 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
20c70 66 6c 75 73 68 28 64 62 29 3b 0a 20 20 69 66 28  flush(db);.  if(
20c80 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
20c90 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20ca0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
20cb0 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f  ErrStr(rc), TCL_
20cc0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
20cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20ce0 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52   }..  Tcl_ResetR
20cf0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
20d00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20d10 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20d20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65   sqlite3_db_file
20d30 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a  name DB DBNAME.*
20d40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
20d50 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61  name of a file a
20d60 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
20d70 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
20d80 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62  atic int test_db
20d90 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69  _filename(.  voi
20da0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20db0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20dc0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20dd0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20de0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20df0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
20e00 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
20e10 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
20e20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
20e30 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
20e40 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
20e50 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
20e60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20e70 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
20e80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
20e90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20ea0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
20eb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20ec0 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
20ed0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
20ee0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
20ef0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
20f00 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
20f10 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28  (db, zDbName), (
20f20 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75  void*)0);.  retu
20f30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20f40 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
20f50 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20  te3_db_readonly 
20f60 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
20f70 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66  Return 1 or 0 if
20f80 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f   DBNAME is reado
20f90 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74  nly or not.  Ret
20fa0 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45  urn -1 if DBNAME
20fb0 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69   does.** not exi
20fc0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
20fd0 74 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e  t test_db_readon
20fe0 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ly(.  void * cli
20ff0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
21000 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
21010 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
21020 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21030 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
21040 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
21050 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
21060 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
21070 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
21080 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
21090 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
210a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
210b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
210c0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
210d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
210e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
210f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
21100 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
21110 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
21120 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
21130 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21140 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
21150 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72  Obj(sqlite3_db_r
21160 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e  eadonly(db, zDbN
21170 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ame)));.  return
21180 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
21190 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
211a0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
211b0 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72  t ?N?.**.** Quer
211c0 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66  y or set the sof
211d0 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72  t heap limit for
211e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
211f0 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d  ead.  The.** lim
21200 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67  it is only chang
21210 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70  ed if the N is p
21220 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65  resent.  The pre
21230 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69  vious limit.** i
21240 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
21250 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
21260 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a  oft_heap_limit(.
21270 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
21280 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21290 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
212a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
212b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
212c0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
212d0 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64  4 amt;.  Tcl_Wid
212e0 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69  eInt N = -1;.  i
212f0 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
21300 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
21310 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
21320 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
21330 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
21340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21350 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
21360 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
21370 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28  tWideIntFromObj(
21380 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
21390 20 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &N) ) return TC
213a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  L_ERROR;.  }.  a
213b0 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66  mt = sqlite3_sof
213c0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e  t_heap_limit64(N
213d0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
213e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
213f0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
21400 61 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  amt));.  return 
21410 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
21420 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
21430 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
21440 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
21450 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
21460 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73  leanup API..*/.s
21470 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74  tatic int test_t
21480 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20  hread_cleanup(. 
21490 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
214a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
214b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
214c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
214d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
214e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
214f0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
21500 20 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64    sqlite3_thread
21510 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64  _cleanup();.#end
21520 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
21530 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
21540 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61  ge:   sqlite3_pa
21550 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44  ger_refcounts  D
21560 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  B.**.** Return a
21570 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73   list of numbers
21580 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 50   which are the P
21590 61 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72  agerRefcount for
215a0 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f   all.** pagers o
215b0 6e 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  n each database 
215c0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
215d0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
215e0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a  ager_refcounts(.
215f0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
21600 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
21610 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
21620 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
21630 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
21640 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
21650 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
21660 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  v, *a;.  Tcl_Obj
21670 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66   *pResult;..  if
21680 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21690 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
216a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
216b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
216c0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
216d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
216e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
216f0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
21700 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21710 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
21720 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
21730 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
21740 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
21750 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21760 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54  R;.  pResult = T
21770 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66  cl_NewObj();.  f
21780 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
21790 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
217a0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d   db->aDb[i].pBt=
217b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  =0 ){.      v = 
217c0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
217d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
217e0 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
217f0 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73  ex);.      a = s
21800 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
21810 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
21820 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  er(db->aDb[i].pB
21830 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61  t));.      v = a
21840 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  [0];.      sqlit
21850 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
21860 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  b->mutex);.    }
21870 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
21880 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
21890 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65   pResult, Tcl_Ne
218a0 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d  wIntObj(v));.  }
218b0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
218c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73  ult(interp, pRes
218d0 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
218e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
218f0 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69   tclcmd:   worki
21900 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a  ng_64bit_int.**.
21910 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c  ** Some TCL buil
21920 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20  ds (ex: cygwin) 
21930 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36  do not support 6
21940 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
21950 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74   This.** leads t
21960 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65  o a number of te
21970 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68  st failures.  Th
21980 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e  e present comman
21990 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20  d checks the.** 
219a0 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65  TCL build to see
219b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
219c0 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62  it supports 64-b
219d0 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74  it integers.  It
219e0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45  .** returns TRUE
219f0 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
21a00 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a  FALSE if not..**
21a10 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
21a20 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e   is used to warn
21a30 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69   users that thei
21a40 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64  r TCL build is d
21a50 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20  efective.** and 
21a60 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20  that the errors 
21a70 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20  they are seeing 
21a80 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69  in the test scri
21a90 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  pts might be.** 
21aa0 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69  a result of thei
21ab0 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20  r defective TCL 
21ac0 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62  rather than prob
21ad0 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  lems in SQLite..
21ae0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f  */.static int wo
21af0 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
21b00 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
21b10 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
21b20 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
21b30 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
21b40 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21b50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21b60 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21b70 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21b80 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21b90 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21bb0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21bc0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21bd0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
21be0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
21bf0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
21c00 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
21c10 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
21c20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
21c30 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
21c40 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
21c50 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
21c60 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
21c70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
21c80 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
21c90 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
21ca0 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
21cb0 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
21cc0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
21cd0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
21ce0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
21cf0 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
21d00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
21d10 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
21d20 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
21d30 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
21d40 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
21d50 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
21d60 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
21d70 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
21d80 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
21d90 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
21da0 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
21db0 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
21dc0 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
21dd0 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
21de0 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
21df0 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
21e00 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
21e10 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
21e20 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
21e30 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b  c int vfs_unlink
21e40 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
21e50 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
21e60 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
21e70 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
21e80 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
21e90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21ea0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
21eb0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
21ec0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
21ed0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
21ee0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
21ef0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21f00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
21f10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
21f20 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
21f30 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
21f40 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
21f50 74 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a  te3_vfs *pMain;.
21f60 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61    sqlite3_vfs *a
21f70 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69  pVfs[20];.  sqli
21f80 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f  te3_vfs one, two
21f90 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
21fa0 5f 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20  _unregister(0); 
21fb0 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
21fc0 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c  of NULL is harml
21fd0 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61  ess */.  one.zNa
21fe0 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20  me = "__one";.  
21ff0 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74  two.zName = "__t
22000 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69  wo";..  /* Calli
22010 6e 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  ng sqlite3_vfs_r
22020 65 67 69 73 74 65 72 20 77 69 74 68 20 32 6e 64  egister with 2nd
22030 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64   argument of 0 d
22040 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61  oes not.  ** cha
22050 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
22060 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e  VFS.  */.  pMain
22070 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
22080 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  ind(0);.  sqlite
22090 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
220a0 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  one, 0);.  asser
220b0 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70  t( pMain==0 || p
220c0 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66  Main==sqlite3_vf
220d0 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73  s_find(0) );.  s
220e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
220f0 74 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20  ter(&two, 0);.  
22100 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
22110 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
22120 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
22130 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66  ;..  /* We can f
22140 69 6e 64 20 61 20 56 46 53 20 62 79 20 69 74 73  ind a VFS by its
22150 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72   name */.  asser
22160 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
22170 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
22180 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
22190 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
221a0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
221b0 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  );..  /* Calling
221c0 20 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69   sqlite_vfs_regi
221d0 73 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65  ster with non-ze
221e0 72 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  ro second parame
221f0 74 65 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a  ter changes the.
22200 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53    ** default VFS
22210 2c 20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73  , even if the 1s
22220 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
22230 6e 20 65 78 69 73 74 69 67 20 56 46 53 20 74 68  n existig VFS th
22240 61 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69  at is.  ** previ
22250 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
22260 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61   as the non-defa
22270 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ult..  */.  sqli
22280 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
22290 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73  (&one, 1);.  ass
222a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
222b0 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
222c0 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
222d0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
222e0 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
222f0 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
22300 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
22310 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71  0)==&one );.  sq
22320 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
22330 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61  er(&two, 1);.  a
22340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
22350 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29  fs_find("__one")
22360 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65  ==&one );.  asse
22370 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
22380 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26  find("__two")==&
22390 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  two );.  assert(
223a0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
223b0 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  d(0)==&two );.  
223c0 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20  if( pMain ){.   
223d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
223e0 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b  ister(pMain, 1);
223f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
22400 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
22410 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a  _one")==&one );.
22420 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
22430 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
22440 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20  two")==&two );. 
22450 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
22460 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
22470 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a  pMain );.  }.  .
22480 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
22490 64 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65  default VFS.  Re
224a0 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65  peat until there
224b0 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53   are no more VFS
224c0 65 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72  es.  ** register
224d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
224e0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56  =0; i<sizeof(apV
224f0 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73  fs)/sizeof(apVfs
22500 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
22510 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74  apVfs[i] = sqlit
22520 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
22530 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
22540 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22550 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
22560 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56  te3_vfs_find(apV
22570 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b  fs[i]->zName) );
22580 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
22590 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70  fs_unregister(ap
225a0 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61  Vfs[i]);.      a
225b0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
225c0 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
225d0 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
225e0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
225f0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
22600 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a  s_find(0) );.  .
22610 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
22620 65 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f  e main VFS as no
22630 6e 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20  n-default (will 
22640 62 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c  be made default,
22650 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c   since.  ** it'l
22660 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e  l be the only on
22670 65 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e  e in existence).
22680 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
22690 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
226a0 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  in, 0);.  assert
226b0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
226c0 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
226d0 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73    .  /* Un-regis
226e0 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53  ter the main VFS
226f0 20 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72   again to restor
22700 65 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c  e an empty VFS l
22710 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ist */.  sqlite3
22720 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
22730 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74  pMain);.  assert
22740 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
22750 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f  _find(0) );..  /
22760 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53  * Relink all VFS
22770 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72  es in reverse or
22780 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28  der. */  .  for(
22790 69 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i=sizeof(apVfs)/
227a0 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
227b0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
227c0 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d      if( apVfs[i]
227d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
227e0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61  3_vfs_register(a
227f0 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20  pVfs[i], 1);.   
22800 20 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73     assert( apVfs
22810 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  [i]==sqlite3_vfs
22820 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20  _find(0) );.    
22830 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
22840 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
22850 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a  find(apVfs[i]->z
22860 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Name) );.    }. 
22870 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73   }..  /* Unregis
22880 74 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56  ter out sample V
22890 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  FSes. */.  sqlit
228a0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
228b0 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74  r(&one);.  sqlit
228c0 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
228d0 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55  r(&two);..  /* U
228e0 6e 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 56  nregistering a V
228f0 46 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63  FS that is not c
22900 75 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65  urrently registe
22910 72 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20  red is harmless 
22920 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
22930 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65  _unregister(&one
22940 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
22950 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f  _unregister(&two
22960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22970 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
22980 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61  _one")==0 );.  a
22990 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
229a0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
229b0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  ==0 );..  /* We 
229c0 73 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77  should be left w
229d0 69 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ith the original
229e0 20 64 65 66 61 75 6c 74 20 56 46 53 20 62 61 63   default VFS bac
229f0 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72  k as the.  ** or
22a00 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65  iginal */.  asse
22a10 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
22a20 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29  find(0)==pMain )
22a30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
22a40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
22a50 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66  cmd:   vfs_initf
22a60 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54  ail_test.**.** T
22a70 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
22a80 61 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f  attempts to vfs_
22a90 66 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67  find and vfs_reg
22aa0 69 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a  ister when the.*
22ab0 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  * sqlite3_initia
22ac0 6c 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65  lize() interface
22ad0 20 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c   is failing.  Al
22ae0 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66  l calls should f
22af0 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ail..*/.static i
22b00 6e 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f  nt vfs_initfail_
22b10 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22b20 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22b30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22b40 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22b50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22b60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22b70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
22b80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22b90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22ba0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22bb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22bc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22bd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22be0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22bf0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22c00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22c10 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e    sqlite3_vfs on
22c20 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  e;.  one.zName =
22c30 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28   "__one";..  if(
22c40 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
22c50 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43  d(0) ) return TC
22c60 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
22c70 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
22c80 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  &one, 0);.  if( 
22c90 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22ca0 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
22cb0 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
22cc0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
22cd0 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73  one, 1);.  if( s
22ce0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
22cf0 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
22d00 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
22d10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22d20 20 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a   Saved VFSes.*/.
22d30 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
22d40 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73  fs *apVfs[20];.s
22d50 74 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d  tatic int nVfs =
22d60 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   0;../*.** tclcm
22d70 64 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73  d:   vfs_unregis
22d80 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e  ter_all.**.** Un
22d90 72 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53  register all VFS
22da0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
22db0 74 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  t vfs_unregister
22dc0 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
22dd0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22de0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22df0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22e00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22e10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
22e20 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
22e30 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
22e40 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
22e50 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
22e60 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
22e70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22e80 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22e90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22ea0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22eb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22ec0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
22ed0 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
22ee0 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  apVfs); i++){.  
22ef0 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c    apVfs[i] = sql
22f00 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
22f10 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b  ;.    if( apVfs[
22f20 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i]==0 ) break;. 
22f30 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
22f40 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
22f50 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20  i]);.  }.  nVfs 
22f60 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  = i;.  return TC
22f70 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
22f80 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65  lcmd:   vfs_rere
22f90 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
22fa0 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53   Restore all VFS
22fb0 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65 6d  es that were rem
22fc0 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75  oved using vfs_u
22fd0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f  nregister_all.*/
22fe0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f  .static int vfs_
22ff0 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  reregister_all(.
23000 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23010 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23020 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23030 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23040 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23050 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23060 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
23070 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
23080 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
23090 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
230b0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
230c0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
230d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
230e0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
230f0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
23100 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
23110 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nVfs; i++){.    
23120 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
23130 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69  ster(apVfs[i], i
23140 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ==0);.  }.  retu
23150 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
23160 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
23170 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
23180 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
23190 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
231a0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
231b0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
231c0 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
231d0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
231e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
231f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23200 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
23210 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23220 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23230 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23240 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23250 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23260 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23270 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23280 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23290 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
232a0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
232b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
232c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
232d0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
232e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
232f0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
23300 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
23310 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73  nt iArg = 0;.  s
23320 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
23330 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
23340 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
23350 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23360 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23370 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23380 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
23390 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
233a0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
233b0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
233c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
233d0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
233e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
233f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23400 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
23410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23420 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23430 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c  e_control(db, 0,
23440 20 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73   0, &iArg);.  as
23450 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
23460 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72  _NOTFOUND );.  r
23470 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23480 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f  _control(db, "no
23490 74 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c  tadatabase", SQL
234a0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
234b0 41 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61  ATE, &iArg);.  a
234c0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
234d0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20  E_ERROR );.  rc 
234e0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
234f0 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e  ontrol(db, "main
23500 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
23510 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
23520 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
23530 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
23540 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
23550 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72  "temp", -1, &iAr
23560 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  g);.  assert( rc
23570 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  ==SQLITE_NOTFOUN
23580 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  D || rc==SQLITE_
23590 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75  ERROR );..  retu
235a0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
235b0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
235c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
235d0 65 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a  errno_test DB.**
235e0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
235f0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
23600 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
23610 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
23620 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
23630 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
23640 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53  f the SQLITE_LAS
23650 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f  T_ERRNO verb..*/
23660 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
23670 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
23680 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  no_test(.  Clien
23690 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
236a0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
236b0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
236c0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
236d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
236e0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
236f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
23700 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
23710 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
23720 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
23730 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
23740 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
23750 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
23760 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
23770 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
23780 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
23790 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
237a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
237b0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
237c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
237d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
237e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
237f0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
23800 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
23810 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
23820 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
23830 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23840 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
23850 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
23860 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
23870 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
23880 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
23890 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
238a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
238b0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
238c0 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  L, SQLITE_LAST_E
238d0 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20  RRNO, &iArg);.  
238e0 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
238f0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
23900 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
23910 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
23920 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23930 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41  R; .  }.  if( iA
23940 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63  rg!=0 ) {.    Tc
23950 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23960 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74  nterp, "Unexpect
23970 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e  ed non-zero errn
23980 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  o: ",.          
23990 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
239a0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
239b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41  Tcl_NewIntObj(iA
239c0 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29  rg), 0), " ", 0)
239d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
239e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
239f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
23a00 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
23a10 5f 5f 0a 2f 2a 20 46 72 6f 6d 20 73 71 6c 69 74  __./* From sqlit
23a20 65 33 5f 70 72 69 76 61 74 65 2e 68 20 2a 2f 0a  e3_private.h */.
23a30 23 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  # ifndef SQLITE_
23a40 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53  TRUNCATE_DATABAS
23a50 45 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  E.# define SQLIT
23a60 45 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42  E_TRUNCATE_DATAB
23a70 41 53 45 20 20 20 20 20 20 31 30 31 0a 23 20 64  ASE      101.# d
23a80 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
23a90 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  NCATE_JOURNALMOD
23aa0 45 5f 57 41 4c 20 20 20 20 20 20 20 20 20 20 20  E_WAL           
23ab0 28 30 78 31 3c 3c 30 29 0a 23 20 64 65 66 69 6e  (0x1<<0).# defin
23ac0 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
23ad0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
23ae0 4b 20 20 20 20 20 20 20 20 20 20 20 28 30 78 33  K           (0x3
23af0 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<2).# define SQ
23b00 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55  LITE_TRUNCATE_AU
23b10 54 4f 56 41 43 55 55 4d 5f 4f 46 46 20 20 20 20  TOVACUUM_OFF    
23b20 20 20 20 20 20 20 20 20 28 30 78 31 3c 3c 32 29          (0x1<<2)
23b30 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
23b40 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41  _TRUNCATE_AUTOVA
23b50 43 55 55 4d 5f 46 55 4c 4c 20 20 20 20 20 20 20  CUUM_FULL       
23b60 20 20 20 20 28 30 78 32 3c 3c 32 29 0a 23 20 64      (0x2<<2).# d
23b70 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
23b80 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d  NCATE_AUTOVACUUM
23b90 5f 49 4e 43 52 45 4d 45 4e 54 41 4c 20 20 20 20  _INCREMENTAL    
23ba0 28 30 78 33 3c 3c 32 29 0a 23 20 64 65 66 69 6e  (0x3<<2).# defin
23bb0 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
23bc0 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 20  E_PAGESIZE_MASK 
23bd0 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78 37              (0x7
23be0 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51  <<4).# define SQ
23bf0 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41  LITE_TRUNCATE_PA
23c00 47 45 53 49 5a 45 5f 31 30 32 34 20 20 20 20 20  GESIZE_1024     
23c10 20 20 20 20 20 20 20 20 28 30 78 31 3c 3c 34 29          (0x1<<4)
23c20 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
23c30 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
23c40 5a 45 5f 32 30 34 38 20 20 20 20 20 20 20 20 20  ZE_2048         
23c50 20 20 20 20 28 30 78 32 3c 3c 34 29 0a 23 20 64      (0x2<<4).# d
23c60 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
23c70 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 34  NCATE_PAGESIZE_4
23c80 30 39 36 20 20 20 20 20 20 20 20 20 20 20 20 20  096             
23c90 28 30 78 33 3c 3c 34 29 0a 23 20 64 65 66 69 6e  (0x3<<4).# defin
23ca0 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  e SQLITE_TRUNCAT
23cb0 45 5f 50 41 47 45 53 49 5a 45 5f 38 31 39 32 20  E_PAGESIZE_8192 
23cc0 20 20 20 20 20 20 20 20 20 20 20 20 28 30 78 34              (0x4
23cd0 3c 3c 34 29 0a 23 20 65 6e 64 69 66 0a 23 20 69  <<4).# endif.# i
23ce0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 45 50  fndef SQLITE_REP
23cf0 4c 41 43 45 5f 44 41 54 41 42 41 53 45 0a 23 20  LACE_DATABASE.# 
23d00 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45  define SQLITE_RE
23d10 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 20 20  PLACE_DATABASE  
23d20 20 20 20 20 20 31 30 32 0a 23 20 65 6e 64 69 66       102.# endif
23d30 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
23d40 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
23d50 72 75 6e 63 61 74 65 5f 74 65 73 74 20 44 42 0a  runcate_test DB.
23d60 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
23d70 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
23d80 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
23d90 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
23da0 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
23db0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
23dc0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54   of the SQLITE_T
23dd0 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
23de0 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63   verb..*/.static
23df0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
23e00 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74 28  l_truncate_test(
23e10 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
23e20 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
23e30 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
23e40 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
23e50 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
23e60 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
23e70 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
23e80 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
23e90 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
23ea0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23ec0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
23ed0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
23ee0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
23ef0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
23f00 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
23f10 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
23f20 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b  flags;.  int rc;
23f30 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
23f40 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
23f50 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23f60 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
23f70 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
23fa0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
23fb0 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
23fc0 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  S", 0);.    retu
23fd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23fe0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23ff0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24000 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24010 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
24020 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24030 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
24040 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
24050 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
24060 26 66 6c 61 67 73 29 20 29 7b 0a 20 20 20 20 72  &flags) ){.    r
24070 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24080 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
24090 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
240a0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
240b0 45 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42  E_TRUNCATE_DATAB
240c0 41 53 45 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20  ASE, &flags);.  
240d0 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54  if( rc ){ .    T
240e0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
240f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
24100 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
24110 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24120 52 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  R; .  }.  return
24130 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
24140 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
24150 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61  le_control_repla
24160 63 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  ce_test DB.**.**
24170 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24180 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
24190 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
241a0 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
241b0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
241c0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
241d0 68 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43  he SQLITE_REPLAC
241e0 45 5f 44 41 54 41 42 41 53 45 20 76 65 72 62 2e  E_DATABASE verb.
241f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
24200 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c  ile_control_repl
24210 61 63 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ace_test(.  Clie
24220 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
24230 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
24240 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
24250 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
24260 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
24270 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
24280 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
24290 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
242a0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
242b0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
242c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
242d0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
242e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
242f0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
24300 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
24310 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73  .){.  sqlite3 *s
24320 72 63 5f 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  rc_db;.  sqlite3
24330 20 2a 64 73 74 5f 64 62 3b 0a 20 20 69 6e 74 20   *dst_db;.  int 
24340 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  rc;.  .  if( obj
24350 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
24360 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
24370 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
24380 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
24390 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
243a0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
243b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
243c0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 53 54 5f  v[0], 0), " DST_
243d0 44 42 20 53 52 43 5f 44 42 22 2c 20 30 29 3b 0a  DB SRC_DB", 0);.
243e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
243f0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
24400 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
24410 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
24420 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 73  ng(objv[1]), &ds
24430 74 5f 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  t_db) ){.    ret
24440 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24450 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
24460 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
24470 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
24480 5b 32 5d 29 2c 20 26 73 72 63 5f 64 62 29 20 29  [2]), &src_db) )
24490 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
244a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
244b0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
244c0 63 6f 6e 74 72 6f 6c 28 64 73 74 5f 64 62 2c 20  control(dst_db, 
244d0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 52 45 50  NULL, SQLITE_REP
244e0 4c 41 43 45 5f 44 41 54 41 42 41 53 45 2c 20 73  LACE_DATABASE, s
244f0 72 63 5f 64 62 29 3b 0a 20 20 69 66 28 20 72 63  rc_db);.  if( rc
24500 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74   ){ .    Tcl_Set
24510 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24520 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24530 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72  rc)); .    retur
24540 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20  n TCL_ERROR; .  
24550 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
24560 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  K;  .}.#endif /*
24570 20 5f 5f 41 50 50 4c 45 5f 5f 20 2a 2f 0a 0a 2f   __APPLE__ */../
24580 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
24590 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
245a0 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42  ksize_test DB DB
245b0 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20  NAME SIZE.**.** 
245c0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
245d0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
245e0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
245f0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
24600 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
24610 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
24620 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
24630 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
24640 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
24650 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
24660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24670 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
24680 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43  nksize_test(.  C
24690 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
246a0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
246b0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
246c0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
246d0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
246e0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
246f0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24700 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24710 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24720 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24730 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24740 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24750 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
24760 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
24770 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24780 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69   */.){.  int nSi
24790 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
247a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
247b0 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  chunk size */.  
247c0 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
247d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247e0 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69  /* Db name ("mai
247f0 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29  n", "temp" etc.)
24800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
24810 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
24820 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
24830 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  e handle */.  in
24840 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24860 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20   file_control() 
24870 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  return code */..
24880 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
24890 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
248a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
248b0 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
248c0 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65  E SIZE");.    re
248d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
248e0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
248f0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
24900 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24910 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20  v[1]), &db) .   
24920 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  || Tcl_GetIntFro
24930 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24940 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20  v[3], &nSize).  
24950 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
24960 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
24970 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
24980 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
24990 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29  ( zDb[0]=='\0' )
249a0 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20   zDb = NULL;..  
249b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
249c0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
249d0 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
249e0 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69  CHUNK_SIZE, (voi
249f0 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69  d *)&nSize);.  i
24a00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
24a10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
24a20 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
24a30 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
24a40 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
24a50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24a60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
24a70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24a80 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24a90 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f  ontrol_sizehint_
24aa0 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53  test DB DBNAME S
24ab0 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  IZE.**.** This T
24ac0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
24ad0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
24ae0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
24af0 63 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49  ce .** with SQLI
24b00 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
24b10 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  NT.*/.static int
24b20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
24b30 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43  zehint_test(.  C
24b40 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
24b50 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
24b60 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
24b70 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
24b80 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
24b90 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24ba0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24bb0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24bc0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24bd0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24be0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24bf0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24c00 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
24c10 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
24c20 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24c30 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64   */.){.  Tcl_Wid
24c40 65 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20  eInt nSize;     
24c50 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74           /* Hint
24c60 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61  ed size */.  cha
24c70 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
24c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24c90 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c  Db name ("main",
24ca0 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f   "temp" etc.) */
24cb0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
24cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cd0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
24ce0 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  andle */.  int r
24cf0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
24d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
24d10 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74  le_control() ret
24d20 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
24d30 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
24d40 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24d50 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24d60 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53  jv, "DB DBNAME S
24d70 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
24d80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24d90 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
24da0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
24db0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
24dc0 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20  ]), &db) .   || 
24dd0 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
24de0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
24df0 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20  jv[3], &nSize). 
24e00 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43   ){.   return TC
24e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
24e20 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
24e30 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
24e40 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20  f( zDb[0]=='\0' 
24e50 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ) zDb = NULL;.. 
24e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
24e70 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24e80 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
24e90 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69  _SIZE_HINT, (voi
24ea0 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69  d *)&nSize);.  i
24eb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
24ec0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
24ed0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
24ee0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
24ef0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
24f00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24f10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
24f20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24f30 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24f40 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
24f50 5f 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a  _test DB PWD.**.
24f60 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
24f70 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
24f80 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
24f90 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
24fa0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
24fb0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
24fc0 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
24fd0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
24fe0 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
24ff0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
25000 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
25010 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
25020 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a  lockproxy_test(.
25030 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25040 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25050 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25060 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25070 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25080 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25090 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
250a0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
250b0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
250c0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
250d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
250e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
250f0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
25100 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
25110 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25120 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
25130 74 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66  te3 *db;.  .  if
25140 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
25150 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
25160 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
25170 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
25180 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
251a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
251b0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
251c0 20 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20   DB PWD", 0);.  
251d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
251e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
251f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
25200 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
25210 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25220 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
25230 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23  _ERROR;.  }.  .#
25240 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
25250 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
25260 47 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64  G_STYLE).#  if d
25270 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
25280 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  ).#    define SQ
25290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
252a0 49 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65  ING_STYLE 1.#  e
252b0 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
252c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
252d0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20  CKING_STYLE 0.# 
252e0 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69   endif.#endif.#i
252f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25300 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
25310 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
25320 5f 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72  __).  {.    char
25330 20 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20   *testPath;.    
25340 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
25350 6e 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nPwd;.    const 
25360 63 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20  char *zPwd;.    
25370 63 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34  char proxyPath[4
25380 30 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50  00];.    .    zP
25390 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  wd = Tcl_GetStri
253a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ngFromObj(objv[2
253b0 5d 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69  ], &nPwd);.    i
253c0 66 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50  f( sizeof(proxyP
253d0 61 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a  ath)<nPwd+20 ){.
253e0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
253f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
25400 50 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76  PWD too big", (v
25410 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72  oid*)0);.      r
25420 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25430 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
25440 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
25450 6f 66 28 70 72 6f 78 79 50 61 74 68 29 2c 20 70  of(proxyPath), p
25460 72 6f 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65  roxyPath, "%s/te
25470 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29  st.proxy", zPwd)
25480 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
25490 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
254a0 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
254b0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
254c0 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  LE, proxyPath);.
254d0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
254e0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
254f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
25500 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
25510 20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54   .      return T
25520 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
25530 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25540 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
25550 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47  , NULL, SQLITE_G
25560 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
25570 2c 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20  , &testPath);.  
25580 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72    if( strncmp(pr
25590 6f 78 79 50 61 74 68 2c 74 65 73 74 50 61 74 68  oxyPath,testPath
255a0 2c 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ,11) ){.      Tc
255b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
255c0 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f  nterp, "Lock pro
255d0 78 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20  xy file did not 
255e0 6d 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20  match the ".    
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25600 20 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76             "prev
25610 69 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20  iously assigned 
25620 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20  value", 0);.    
25630 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25640 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
25650 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
25660 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
25670 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
25680 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
25690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
256a0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
256b0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
256c0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
256d0 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
256e0 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79  PROXYFILE, proxy
256f0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72  Path);.    if( r
25700 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  c ){.      Tcl_S
25710 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
25720 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
25730 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65  j(rc));.      re
25740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25750 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
25760 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
25770 3b 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;  .}..#ifdef __
25780 41 50 50 4c 45 5f 5f 0a 23 69 6e 63 6c 75 64 65  APPLE__.#include
25790 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23   <sys/param.h>.#
257a0 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75  include <sys/mou
257b0 6e 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  nt.h>.#include <
257c0 73 79 73 2f 65 72 72 6e 6f 2e 68 3e 0a 23 65 6e  sys/errno.h>.#en
257d0 64 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c 63  dif../*. ** tclc
257e0 6d 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 6c 6f  md:   path_is_lo
257f0 63 61 6c 20 50 57 44 0a 20 2a 2f 0a 73 74 61 74  cal PWD. */.stat
25800 69 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f 6c  ic int path_is_l
25810 6f 63 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  ocal(.  ClientDa
25820 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25830 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25840 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25850 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
25860 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
25870 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
25880 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
25890 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
258a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
258b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
258c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
258d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
258e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
258f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
25900 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
25910 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
25920 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25930 50 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74  Path;.  int nPat
25940 68 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  h;.  struct stat
25950 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20  fs fsInfo;.  .  
25960 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
25970 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25980 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
25990 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
259a0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
259b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
259c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
259d0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
259e0 20 22 20 50 41 54 48 22 2c 20 30 29 3b 0a 20 20   " PATH", 0);.  
259f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25a00 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20  OR;.  }.  zPath 
25a10 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
25a20 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
25a30 26 6e 50 61 74 68 29 3b 0a 20 20 69 66 28 20 73  &nPath);.  if( s
25a40 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
25a50 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
25a60 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
25a70 6e 6f 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  no;.    Tcl_Appe
25a80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25a90 20 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20   "Error calling 
25aa0 73 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c  statfs on path",
25ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25ac0 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74        Tcl_NewInt
25ad0 4f 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a 20 20  Obj(err), 0);.  
25ae0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25af0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 73  OR;.  }.  if( fs
25b00 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54  Info.f_flags&MNT
25b10 5f 4c 4f 43 41 4c 20 29 7b 0a 20 20 20 20 54 63  _LOCAL ){.    Tc
25b20 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
25b30 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
25b40 74 4f 62 6a 28 31 29 29 3b 20 0a 20 20 7d 20 65  tObj(1)); .  } e
25b50 6c 73 65 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  lse {.    Tcl_Se
25b60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
25b70 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
25b80 28 30 29 29 3b 20 0a 20 20 7d 0a 23 65 6c 73 65  (0)); .  }.#else
25b90 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
25ba0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
25bb0 4e 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a  NewIntObj(1)); .
25bc0 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
25bd0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
25be0 2f 2a 0a 20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  /*. ** tclcmd:  
25bf0 20 70 61 74 68 5f 69 73 5f 64 6f 73 20 50 57 44   path_is_dos PWD
25c00 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
25c10 70 61 74 68 5f 69 73 5f 64 6f 73 28 0a 20 20 43  path_is_dos(.  C
25c20 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
25c30 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
25c40 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
25c50 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
25c60 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
25c70 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
25c80 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
25c90 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
25ca0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
25cb0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
25cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25cd0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
25ce0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
25cf0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
25d00 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
25d10 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f 5f   */.){.#ifdef __
25d20 41 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73 74 20  APPLE__.  const 
25d30 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 69  char *zPath;.  i
25d40 6e 74 20 6e 50 61 74 68 3b 0a 20 20 73 74 72 75  nt nPath;.  stru
25d50 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
25d60 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
25d70 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
25d80 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
25d90 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
25da0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
25db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25dc0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
25dd0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
25de0 30 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22 2c  0], 0), " PATH",
25df0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
25e00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25e10 20 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65 74   zPath = Tcl_Get
25e20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
25e30 6a 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b 0a  jv[1], &nPath);.
25e40 20 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61    if( statfs(zPa
25e50 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  th, &fsInfo) == 
25e60 2d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72  -1 ){.    int er
25e70 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 54  r = errno;.    T
25e80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
25e90 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20 63  interp, "Error c
25ea0 61 6c 6c 69 6e 67 20 73 74 61 74 66 73 20 6f 6e  alling statfs on
25eb0 20 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20   path",.        
25ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
25ed0 5f 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72 29 2c  _NewIntObj(err),
25ee0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
25ef0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
25f00 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
25f10 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
25f20 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
25f30 35 29 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65  5)) {.    Tcl_Se
25f40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
25f50 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
25f60 28 31 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20  (1)); .  } else 
25f70 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
25f80 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f  ("exfat", fsInfo
25f90 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
25fa0 29 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  )) {.    Tcl_Set
25fb0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25fc0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
25fd0 31 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b  1)); .  } else {
25fe0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
25ff0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
26000 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b  l_NewIntObj(0));
26010 20 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 54 63   .  }.#else.  Tc
26020 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
26030 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
26040 74 4f 62 6a 28 30 29 29 3b 20 0a 23 65 6e 64 69  tObj(0)); .#endi
26050 66 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43  f.  .  return TC
26060 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53  L_OK;  .}..#if S
26070 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a  QLITE_OS_WIN./*.
26080 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
26090 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
260a0 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45  av_retry DB  NRE
260b0 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a  TRY  DELAY.**.**
260c0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
260d0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
260e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
260f0 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
26100 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
26110 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
26120 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  Y opcode..*/.sta
26130 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
26140 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
26150 74 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  try(.  ClientDat
26160 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26170 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26180 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26190 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
261a0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
261b0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
261c0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
261d0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
261e0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
261f0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26200 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26210 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26220 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26230 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26240 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26250 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26260 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b  int rc;.  int a[
26270 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  2];.  char z[100
26280 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
26290 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
262a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
262b0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
262c0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
262d0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
262e0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
262f0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e  v[0], 0), " DB N
26300 52 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29  RETRY DELAY", 0)
26310 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
26320 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
26330 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
26340 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
26350 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
26360 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
26370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26380 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
26390 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
263a0 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29   objv[2], &a[0])
263b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
263c0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
263d0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
263e0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61  erp, objv[3], &a
263f0 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [1]) ) return TC
26400 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
26410 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
26420 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
26430 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
26440 32 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69  2_AV_RETRY, (voi
26450 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  d*)a);.  sqlite3
26460 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
26470 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25  (z), z, "%d %d %
26480 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b  d", rc, a[0], a[
26490 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
264a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
264b0 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
264c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
264d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
264e0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
264f0 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
26500 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a  e DB HANDLE.**.*
26510 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
26520 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
26530 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26540 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
26550 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
26560 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41  NTL_WIN32_SET_HA
26570 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  NDLE opcode..*/.
26580 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
26590 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65  control_win32_se
265a0 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65  t_handle(.  Clie
265b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
265c0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
265d0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
265e0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
265f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
26600 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
26610 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
26620 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
26630 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
26640 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
26650 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
26660 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
26670 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
26680 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
26690 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
266a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
266b0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48  b;.  int rc;.  H
266c0 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55  ANDLE hFile = NU
266d0 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  LL;.  char z[100
266e0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
266f0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
26700 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
26710 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
26720 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
26730 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
26740 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
26750 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48  v[0], 0), " DB H
26760 41 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20  ANDLE", 0);.    
26770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26780 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26790 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
267a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
267b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
267c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
267d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
267e0 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28   getWin32Handle(
267f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
26800 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20  tring(objv[2]), 
26810 26 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72  &hFile) ){.    r
26820 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26830 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
26840 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26850 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
26860 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45  E_FCNTL_WIN32_SE
26870 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20  T_HANDLE,.      
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46        (void*)&hF
268a0 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
268b0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
268c0 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20  z), z, "%d %p", 
268d0 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65  rc, (void*)hFile
268e0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
268f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
26900 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
26910 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
26920 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74  .#endif../*.** t
26930 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
26940 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
26950 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41  l DB PERSIST-FLA
26960 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  G.**.** This TCL
26970 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
26980 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
26990 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
269a0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
269b0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
269c0 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f  T_WAL opcode..*/
269d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
269e0 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
269f0 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _wal(.  ClientDa
26a00 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26a10 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26a20 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26a30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26a40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26a50 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26a60 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26a70 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26a80 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26a90 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26aa0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26ab0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26ac0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26ad0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26ae0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26af0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
26b00 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
26b10 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20  Persist;.  char 
26b20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
26b30 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
26b40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
26b50 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
26b60 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
26b70 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
26b80 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
26b90 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
26ba0 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20   DB FLAG", 0);. 
26bb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26bc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
26bd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26be0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26bf0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26c00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26c10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26c20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
26c30 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
26c40 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74  jv[2], &bPersist
26c50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
26c60 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
26c70 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
26c80 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
26c90 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
26ca0 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50  _WAL, (void*)&bP
26cb0 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  ersist);.  sqlit
26cc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
26cd0 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
26ce0 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29  ", rc, bPersist)
26cf0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
26d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
26d10 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
26d20 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
26d30 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
26d40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
26d50 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
26d60 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a   DB PSOW-FLAG.**
26d70 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
26d80 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
26d90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
26da0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
26db0 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
26dc0 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
26dd0 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65  OVERWRITE opcode
26de0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26df0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
26e00 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
26e10 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26e20 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26e30 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26e40 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26e50 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
26e60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26e70 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26e80 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26e90 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26ea0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ec0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26ed0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26ee0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26ef0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26f00 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26f10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
26f20 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20   rc;.  int b;.  
26f30 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
26f40 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
26f50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
26f60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
26f70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
26f80 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
26f90 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
26fa0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
26fb0 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20  0), " DB FLAG", 
26fc0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
26fd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26fe0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
26ff0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
27000 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
27010 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
27020 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27030 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
27040 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
27050 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20  p, objv[2], &b) 
27060 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
27070 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
27080 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
27090 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46  db,NULL,SQLITE_F
270a0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
270b0 56 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29  VERWRITE,(void*)
270c0 26 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  &b);.  sqlite3_s
270d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
270e0 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72  ), z, "%d %d", r
270f0 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  c, b);.  Tcl_App
27100 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27110 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
27120 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27130 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
27140 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
27150 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f  rol_vfsname DB ?
27160 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74  AUXDB?.**.** Ret
27170 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
27180 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
27190 73 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a  stack of VFSes..
271a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
271b0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
271c0 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  me(.  ClientData
271d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
271e0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
271f0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
27200 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
27210 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
27220 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
27230 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
27240 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
27250 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
27260 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
27270 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27280 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27290 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
272a0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
272b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
272c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
272d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
272e0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63  me = "main";.  c
272f0 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20  har *zVfsName = 
27300 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
27310 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
27320 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27330 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
27340 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
27350 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
27360 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27370 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
27380 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
27390 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
273a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
273b0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
273c0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
273d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
273e0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
273f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27400 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
27410 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
27420 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
27430 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
27440 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
27450 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
27460 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
27470 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64  TL_VFSNAME,(void
27480 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20  *)&zVfsName);.  
27490 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
274a0 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d  (interp, zVfsNam
274b0 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
274c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66  sqlite3_free(zVf
274d0 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  sName);.  return
274e0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
274f0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
27500 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
27510 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58 44  ilename DB ?AUXD
27520 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  B?.**.** Return 
27530 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  a string that is
27540 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
27550 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20  ename.*/.static 
27560 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
27570 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20  _tempfilename(. 
27580 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
27590 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
275a0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
275b0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
275c0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
275d0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
275e0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
275f0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
27600 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27610 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27630 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27640 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
27650 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
27660 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
27670 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
27680 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
27690 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
276a0 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a  "main";.  char *
276b0 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  zTName = 0;..  i
276c0 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
276d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
276e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
276f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
27700 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
27710 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
27720 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
27730 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
27740 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
27750 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27760 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27770 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27780 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27790 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
277a0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
277b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
277c0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
277d0 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
277e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
277f0 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
27800 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27810 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
27820 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
27830 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a  FILENAME, (void*
27840 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c  )&zTName);.  Tcl
27850 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
27860 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63  terp, zTName, (c
27870 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74  har*)0);.  sqlit
27880 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b  e3_free(zTName);
27890 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
278a0 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  ;  .}.../*.** tc
278b0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
278c0 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20  vfs_list.**.**  
278d0 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69   Return a tcl li
278e0 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
278f0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
27900 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e  egistered vfs's.
27910 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
27920 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e  fs_list(.  Clien
27930 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
27940 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
27950 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
27960 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
27970 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
27980 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
27990 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
279a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
279b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
279c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
279d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
279e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
279f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27a00 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27a10 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27a20 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
27a30 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62   *pVfs;.  Tcl_Ob
27a40 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65  j *pRet = Tcl_Ne
27a50 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62  wObj();.  if( ob
27a60 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
27a70 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
27a80 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
27a90 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
27aa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27ab0 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33  for(pVfs=sqlite3
27ac0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56  _vfs_find(0); pV
27ad0 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70  fs; pVfs=pVfs->p
27ae0 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c  Next){.    Tcl_L
27af0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
27b00 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
27b10 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
27b20 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20  bj(pVfs->zName, 
27b30 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  -1));.  }.  Tcl_
27b40 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
27b50 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65  erp, pRet);.  re
27b60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
27b70 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27b80 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20    sqlite3_limit 
27b90 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a  DB ID VALUE.**.*
27ba0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
27bb0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
27bc0 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66  te3_limit interf
27bd0 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
27be0 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
27bf0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d  ation of the sam
27c00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
27c10 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43   test_limit(.  C
27c20 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27c30 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
27c40 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
27c50 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
27c60 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27c70 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27c80 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27c90 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27ca0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27cb0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27cd0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27ce0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27cf0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27d00 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27d10 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27d20 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
27d30 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
27d40 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
27d50 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69  r *zName;.     i
27d60 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d  nt id;.  } aId[]
27d70 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
27d80 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22  TE_LIMIT_LENGTH"
27d90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
27da0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
27db0 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
27dc0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
27dd0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
27de0 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  TH",          SQ
27df0 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
27e00 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
27e10 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
27e20 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20  _LIMIT_COLUMN", 
27e30 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
27e40 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
27e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
27e60 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
27e70 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
27e80 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
27e90 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
27ea0 50 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c  PTH           },
27eb0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
27ec0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
27ed0 4c 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54  LECT",     SQLIT
27ee0 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
27ef0 5f 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a  _SELECT      },.
27f00 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
27f10 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20  MIT_VDBE_OP",   
27f20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
27f30 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
27f50 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
27f60 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22  IT_FUNCTION_ARG"
27f70 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
27f80 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
27f90 52 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  RG         },.  
27fa0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
27fb0 54 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20  T_ATTACHED",    
27fc0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
27fd0 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20  IMIT_ATTACHED   
27fe0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
27ff0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
28000 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
28010 4e 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49  NGTH", SQLITE_LI
28020 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
28030 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20  _LENGTH  },.    
28040 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
28050 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22  VARIABLE_NUMBER"
28060 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d  ,     SQLITE_LIM
28070 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
28080 45 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ER      },.    {
28090 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
280a0 52 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20  RIGGER_DEPTH",  
280b0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
280c0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  T_TRIGGER_DEPTH 
280d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
280e0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f  "SQLITE_LIMIT_WO
280f0 52 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20  RKER_THREADS",  
28100 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
28110 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20  _WORKER_THREADS 
28120 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20        },.    .  
28130 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67    /* Out of rang
28140 65 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a  e test cases */.
28150 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
28160 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20  MIT_TOOSMALL",  
28170 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20            -1,   
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
281a0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
281b0 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20  IT_TOOBIG",     
281c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
281d0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
281e0 45 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20  EADS+1     },.  
281f0 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20 3d  };.  int i, id =
28200 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20   0;.  int val;. 
28210 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
28220 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
28230 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
28240 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
28250 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
28260 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
28270 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
28280 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
28290 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44  [0], 0), " DB ID
282a0 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
282b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
282c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
282d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
282e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
282f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
28300 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28310 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47  R;.  zId = Tcl_G
28320 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
28330 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
28340 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
28350 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29  of(aId[0]); i++)
28360 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
28370 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61  (zId, aId[i].zNa
28380 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
28390 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a  id = aId[i].id;.
283a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
283b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d   }.  }.  if( i>=
283c0 73 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65  sizeof(aId)/size
283d0 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20  of(aId[0]) ){.  
283e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
283f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
28400 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20  own limit type: 
28410 22 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30  ", zId, (char*)0
28420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28430 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28440 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
28450 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
28460 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
28470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28480 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c    rc = sqlite3_l
28490 69 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c  imit(db, id, val
284a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
284b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
284c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
284d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
284e0 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;  .}../*.** tc
284f0 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67  lcmd:  save_prng
28500 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76  _state.**.** Sav
28510 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
28520 68 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d  he pseudo-random
28530 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
28540 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d  r..** At the sam
28550 65 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74  e time, verify t
28560 68 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74  hat sqlite3_test
28570 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65  _control works e
28580 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c  ven when.** call
28590 65 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f  ed with an out-o
285a0 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a  f-range opcode..
285b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
285c0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  ve_prng_state(. 
285d0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
285e0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
285f0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
28600 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
28610 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
28620 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
28630 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
28640 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
28650 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
28660 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
28670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
28680 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
28690 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
286a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
286b0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
286c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ts */.){.  int r
286d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
286e0 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a  _control(9999);.
286f0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20    assert( rc==0 
28700 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
28710 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d  3_test_control(-
28720 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  1);.  assert( rc
28730 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
28740 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
28750 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
28760 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75  NG_SAVE);.  retu
28770 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
28780 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74  ** tclcmd:  rest
28790 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  ore_prng_state.*
287a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
287b0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28  tore_prng_state(
287c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
287d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
287e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
287f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
28800 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
28810 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
28820 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
28830 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
28840 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
28850 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28870 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
28880 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
28890 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
288a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
288b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
288c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
288d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
288e0 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b  L_PRNG_RESTORE);
288f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28900 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
28910 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  :  reset_prng_st
28920 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ate.*/.static in
28930 74 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61  t reset_prng_sta
28940 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
28950 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
28960 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
28970 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
28980 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
28990 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
289a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
289b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
289c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
289d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
289e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
289f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
28a00 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
28a10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
28a20 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
28a30 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
28a40 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
28a50 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
28a60 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29  CTRL_PRNG_RESET)
28a70 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
28a80 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
28a90 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61  md:  database_ma
28aa0 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a  y_be_corrupt.**.
28ab0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
28ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
28ad0 6d 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74  might be corrupt
28ae0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
28af0 73 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61  s, set the norma
28b00 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70  l.** state of op
28b10 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
28b20 69 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f  ic int database_
28b30 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a  may_be_corrupt(.
28b40 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28b50 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
28b60 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
28b70 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
28b80 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
28b90 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
28ba0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
28bb0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
28bc0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28bd0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28bf0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28c00 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
28c10 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
28c20 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
28c30 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
28c40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
28c50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
28c60 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
28c70 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
28c80 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
28c90 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e  cmd:  database_n
28ca0 65 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a  ever_corrupt.**.
28cb0 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
28cc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
28cd0 61 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d  are always well-
28ce0 66 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e  formed.  This en
28cf0 61 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65  ables extra asse
28d00 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  rt().** statemen
28d10 74 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e  ts that test con
28d20 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65  ditions that are
28d30 20 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72   always true for
28d40 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
28d50 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  abases..*/.stati
28d60 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e  c int database_n
28d70 65 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20  ever_corrupt(.  
28d80 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28d90 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28da0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
28db0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
28dc0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
28dd0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
28de0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
28df0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
28e00 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
28e10 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28e20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28e30 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28e40 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28e50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28e60 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28e70 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28e80 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
28e90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
28ea0 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29  EVER_CORRUPT, 1)
28eb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
28ec0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
28ed0 6d 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74  md:  pcache_stat
28ee0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
28ef0 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74  test_pcache_stat
28f00 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
28f10 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
28f20 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
28f30 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
28f40 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
28f50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
28f60 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
28f70 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
28f80 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
28f90 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
28fa0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28fb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
28fc0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
28fd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
28fe0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
28ff0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
29000 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e  nt nMin;.  int n
29010 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72  Max;.  int nCurr
29020 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79  ent;.  int nRecy
29030 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62  clable;.  Tcl_Ob
29040 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69  j *pRet;..  sqli
29050 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26  te3PcacheStats(&
29060 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c  nCurrent, &nMax,
29070 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c   &nMin, &nRecycl
29080 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d  able);..  pRet =
29090 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
290a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
290b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
290c0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
290d0 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e  tringObj("curren
290e0 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  t", -1));.  Tcl_
290f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
29100 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
29110 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
29120 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54  (nCurrent));.  T
29130 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
29140 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
29150 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
29160 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31  ingObj("max", -1
29170 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
29180 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
29190 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
291a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29  _NewIntObj(nMax)
291b0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
291c0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
291d0 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
291e0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69  NewStringObj("mi
291f0 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  n", -1));.  Tcl_
29200 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
29210 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
29220 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
29230 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMin));.  Tcl_L
29240 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
29250 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
29260 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
29270 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c  bj("recyclable",
29280 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
29290 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
292a0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
292b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52  Tcl_NewIntObj(nR
292c0 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20  ecyclable));..  
292d0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
292e0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
292f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29300 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
29310 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
29320 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76  _NOTIFY.static v
29330 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  oid test_unlock_
29340 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a  notify_cb(void *
29350 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29  *aArg, int nArg)
29360 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f  {.  int ii;.  fo
29370 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b  r(ii=0; ii<nArg;
29380 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f   ii++){.    Tcl_
29390 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65  EvalEx((Tcl_Inte
293a0 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22  rp *)aArg[ii], "
293b0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
293c0 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  -1, TCL_EVAL_GLO
293d0 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  BAL);.  }.}.#end
293e0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
293f0 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46  BLE_UNLOCK_NOTIF
29400 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  Y */../*.** tclc
29410 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c  md:  sqlite3_unl
29420 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f  ock_notify db.*/
29430 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
29440 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54  NABLE_UNLOCK_NOT
29450 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74  IFY.static int t
29460 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
29470 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  y(.  ClientData 
29480 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
29490 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
294a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
294b0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
294c0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
294d0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
294e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
294f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29500 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
29510 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
29520 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
29530 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
29540 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
29550 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
29560 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
29570 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
29580 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
29590 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
295a0 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
295b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
295c0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
295d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
295e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
295f0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
29600 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29610 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
29620 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
29630 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63  y(db, test_unloc
29640 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f  k_notify_cb, (vo
29650 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20  id *)interp);.  
29660 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
29670 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
29680 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
29690 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
296a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
296b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  endif../*.** tcl
296c0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61  cmd:  sqlite3_wa
296d0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
296e0 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?NAME?.*/.static
296f0 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68   int test_wal_ch
29700 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65  eckpoint(.  Clie
29710 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29720 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
29730 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29740 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29750 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29760 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29770 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29780 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29790 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
297a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
297b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
297c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
297d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
297e0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  .){.  char *zDb 
297f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
29800 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
29810 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20   if( objc!=3 && 
29820 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
29830 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
29840 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
29850 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20   "DB ?NAME?");. 
29860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29870 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
29880 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
29890 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
298a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
298b0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
298c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
298d0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
298e0 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65      zDb = Tcl_Ge
298f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
29900 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
29910 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
29920 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  int(db, zDb);.  
29930 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
29940 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
29950 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
29960 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
29970 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
29980 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
29990 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
299a0 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45  point_v2 db MODE
299b0 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68   ?NAME?.**.** Th
299c0 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73  is command calls
299d0 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f   the wal_checkpo
299e0 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f  int_v2() functio
299f0 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69  n with the speci
29a00 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67  fied.** mode arg
29a10 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20  ument (passive, 
29a20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29  full or restart)
29a30 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68  . If present, th
29a40 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a  e database name.
29a50 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65  ** NAME is passe
29a60 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
29a70 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f  argument to wal_
29a80 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e  checkpoint_v2().
29a90 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41   If it the.** NA
29aa0 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ME argument is n
29ab0 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55  ot present, a NU
29ac0 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61  LL pointer is pa
29ad0 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  ssed instead..**
29ae0 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b  .** If wal_check
29af0 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72  point_v2() retur
29b00 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68  ns any value oth
29b10 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42  er than SQLITE_B
29b20 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45  USY or.** SQLITE
29b30 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63  _OK, then this c
29b40 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54  ommand returns T
29b50 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63  CL_ERROR. The Tc
29b60 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a  l result is set.
29b70 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20  ** to the error 
29b80 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64  message obtained
29b90 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72   from sqlite3_er
29ba0 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  rmsg()..**.** Ot
29bb0 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f  herwise, this co
29bc0 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  mmand returns a 
29bd0 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e  list of three in
29be0 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73  tegers. The firs
29bf0 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20  t integer.** is 
29c00 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59  1 if SQLITE_BUSY
29c10 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f   was returned, o
29c20 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54  r 0 otherwise. T
29c30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
29c40 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65   integers.** are
29c50 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75   the values retu
29c60 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74  rned via the out
29c70 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62  put parameters b
29c80 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  y wal_checkpoint
29c90 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e  _v2() -.** the n
29ca0 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20  umber of frames 
29cb0 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74  in the log and t
29cc0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61  he number of fra
29cd0 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a  mes in the log.*
29ce0 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  * that have been
29cf0 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a   checkpointed..*
29d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
29d10 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
29d20 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  _v2(.  ClientDat
29d30 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
29d40 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
29d50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29d60 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
29d70 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
29d80 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
29d90 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
29da0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
29db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29dc0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
29dd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
29de0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
29df0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29e00 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
29e10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
29e20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20   int rc;..  int 
29e30 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f  eMode;.  int nLo
29e40 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20  g = -555;.  int 
29e50 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20  nCkpt = -555;.  
29e60 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
29e70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61    const char * a
29e80 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73  Mode[] = { "pass
29e90 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72  ive", "full", "r
29ea0 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61  estart", "trunca
29eb0 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65  te", 0 };.  asse
29ec0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
29ed0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
29ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
29ef0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
29f00 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
29f10 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
29f20 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
29f30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
29f40 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
29f50 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
29f60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
29f70 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
29f80 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
29f90 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29fa0 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d  v, "DB MODE ?NAM
29fb0 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
29fc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29fd0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
29fe0 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f  {.    zDb = Tcl_
29ff0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
2a000 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  ]);.  }.  if( ge
2a010 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2a020 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2a030 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2a040 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f  || (.      TCL_O
2a050 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
2a060 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c  mObj(0, objv[2],
2a070 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54   &eMode).   && T
2a080 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
2a090 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
2a0a0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64  p, objv[2], aMod
2a0b0 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65  e, "mode", 0, &e
2a0c0 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20  Mode) .  )){.   
2a0d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a0e0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
2a0f0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
2a100 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62  point_v2(db, zDb
2a110 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20  , eMode, &nLog, 
2a120 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72  &nCkpt);.  if( r
2a130 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
2a140 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
2a150 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2a160 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71  r *zErrCode = sq
2a170 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
2a180 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
2a190 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2a1a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2a1b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
2a1c0 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68  Code, " - ", (ch
2a1d0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
2a1e0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
2a1f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a200 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
2a210 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
2a220 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2a230 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2a240 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2a250 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45  ntObj(rc==SQLITE
2a260 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54  _BUSY?1:0));.  T
2a270 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2a280 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2a290 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2a2a0 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63  Obj(nLog));.  Tc
2a2b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2a2c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2a2d0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2a2e0 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63  bj(nCkpt));.  Tc
2a2f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a300 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
2a310 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a320 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2a330 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
2a340 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  tocheckpoint db 
2a350 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20  VALUE.*/.static 
2a360 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 61 75 74  int test_wal_aut
2a370 6f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  ocheckpoint(.  C
2a380 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a390 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
2a3a0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2a3b0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a3c0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a3d0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a3e0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a3f0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a400 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a410 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a420 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a430 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a440 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a450 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2a460 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
2a470 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20    int iVal;...  
2a480 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
2a490 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2a4a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2a4b0 62 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29  bjv, "DB VALUE")
2a4c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a4d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
2a4e0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a4f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2a500 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2a510 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
2a520 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c  GetIntFromObj(0,
2a530 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29   objv[2], &iVal)
2a540 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2a550 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a560 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2a570 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
2a580 6e 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20  nt(db, iVal);.  
2a590 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2a5a0 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72  interp);.  if( r
2a5b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a5c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2a5d0 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74  zErrCode = sqlit
2a5e0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20  e3ErrName(rc);. 
2a5f0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2a600 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2a610 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72  NewStringObj(zEr
2a620 72 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  rCode, -1));.   
2a630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2a640 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
2a650 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
2a660 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74  ** tclcmd:  test
2a670 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43  _sqlite3_log ?SC
2a680 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  RIPT?.*/.static 
2a690 73 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61  struct LogCallba
2a6a0 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ck {.  Tcl_Inter
2a6b0 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63  p *pInterp;.  Tc
2a6c0 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c  l_Obj *pObj;.} l
2a6d0 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c  ogcallback = {0,
2a6e0 20 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64   0};.static void
2a6f0 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f   xLogcallback(vo
2a700 69 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20  id *unused, int 
2a710 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29  err, char *zMsg)
2a720 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65  {.  Tcl_Obj *pNe
2a730 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  w = Tcl_Duplicat
2a740 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  eObj(logcallback
2a750 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e  .pObj);.  Tcl_In
2a760 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
2a770 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2a780 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
2a790 20 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c      0, pNew, Tcl
2a7a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
2a7b0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72  lite3ErrName(err
2a7c0 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63  ), -1).  );.  Tc
2a7d0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2a7e0 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20  lement(0, pNew, 
2a7f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2a800 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54  (zMsg, -1));.  T
2a810 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67  cl_EvalObjEx(log
2a820 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70  callback.pInterp
2a830 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c  , pNew, TCL_EVAL
2a840 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c  _GLOBAL|TCL_EVAL
2a850 5f 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f  _DIRECT);.  Tcl_
2a860 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65  DecrRefCount(pNe
2a870 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  w);.}.static int
2a880 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f   test_sqlite3_lo
2a890 67 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  g(.  ClientData 
2a8a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2a8b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a8c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2a8d0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2a8e0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2a8f0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2a900 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2a910 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2a920 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2a930 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a940 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2a950 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2a960 20 20 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a    if( objc>2 ){.
2a970 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2a980 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2a990 6f 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b  objv, "SCRIPT");
2a9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a9b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2a9c0 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
2a9d0 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63  j ){.    Tcl_Dec
2a9e0 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c  rRefCount(logcal
2a9f0 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20  lback.pObj);.   
2aa00 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62   logcallback.pOb
2aa10 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61  j = 0;.    logca
2aa20 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d  llback.pInterp =
2aa30 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
2aa40 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
2aa50 4e 46 49 47 5f 4c 4f 47 2c 20 28 76 6f 69 64 2a  NFIG_LOG, (void*
2aa60 29 30 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  )0, (void*)0);. 
2aa70 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20   }.  if( objc>1 
2aa80 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  ){.    logcallba
2aa90 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ck.pObj = objv[1
2aaa0 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ];.    Tcl_IncrR
2aab0 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
2aac0 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
2aad0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
2aae0 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
2aaf0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
2ab00 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
2ab10 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c  G, xLogcallback,
2ab20 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a   (void*)0);.  }.
2ab30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2ab40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63  .}../*.**     tc
2ab50 6c 5f 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e  l_objproc COMMAN
2ab60 44 4e 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a  DNAME ARGS....**
2ab70 0a 2a 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f  .** Run a TCL co
2ab80 6d 6d 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20  mmand using its 
2ab90 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63  objProc interfac
2aba0 65 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  e.  Throw an err
2abb0 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d  or if.** the com
2abc0 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50  mand has no objP
2abd0 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  roc interface..*
2abe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
2abf0 41 73 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69  AsObjProc(.  voi
2ac00 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2ac10 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ac20 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2ac30 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2ac40 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
2ac50 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
2ac60 66 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  fo;.  if( objc<2
2ac70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2ac80 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2ac90 20 31 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41   1, objv, "COMMA
2aca0 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65  ND ...");.    re
2acb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2acc0 20 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47    }.  if( !Tcl_G
2acd0 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e  etCommandInfo(in
2ace0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2acf0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63  ing(objv[1]), &c
2ad00 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54  mdInfo) ){.    T
2ad10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ad20 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64  interp, "command
2ad30 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20   not found: ",. 
2ad40 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
2ad50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2ad60 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2ad70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ad80 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d 64  R;.  }.  if( cmd
2ad90 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20  Info.objProc==0 
2ada0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2adb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2adc0 22 63 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20  "command has no 
2add0 6f 62 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20  objProc: ",.    
2ade0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
2adf0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28  ring(objv[1]), (
2ae00 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
2ae10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ae20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d 64    }.  return cmd
2ae30 49 6e 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64  Info.objProc(cmd
2ae40 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61  Info.objClientDa
2ae50 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63  ta, interp, objc
2ae60 2d 31 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a  -1, objv+1);.}..
2ae70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ae80 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
2ae90 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 66  * WARNING: The f
2aea0 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f  ollowing functio
2aeb0 6e 2c 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  n, printExplainQ
2aec0 75 65 72 79 50 6c 61 6e 28 29 20 69 73 20 61 6e  ueryPlan() is an
2aed0 20 65 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f   exact.** copy o
2aee0 66 20 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 66  f example code f
2aef0 72 6f 6d 20 65 71 70 2e 69 6e 20 28 65 71 70 2e  rom eqp.in (eqp.
2af00 68 74 6d 6c 29 2e 20 49 66 20 74 68 69 73 20 63  html). If this c
2af10 6f 64 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c  ode is modified,
2af20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 6f 63  .** then the doc
2af30 75 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20  umentation copy 
2af40 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 64 69  needs to be modi
2af50 66 69 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f  fied as well..*/
2af60 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
2af70 70 53 74 6d 74 20 69 73 20 61 20 70 72 65 70 61  pStmt is a prepa
2af80 72 65 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  red SQL statemen
2af90 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  t. This function
2afa0 20 63 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20   compiles.** an 
2afb0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2afc0 41 4e 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65  AN command to re
2afd0 70 6f 72 74 20 6f 6e 20 74 68 65 20 70 72 65 70  port on the prep
2afe0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a  ared statement,.
2aff0 2a 2a 20 61 6e 64 20 70 72 69 6e 74 73 20 74 68  ** and prints th
2b000 65 20 72 65 70 6f 72 74 20 74 6f 20 73 74 64 6f  e report to stdo
2b010 75 74 20 75 73 69 6e 67 20 70 72 69 6e 74 66 28  ut using printf(
2b020 29 2e 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45  )..*/.int printE
2b030 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2b040 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2b050 74 6d 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  tmt){.  const ch
2b060 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
2b070 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2b080 20 53 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a   SQL */.  char *
2b090 7a 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20  zExplain;       
2b0a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
2b0b0 20 77 69 74 68 20 45 58 50 4c 41 49 4e 20 51 55   with EXPLAIN QU
2b0c0 45 52 59 20 50 4c 41 4e 20 70 72 65 70 65 6e 64  ERY PLAN prepend
2b0d0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2b0e0 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20  stmt *pExplain; 
2b0f0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
2b100 6c 65 64 20 45 58 50 4c 41 49 4e 20 51 55 45 52  led EXPLAIN QUER
2b110 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a  Y PLAN command *
2b120 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2b150 64 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  de from sqlite3_
2b160 70 72 65 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a  prepare_v2() */.
2b170 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2b180 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
2b190 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65  if( zSql==0 ) re
2b1a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2b1b0 52 3b 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d  R;..  zExplain =
2b1c0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2b1d0 28 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  ("EXPLAIN QUERY 
2b1e0 50 4c 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b  PLAN %s", zSql);
2b1f0 0a 20 20 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d  .  if( zExplain=
2b200 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2b210 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20  TE_NOMEM;..  rc 
2b220 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2b230 65 5f 76 32 28 73 71 6c 69 74 65 33 5f 64 62 5f  e_v2(sqlite3_db_
2b240 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a  handle(pStmt), z
2b250 45 78 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45  Explain, -1, &pE
2b260 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71  xplain, 0);.  sq
2b270 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 78 70 6c  lite3_free(zExpl
2b280 61 69 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ain);.  if( rc!=
2b290 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
2b2a0 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28  rn rc;..  while(
2b2b0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
2b2c0 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
2b2d0 69 6e 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  in) ){.    int i
2b2e0 53 65 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74  Selectid = sqlit
2b2f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
2b300 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20  xplain, 0);.    
2b310 69 6e 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c  int iOrder = sql
2b320 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2b330 70 45 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20  pExplain, 1);.  
2b340 20 20 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71    int iFrom = sq
2b350 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2b360 28 70 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20  (pExplain, 2);. 
2b370 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2b380 44 65 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20  Detail = (const 
2b390 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
2b3a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c  olumn_text(pExpl
2b3b0 61 69 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72  ain, 3);..    pr
2b3c0 69 6e 74 66 28 22 25 64 20 25 64 20 25 64 20 25  intf("%d %d %d %
2b3d0 73 5c 6e 22 2c 20 69 53 65 6c 65 63 74 69 64 2c  s\n", iSelectid,
2b3e0 20 69 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20   iOrder, iFrom, 
2b3f0 7a 44 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  zDetail);.  }.. 
2b400 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
2b410 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69  finalize(pExplai
2b420 6e 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  n);.}..static in
2b430 74 20 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70  t test_print_eqp
2b440 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2b450 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2b460 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2b470 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2b480 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b490 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2b4a0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2b4b0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
2b4c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2b4d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2b4e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
2b4f0 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
2b500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b510 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
2b520 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2b530 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2b540 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
2b550 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2b560 0a 20 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70  .  rc = printExp
2b570 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53  lainQueryPlan(pS
2b580 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20  tmt);.  /* This 
2b590 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e  is needed on Win
2b5a0 64 6f 77 73 20 73 6f 20 74 68 61 74 20 61 20 74  dows so that a t
2b5b0 65 73 74 20 63 61 73 65 20 75 73 69 6e 67 20 74  est case using t
2b5c0 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69  his .  ** functi
2b5d0 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65  on can open a re
2b5e0 61 64 20 70 69 70 65 20 61 6e 64 20 67 65 74 20  ad pipe and get 
2b5f0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20  the output of.  
2b600 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  ** printExplainQ
2b610 75 65 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64  ueryPlan() immed
2b620 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66  iately..  */.  f
2b630 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
2b640 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2b650 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2b660 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2b670 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
2b680 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2b690 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2b6a0 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73  LAIN */../*.** s
2b6b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2b6c0 72 6f 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e  rol VERB ARGS...
2b6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2b6e0 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  est_test_control
2b6f0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2b700 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2b710 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2b720 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2b730 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b740 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72  .){.  struct Ver
2b750 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  b {.    const ch
2b760 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
2b770 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b  nt i;.  } aVerb[
2b780 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c  ] = {.    { "SQL
2b790 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2b7a0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53  ALTIME_FAULT", S
2b7b0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
2b7c0 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d  OCALTIME_FAULT }
2b7d0 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  , .    { "SQLITE
2b7e0 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
2b7f0 5f 4d 4d 41 50 22 2c 20 20 20 20 20 53 51 4c 49  _MMAP",     SQLI
2b800 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
2b810 45 52 5f 4d 4d 41 50 20 20 20 20 20 7d 2c 20 0a  ER_MMAP     }, .
2b820 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45      { "SQLITE_TE
2b830 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 22  STCTRL_IMPOSTER"
2b840 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
2b850 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2b860 52 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b  R        },.  };
2b870 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
2b880 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
2b890 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2b8a0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
2b8b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2b8c0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
2b8d0 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
2b8e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b8f0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
2b900 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
2b910 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
2b920 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
2b930 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
2b940 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
2b950 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
2b960 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
2b970 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
2b980 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
2b990 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
2b9a0 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
2b9b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
2b9c0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
2b9d0 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
2b9e0 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
2b9f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2ba00 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
2ba10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
2ba20 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
2ba30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2ba40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2ba50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
2ba60 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
2ba70 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2ba80 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
2ba90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2baa0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2bab0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2bac0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
2bad0 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
2bae0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2baf0 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
2bb00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
2bb10 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
2bb20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20    int val;.     
2bb30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2bb40 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20      if( objc!=4 
2bb50 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57  ){.        Tcl_W
2bb60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2bb70 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 2, objv, "DB
2bb80 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20   LIMIT");.      
2bb90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2bba0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
2bbb0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2bbc0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2bbd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2bbe0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
2bbf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2bc00 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2bc10 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2bc20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
2bc30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bc40 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  R;.      sqlite3
2bc50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2bc60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
2bc70 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76  RTER_MMAP, db, v
2bc80 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  al);.      break
2bc90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
2bca0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
2bcb0 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20  L_IMPOSTER: {.  
2bcc0 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74      int onOff, t
2bcd0 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  num;.      const
2bce0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a   char *zDbName;.
2bcf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
2bd00 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a  b;.      if( obj
2bd10 63 21 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=6 ){.        
2bd20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2bd30 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
2bd40 2c 20 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f  , "DB dbName onO
2bd50 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20  ff tnum");.     
2bd60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bd70 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2bd80 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e     if( getDbPoin
2bd90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2bda0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2bdb0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2bdc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2bdd0 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c     zDbName = Tcl
2bde0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2bdf0 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54  3]);.      if( T
2be00 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2be10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
2be20 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72 65 74 75  , &onOff) ) retu
2be30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2be40 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
2be50 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2be60 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d  , objv[5], &tnum
2be70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2be80 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2be90 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2bea0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2beb0 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a  _IMPOSTER, db, z
2bec0 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74  DbName, onOff, t
2bed0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
2bee0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
2bef0 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2bf00 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2bf10 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
2bf20 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a   SQLITE_OS_UNIX.
2bf30 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69  #include <sys/ti
2bf40 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  me.h>.#include <
2bf50 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a  sys/resource.h>.
2bf60 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2bf70 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f  _getrusage(.  vo
2bf80 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2bf90 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2bfa0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2bfb0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2bfc0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2bfd0 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a  char buf[1024];.
2bfe0 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
2bff0 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20  r;.  memset(&r, 
2c000 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  0, sizeof(r));. 
2c010 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
2c020 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20  E_SELF, &r);..  
2c030 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c040 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62 75  (sizeof(buf), bu
2c050 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d 65  f,.    "ru_utime
2c060 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d  =%d.%06d ru_stim
2c070 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e  e=%d.%06d ru_min
2c080 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74  flt=%d ru_majflt
2c090 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29  =%d", .    (int)
2c0a0 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65  r.ru_utime.tv_se
2c0b0 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69  c, (int)r.ru_uti
2c0c0 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
2c0d0 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
2c0e0 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
2c0f0 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_stime.tv_usec
2c100 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2c110 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e  _minflt, (int)r.
2c120 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20  ru_majflt.  );. 
2c130 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2c140 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2c150 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
2c160 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
2c170 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
2c180 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2c190 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  IN./*.** Informa
2c1a0 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d  tion passed from
2c1b0 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
2c1c0 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77   into the window
2c1d0 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a  s file locker.**
2c1e0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
2c1f0 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ad..*/.struct wi
2c200 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a  n32FileLocker {.
2c210 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20    char *evName; 
2c220 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2c230 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c   event to signal
2c240 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20   thread startup 
2c250 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
2c260 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
2c270 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  le of the file t
2c280 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
2c290 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20   int delay1;    
2c2a0 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
2c2b0 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  fore locking */.
2c2c0 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20    int delay2;   
2c2d0 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
2c2e0 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20  efore unlocking 
2c2f0 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20  */.  int ok;    
2c300 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
2c310 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74  shed ok */.  int
2c320 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20   err;           
2c330 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65   /* True if an e
2c340 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d  rror occurs */.}
2c350 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  ;.#endif...#if S
2c360 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
2c370 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68  clude <process.h
2c380 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  >./*.** The back
2c390 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68  ground thread th
2c3a0 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63  at does file loc
2c3b0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2c3c0 76 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f  void win32_file_
2c3d0 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70  locker(void *pAp
2c3e0 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74  pData){.  struct
2c3f0 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
2c400 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69   *p = (struct wi
2c410 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70  n32FileLocker*)p
2c420 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70  AppData;.  if( p
2c430 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ->evName ){.    
2c440 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e  HANDLE ev = Open
2c450 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49  Event(EVENT_MODI
2c460 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c  FY_STATE, FALSE,
2c470 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20   p->evName);.   
2c480 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20   if ( ev ){.    
2c490 20 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a    SetEvent(ev);.
2c4a0 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
2c4b0 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(ev);.    }.  }
2c4c0 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31  .  if( p->delay1
2c4d0 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61   ) Sleep(p->dela
2c4e0 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46  y1);.  if( LockF
2c4f0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
2c500 31 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b  100000000, 0) ){
2c510 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65  .    Sleep(p->de
2c520 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63  lay2);.    Unloc
2c530 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
2c540 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b  , 100000000, 0);
2c550 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a  .    p->ok = 1;.
2c560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
2c570 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43  err = 1;.  }.  C
2c580 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29  loseHandle(p->h)
2c590 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20  ;.  p->h = 0;.  
2c5a0 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20  p->delay1 = 0;. 
2c5b0 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a   p->delay2 = 0;.
2c5c0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
2c5d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
2c5e0 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33  *      lock_win3
2c5f0 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20  2_file FILENAME 
2c600 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a  DELAY1 DELAY2.**
2c610 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75  .** Get an exclu
2c620 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c  sive manditory l
2c630 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20  ock on file for 
2c640 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f  DELAY2 milliseco
2c650 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c  nds..** Wait DEL
2c660 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  AY1 milliseconds
2c670 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
2c680 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  g the lock..*/.s
2c690 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2c6a0 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69  file_lock(.  voi
2c6b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2c6c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c6d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2c6e0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2c6f0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
2c700 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
2c710 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d  32FileLocker x =
2c720 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c   { "win32_file_l
2c730 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ock", 0, 0, 0, 0
2c740 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
2c750 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
2c760 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
2c770 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20  ;.  int retry = 
2c780 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a  0;.  HANDLE ev;.
2c790 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b    DWORD wResult;
2c7a0 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
2c7b0 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  4 && objc!=1 ){.
2c7c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2c7d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2c7e0 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
2c7f0 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b  DELAY1 DELAY2");
2c800 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c810 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2c820 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20   objc==1 ){.    
2c830 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c840 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2c850 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25  Buf, "%d %d %d %
2c860 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
2c870 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b              x.ok
2c880 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79  , x.err, x.delay
2c890 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68  1, x.delay2, x.h
2c8a0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
2c8b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2c8c0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
2c8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c8e0 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  OK;.  }.  while(
2c8f0 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30   x.h && retry<30
2c900 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b   ){.    retry++;
2c910 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b  .    Sleep(100);
2c920 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29  .  }.  if( x.h )
2c930 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2c940 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2c950 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29  busy", (char*)0)
2c960 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c970 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2c980 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2c990 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2c9a0 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20  [2], &x.delay1) 
2c9b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2c9c0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
2c9d0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2c9e0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e  rp, objv[3], &x.
2c9f0 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e  delay2) ) return
2ca00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
2ca10 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
2ca20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2ca30 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65  ;.  x.h = Create
2ca40 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
2ca50 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e  GENERIC_READ|GEN
2ca60 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
2ca70 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53            FILE_S
2ca80 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53  HARE_READ|FILE_S
2ca90 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f  HARE_WRITE, 0, O
2caa0 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
2cab0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41            FILE_A
2cac0 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c  TTRIBUTE_NORMAL,
2cad0 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20   0);.  if( !x.h 
2cae0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2caf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cb00 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
2cb10 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
2cb20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2cb30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2cb40 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65  ;.  }.  ev = Cre
2cb50 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54  ateEvent(NULL, T
2cb60 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76  RUE, FALSE, x.ev
2cb70 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65  Name);.  if ( !e
2cb80 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  v ){.    Tcl_App
2cb90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2cba0 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
2cbb0 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e   event: ", x.evN
2cbc0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2cbd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2cbe0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67  RROR;.  }.  _beg
2cbf0 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66  inthread(win32_f
2cc00 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28  ile_locker, 0, (
2cc10 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65  void*)&x);.  Sle
2cc20 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77  ep(0);.  if ( (w
2cc30 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72  Result = WaitFor
2cc40 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c  SingleObject(ev,
2cc50 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f   10000))!=WAIT_O
2cc60 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73  BJECT_0 ){.    s
2cc70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2cc80 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
2cc90 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73  uf, "0x%x", wRes
2cca0 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  ult);.    Tcl_Ap
2ccb0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2ccc0 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a  p, "wait failed:
2ccd0 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a   ", zBuf, (char*
2cce0 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  )0);.    CloseHa
2ccf0 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65  ndle(ev);.    re
2cd00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2cd10 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2cd20 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(ev);.  return 
2cd30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2cd40 20 20 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e        exists_win
2cd50 33 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a  32_path PATH.**.
2cd60 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2cd70 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2cd80 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73  fied path exists
2cd90 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2cda0 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20  alified name.** 
2cdb0 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 20 63  may exceed 260 c
2cdc0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2cdd0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2cde0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2cdf0 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 65 78 69  ic int win32_exi
2ce00 73 74 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64  sts_path(.  void
2ce10 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2ce20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ce30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2ce40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2ce50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2ce60 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2ce70 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2ce80 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2ce90 2c 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72  , "PATH");.    r
2cea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ceb0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
2cec0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2ced0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
2cee0 6a 28 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65  j(.      GetFile
2cef0 41 74 74 72 69 62 75 74 65 73 57 28 20 54 63 6c  AttributesW( Tcl
2cf00 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2cf10 5b 31 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46  [1]))!=INVALID_F
2cf20 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
2cf30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2cf40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2cf50 20 20 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c    find_win32_fil
2cf60 65 20 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20  e PATTERN.**.** 
2cf70 52 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f  Returns a list o
2cf80 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64  f entries in a d
2cf90 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61  irectory that ma
2cfa0 74 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  tch the specifie
2cfb0 64 20 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68  d pattern,.** wh
2cfc0 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2cfd0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
2cfe0 65 65 64 20 32 34 38 20 63 68 61 72 61 63 74 65  eed 248 characte
2cff0 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
2d000 69 78 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c  ixed with.** "\\
2d010 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2d020 6e 74 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69  nt win32_find_fi
2d030 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  le(.  void *clie
2d040 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2d050 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2d060 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2d070 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d080 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46  ].){.  HANDLE hF
2d090 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49  indFile = INVALI
2d0a0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
2d0b0 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54    WIN32_FIND_DAT
2d0c0 41 57 20 66 69 6e 64 44 61 74 61 3b 0a 20 20 54  AW findData;.  T
2d0d0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b  cl_Obj *listObj;
2d0e0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
2d0f0 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  no;.  if( objc!=
2d100 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2d110 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2d120 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54  , 1, objv, "PATT
2d130 45 52 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ERN");.    retur
2d140 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d150 0a 20 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 46  .  hFindFile = F
2d160 69 6e 64 46 69 72 73 74 46 69 6c 65 57 28 54 63  indFirstFileW(Tc
2d170 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2d180 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44 61 74 61  v[1]), &findData
2d190 29 3b 0a 20 20 69 66 28 20 68 46 69 6e 64 46 69  );.  if( hFindFi
2d1a0 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  le==INVALID_HAND
2d1b0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
2d1c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2d1d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2d1e0 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
2d1f0 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
2d200 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d210 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a  R;.  }.  listObj
2d220 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2d230 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2d240 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
2d250 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  do {.    Tcl_Lis
2d260 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2d270 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
2d280 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64  j, Tcl_NewUnicod
2d290 65 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69  eObj(.        fi
2d2a0 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65  ndData.cFileName
2d2b0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2d2c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2d2d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
2d2e0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64  tObj, Tcl_NewWid
2d2f0 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20  eIntObj(.       
2d300 20 66 69 6e 64 44 61 74 61 2e 64 77 46 69 6c 65   findData.dwFile
2d310 41 74 74 72 69 62 75 74 65 73 29 29 3b 0a 20 20  Attributes));.  
2d320 7d 20 77 68 69 6c 65 28 20 46 69 6e 64 4e 65 78  } while( FindNex
2d330 74 46 69 6c 65 57 28 68 46 69 6e 64 46 69 6c 65  tFileW(hFindFile
2d340 2c 20 26 66 69 6e 64 44 61 74 61 29 20 29 3b 0a  , &findData) );.
2d350 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65    lastErrno = Ge
2d360 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
2d370 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e  if( lastErrno!=N
2d380 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61 73 74 45  O_ERROR && lastE
2d390 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d  rrno!=ERROR_NO_M
2d3a0 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20  ORE_FILES ){.   
2d3b0 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64   FindClose(hFind
2d3c0 46 69 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44  File);.    Tcl_D
2d3d0 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ecrRefCount(list
2d3e0 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  Obj);.    Tcl_Se
2d3f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2d400 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2d410 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2d420 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2d430 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d440 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69  .  FindClose(hFi
2d450 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53  ndFile);.  Tcl_S
2d460 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2d470 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  rp, listObj);.  
2d480 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2d490 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c  ../*.**      del
2d4a0 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46  ete_win32_file F
2d4b0 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65  ILENAME.**.** De
2d4c0 6c 65 74 65 73 20 74 68 65 20 73 70 65 63 69 66  letes the specif
2d4d0 69 65 64 20 66 69 6c 65 2c 20 77 68 6f 73 65 20  ied file, whose 
2d4e0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
2d4f0 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
2d500 32 36 30 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  260.** character
2d510 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2d520 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
2d530 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2d540 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
2d550 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2d560 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2d570 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2d580 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2d590 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2d5a0 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
2d5b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2d5c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2d5d0 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
2d5e0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
2d5f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2d600 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46 69  .  if( !DeleteFi
2d610 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  leW(Tcl_GetUnico
2d620 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
2d630 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2d640 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2d650 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2d660 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2d670 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d680 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
2d690 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2d6a0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2d6b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2d6c0 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f       make_win32_
2d6d0 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a  dir DIRECTORY.**
2d6e0 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20  .** Creates the 
2d6f0 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74  specified direct
2d700 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  ory, whose fully
2d710 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
2d720 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a  may exceed 248.*
2d730 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  * characters if 
2d740 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
2d750 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
2d760 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
2d770 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63  mkdir(.  void *c
2d780 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2d790 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2d7a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2d7b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2d7c0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
2d7d0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2d7e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2d7f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2d800 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20  DIRECTORY");.   
2d810 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d820 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72  R;.  }.  if( !Cr
2d830 65 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54  eateDirectoryW(T
2d840 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
2d850 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b  jv[1]), NULL) ){
2d860 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
2d870 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2d880 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2d890 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
2d8a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d8b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
2d8c0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2d8d0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2d8e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2d8f0 20 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e        remove_win
2d900 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59  32_dir DIRECTORY
2d910 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74  .**.** Removes t
2d920 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72  he specified dir
2d930 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75  ectory, whose fu
2d940 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2d950 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
2d960 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  8.** characters 
2d970 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
2d980 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
2d990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2d9a0 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64  32_rmdir(.  void
2d9b0 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
2d9c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2d9d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2d9e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2d9f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
2da00 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2da10 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2da20 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2da30 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
2da40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2da50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2da60 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79  !RemoveDirectory
2da70 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
2da80 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20  (objv[1])) ){.  
2da90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2daa0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2dab0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
2dac0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
2dad0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2dae0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52  ROR;.  }.  Tcl_R
2daf0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2db00 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
2db10 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
2db20 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d  /*.**      optim
2db30 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20  ization_control 
2db40 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a  DB OPT BOOLEAN.*
2db50 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
2db60 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74  isable query opt
2db70 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67  imizations using
2db80 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
2db90 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69  t_control().** i
2dba0 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61 62  nterface.  Disab
2dbb0 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
2dbc0 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c   false and enabl
2dbd0 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  e if BOOLEAN is 
2dbe0 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20  true..** OPT is 
2dbf0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
2dc00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
2dc10 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a  be disabled..*/.
2dc20 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6d  static int optim
2dc30 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28  ization_control(
2dc40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2dc50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2dc60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2dc70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2dc80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2dc90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
2dca0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
2dcb0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
2dcc0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e   int onoff;.  in
2dcd0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74  t mask = 0;.  st
2dce0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2dcf0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2dd00 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
2dd10 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20    int mask;.  } 
2dd20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aOpt[] = {.    {
2dd30 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20   "all",         
2dd40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
2dd50 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
2dd60 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20  .    { "none",  
2dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd90 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75      },.    { "qu
2dda0 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20  ery-flattener", 
2ddb0 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79      SQLITE_Query
2ddc0 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20  Flattener },.   
2ddd0 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65   { "column-cache
2dde0 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2ddf0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20  _ColumnCache    
2de00 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62  },.    { "groupb
2de10 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20  y-order",       
2de20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2de30 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  der   },.    { "
2de40 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73  factor-constants
2de50 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63  ",    SQLITE_Fac
2de60 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20  torOutConst },. 
2de70 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f     { "distinct-o
2de80 70 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  pt",        SQLI
2de90 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20  TE_DistinctOpt  
2dea0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65    },.    { "cove
2deb0 72 2d 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 20  r-idx-scan",    
2dec0 20 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64    SQLITE_CoverId
2ded0 78 53 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20 7b  xScan   },.    {
2dee0 20 22 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a   "order-by-idx-j
2def0 6f 69 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 4f  oin",   SQLITE_O
2df00 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d 2c  rderByIdxJoin },
2df10 0a 20 20 20 20 7b 20 22 74 72 61 6e 73 69 74 69  .    { "transiti
2df20 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  ve",          SQ
2df30 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20  LITE_Transitive 
2df40 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75      },.    { "su
2df50 62 71 75 65 72 79 2d 63 6f 72 6f 75 74 69 6e 65  bquery-coroutine
2df60 22 2c 20 20 53 51 4c 49 54 45 5f 53 75 62 71 43  ",  SQLITE_SubqC
2df70 6f 72 6f 75 74 69 6e 65 20 20 7d 2c 0a 20 20 20  oroutine  },.   
2df80 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f   { "omit-noop-jo
2df90 69 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  in",      SQLITE
2dfa0 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20  _OmitNoopJoin   
2dfb0 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22  },.    { "stat3"
2dfc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2dfd0 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20  SQLITE_Stat34   
2dfe0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2dff0 73 74 61 74 34 22 2c 20 20 20 20 20 20 20 20 20  stat4",         
2e000 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61        SQLITE_Sta
2e010 74 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t34         },. 
2e020 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
2e030 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
2e040 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2e050 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2e060 4f 50 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  OPT BOOLEAN");. 
2e070 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e080 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2e090 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2e0a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2e0b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2e0c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2e0d0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
2e0e0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
2e0f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2e100 2c 20 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75  , &onoff) ) retu
2e110 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e120 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  zOpt = Tcl_GetSt
2e130 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2e140 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2e150 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2e160 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2e170 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2e180 4f 70 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70  Opt, aOpt[i].zOp
2e190 74 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  tName)==0 ){.   
2e1a0 20 20 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69     mask = aOpt[i
2e1b0 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72  ].mask;.      br
2e1c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2e1d0 20 69 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73   if( onoff ) mas
2e1e0 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28  k = ~mask;.  if(
2e1f0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29   i>=sizeof(aOpt)
2e200 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
2e210 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2e220 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e230 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69   "unknown optimi
2e240 7a 61 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20  zation - should 
2e250 62 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20  be one of:",.   
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e270 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
2e280 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2e290 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2e2a0 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2e2b0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2e2c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2e2d0 20 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74   ", aOpt[i].zOpt
2e2e0 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
2e2f0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2e300 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2e310 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2e320 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2e330 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2e340 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29  TIONS, db, mask)
2e350 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2e360 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  K;.}..typedef st
2e370 72 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69  ruct sqlite3_api
2e380 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65  _routines sqlite
2e390 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a  3_api_routines;.
2e3a0 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
2e3b0 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
2e3c0 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
2e3d0 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
2e3e0 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
2e3f0 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
2e400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2e410 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
2e420 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64  nsionCmd(.  void
2e430 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2e440 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2e450 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2e460 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2e470 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78  T objv[].){.  ex
2e480 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2e490 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c  _amatch_init(sql
2e4a0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2e4b0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2e4c0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2e4d0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2e4e0 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c  closure_init(sql
2e4f0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2e500 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2e510 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2e520 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2e530 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c 69 74 65  eval_init(sqlite
2e540 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2e550 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2e560 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2e570 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c   int sqlite3_fil
2e580 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eio_init(sqlite3
2e590 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2e5a0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2e5b0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2e5c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a  int sqlite3_fuzz
2e5d0 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  er_init(sqlite3*
2e5e0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2e5f0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2e600 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2e610 6e 74 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f  nt sqlite3_ieee_
2e620 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2e630 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2e640 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2e650 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2e660 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
2e670 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2e680 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2e690 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2e6a0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2e6b0 20 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74   sqlite3_percent
2e6c0 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ile_init(sqlite3
2e6d0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2e6e0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2e6f0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2e700 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67 65  int sqlite3_rege
2e710 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  xp_init(sqlite3*
2e720 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2e730 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2e740 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2e750 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65  nt sqlite3_serie
2e760 73 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  s_init(sqlite3*,
2e770 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2e780 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2e790 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2e7a0 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66  t sqlite3_spellf
2e7b0 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ix_init(sqlite3*
2e7c0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2e7d0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2e7e0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2e7f0 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70  nt sqlite3_totyp
2e800 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2e810 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2e820 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2e830 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2e840 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e  t sqlite3_wholen
2e850 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  umber_init(sqlit
2e860 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2e870 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2e880 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74 61 74 69  tines*);.  stati
2e890 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
2e8a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2e8b0 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20 20 69  *zExtName;.    i
2e8c0 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71 6c 69  nt (*pInit)(sqli
2e8d0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2e8e0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2e8f0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20 61 45  utines*);.  } aE
2e900 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20  xtension[] = {. 
2e910 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c 20 20     { "amatch",  
2e920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2e930 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69  lite3_amatch_ini
2e940 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2e950 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72  },.    { "closur
2e960 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2e970 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72    sqlite3_closur
2e980 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2e990 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76      },.    { "ev
2e9a0 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
2e9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76        sqlite3_ev
2e9c0 61 6c 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  al_init         
2e9d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2e9e0 20 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20   "fileio",      
2e9f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ea00 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20  3_fileio_init   
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ea20 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ea40 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2ea50 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2ea60 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
2ea70 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2ea80 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
2ea90 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2eaa0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
2eab0 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
2eac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
2ead0 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
2eae0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2eaf0 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
2eb00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2eb10 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
2eb20 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2eb30 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20     { "regexp",  
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2eb50 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2eb60 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2eb70 7d 2c 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73  },.    { "series
2eb80 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2eb90 20 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73    sqlite3_series
2eba0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2ebb0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70      },.    { "sp
2ebc0 65 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20  ellfix",        
2ebd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70        sqlite3_sp
2ebe0 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20  ellfix_init     
2ebf0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2ec00 20 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20   "totype",      
2ec10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ec20 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20  3_totype_init   
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ec40 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65     { "wholenumbe
2ec50 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 73 71  r",           sq
2ec60 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65  lite3_wholenumbe
2ec70 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
2ec80 7d 2c 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65  },.  };.  sqlite
2ec90 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
2eca0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e  har *zName;.  in
2ecb0 74 20 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68  t i, j, rc;.  ch
2ecc0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2ecd0 0a 20 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b  .  if( objc<3 ){
2ece0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2ecf0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ed00 20 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20   objv, "DB NAME 
2ed10 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
2ed20 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2ed30 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2ed40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2ed50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2ed60 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
2ed70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66  n TCL_ERROR;.  f
2ed80 6f 72 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20  or(j=2; j<objc; 
2ed90 6a 2b 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  j++){.    zName 
2eda0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2edb0 6f 62 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f  objv[j]);.    fo
2edc0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
2edd0 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20  ze(aExtension); 
2ede0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
2edf0 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45  strcmp(zName, aE
2ee00 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74  xtension[i].zExt
2ee10 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
2ee20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ee30 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78  i>=ArraySize(aEx
2ee40 74 65 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20  tension) ){.    
2ee50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2ee60 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73  lt(interp, "no s
2ee70 75 63 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22  uch extension: "
2ee80 2c 20 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29  , zName, (char*)
2ee90 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
2eea0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2eeb0 7d 0a 20 20 20 20 69 66 28 20 61 45 78 74 65 6e  }.    if( aExten
2eec0 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b  sion[i].pInit ){
2eed0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 45 78 74  .      rc = aExt
2eee0 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28  ension[i].pInit(
2eef0 64 62 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29  db, &zErrMsg, 0)
2ef00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2ef10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2ef20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2ef30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
2ef40 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  | zErrMsg ){.   
2ef50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2ef60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69  ult(interp, "ini
2ef70 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22  tialization of "
2ef80 2c 20 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65  , zName, " faile
2ef90 64 3a 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20  d: ", zErrMsg,. 
2efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efb0 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
2efc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2efd0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
2efe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2eff0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
2f000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2f010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f  .}../*.**     so
2f020 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
2f030 61 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74  ap BOOL.**.*/.st
2f040 61 74 69 63 20 69 6e 74 20 73 6f 72 74 65 72 5f  atic int sorter_
2f050 74 65 73 74 5f 66 61 6b 65 68 65 61 70 28 0a 20  test_fakeheap(. 
2f060 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2f070 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2f080 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2f090 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2f0a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2f0b0 0a 20 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 69  .  int bArg;.  i
2f0c0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2f0d0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f0e0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2f0f0 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b 0a 20 20 20  jv, "BOOL");.   
2f100 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f110 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 54 63  R;.  }..  if( Tc
2f120 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
2f130 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2f140 5b 31 5d 2c 20 26 62 41 72 67 29 20 29 7b 0a 20  [1], &bArg) ){. 
2f150 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f160 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
2f170 62 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20  bArg ){.    if( 
2f180 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2f190 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
2f1a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2f1b0 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
2f1c0 3d 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  = SQLITE_INT_TO_
2f1d0 50 54 52 28 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  PTR(-1);.    }. 
2f1e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2f1f0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2f200 66 69 67 2e 70 48 65 61 70 3d 3d 53 51 4c 49 54  fig.pHeap==SQLIT
2f210 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29  E_INT_TO_PTR(-1)
2f220 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2f230 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2f240 65 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  eap = 0;.    }. 
2f250 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52   }..  Tcl_ResetR
2f260 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2f270 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2f280 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72  }../*.**     sor
2f290 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68  ter_test_sort4_h
2f2a0 65 6c 70 65 72 20 44 42 20 53 51 4c 31 20 4e 53  elper DB SQL1 NS
2f2b0 54 45 50 20 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43  TEP SQL2.**.** C
2f2c0 6f 6d 70 69 6c 65 20 53 51 4c 20 73 74 61 74 65  ompile SQL state
2f2d0 6d 65 6e 74 20 24 53 51 4c 31 20 61 6e 64 20 73  ment $SQL1 and s
2f2e0 74 65 70 20 69 74 20 24 4e 53 54 45 50 20 74 69  tep it $NSTEP ti
2f2f0 6d 65 73 2e 20 46 6f 72 20 65 61 63 68 20 72 6f  mes. For each ro
2f300 77 2c 20 0a 2a 2a 20 63 68 65 63 6b 20 74 68 61  w, .** check tha
2f310 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 61  t the leftmost a
2f320 6e 64 20 72 69 67 68 74 6d 6f 73 74 20 63 6f 6c  nd rightmost col
2f330 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 61 72  umns returned ar
2f340 65 20 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2c  e both integers,
2f350 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 62 6f 74  .** and that bot
2f360 68 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  h contain the sa
2f370 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  me value..**.** 
2f380 54 68 65 6e 20 65 78 65 63 75 74 65 20 73 74 61  Then execute sta
2f390 74 65 6d 65 6e 74 20 24 53 51 4c 32 2e 20 43 68  tement $SQL2. Ch
2f3a0 65 63 6b 20 74 68 61 74 20 74 68 65 20 73 74 61  eck that the sta
2f3b0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 74  tement returns t
2f3c0 68 65 20 73 61 6d 65 0a 2a 2a 20 73 65 74 20 6f  he same.** set o
2f3d0 66 20 69 6e 74 65 67 65 72 73 20 69 6e 20 74 68  f integers in th
2f3e0 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73 20  e same order as 
2f3f0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
2f400 73 74 65 70 20 28 75 73 69 6e 67 20 24 53 51 4c  step (using $SQL
2f410 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  1)..*/.static in
2f420 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f  t sorter_test_so
2f430 72 74 34 5f 68 65 6c 70 65 72 28 0a 20 20 76 6f  rt4_helper(.  vo
2f440 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2f450 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f460 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2f470 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2f480 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2f490 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2f4a0 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  1;.  const char 
2f4b0 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74 20 6e 53  *zSql2;.  int nS
2f4c0 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 53 74 65  tep; .  int iSte
2f4d0 70 3b 20 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d  p; .  int iCksum
2f4e0 31 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 69 43  1 = 0; .  int iC
2f4f0 6b 73 75 6d 32 20 3d 20 30 3b 20 0a 20 20 69 6e  ksum2 = 0; .  in
2f500 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 42 3b 0a  t rc;.  int iB;.
2f510 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2f520 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2f530 53 74 6d 74 3b 0a 20 20 0a 20 20 69 66 28 20 6f  Stmt;.  .  if( o
2f540 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
2f550 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2f560 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2f570 22 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53  "DB SQL1 NSTEP S
2f580 51 4c 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72  QL2");.    retur
2f590 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f5a0 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
2f5b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2f5c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2f5d0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
2f5e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f5f0 7a 53 71 6c 31 20 3d 20 54 63 6c 5f 47 65 74 53  zSql1 = Tcl_GetS
2f600 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2f610 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2f620 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2f630 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 74 65 70 29  objv[3], &nStep)
2f640 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2f650 52 4f 52 3b 0a 20 20 7a 53 71 6c 32 20 3d 20 54  ROR;.  zSql2 = T
2f660 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2f670 76 5b 34 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[4]);..  rc = s
2f680 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2f690 32 28 64 62 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c  2(db, zSql1, -1,
2f6a0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
2f6b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f6c0 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
2f6d0 72 3b 0a 0a 20 20 69 42 20 3d 20 73 71 6c 69 74  r;..  iB = sqlit
2f6e0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
2f6f0 70 53 74 6d 74 29 2d 31 3b 0a 20 20 66 6f 72 28  pStmt)-1;.  for(
2f700 69 53 74 65 70 3d 30 3b 20 69 53 74 65 70 3c 6e  iStep=0; iStep<n
2f710 53 74 65 70 20 26 26 20 53 51 4c 49 54 45 5f 52  Step && SQLITE_R
2f720 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2f730 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b 2b  (pStmt); iStep++
2f740 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 73  ){.    int a = s
2f750 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2f760 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
2f770 20 69 66 28 20 61 21 3d 73 71 6c 69 74 65 33 5f   if( a!=sqlite3_
2f780 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2f790 2c 20 69 42 29 20 29 7b 0a 20 20 20 20 20 20 54  , iB) ){.      T
2f7a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2f7b0 69 6e 74 65 72 70 2c 20 22 64 61 74 61 20 65 72  interp, "data er
2f7c0 72 6f 72 3a 20 28 61 21 3d 62 29 22 2c 20 30 29  ror: (a!=b)", 0)
2f7d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2f7e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2f7f0 0a 20 20 20 20 69 43 6b 73 75 6d 31 20 2b 3d 20  .    iCksum1 += 
2f800 28 69 43 6b 73 75 6d 31 20 3c 3c 20 33 29 20 2b  (iCksum1 << 3) +
2f810 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   a;.  }.  rc = s
2f820 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2f830 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63  pStmt);.  if( rc
2f840 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2f850 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20  to sql_error;.. 
2f860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
2f870 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
2f880 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  l2, -1, &pStmt, 
2f890 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2f8a0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
2f8b0 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66 6f 72 28  ql_error;.  for(
2f8c0 69 53 74 65 70 3d 30 3b 20 53 51 4c 49 54 45 5f  iStep=0; SQLITE_
2f8d0 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
2f8e0 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65 70 2b  p(pStmt); iStep+
2f8f0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20  +){.    int a = 
2f900 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2f910 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
2f920 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20 28 69 43    iCksum2 += (iC
2f930 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b 20 61 3b  ksum2 << 3) + a;
2f940 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2f950 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2f960 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  mt);.  if( rc!=S
2f970 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
2f980 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  sql_error;..  if
2f990 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73 75  ( iCksum1!=iCksu
2f9a0 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  m2 ){.    Tcl_Ap
2f9b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2f9c0 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69 73  p, "checksum mis
2f9d0 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20 20  match", 0);.    
2f9e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f9f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2fa00 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72  TCL_OK;. sql_err
2fa10 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  or:.  Tcl_Append
2fa20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2fa30 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73 71  sql error: ", sq
2fa40 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
2fa50 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
2fa60 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69  CL_ERROR;.}...#i
2fa70 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
2fa80 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2fa90 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
2faa0 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a 0a  3userauth.h"./*.
2fab0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2fac0 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
2fad0 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41 4d  icate DB USERNAM
2fae0 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73 74  E PASSWORD.*/.st
2faf0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73  atic int test_us
2fb00 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28  er_authenticate(
2fb10 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2fb20 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2fb30 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2fb40 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2fb50 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2fb60 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2fb70 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2fb80 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fba0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2fbb0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2fbc0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2fbd0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2fbe0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
2fbf0 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20  r *zUser = 0;.  
2fc00 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20  char *zPasswd = 
2fc10 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64  0;.  int nPasswd
2fc20 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
2fc30 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
2fc40 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2fc50 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2fc60 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2fc70 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e   objv, "DB USERN
2fc80 41 4d 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a  AME PASSWORD");.
2fc90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2fca0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2fcb0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2fcc0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2fcd0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2fce0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2fcf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2fd00 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74   zUser = Tcl_Get
2fd10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2fd20 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c  .  zPasswd = Tcl
2fd30 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2fd40 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73  j(objv[3], &nPas
2fd50 73 77 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  swd);.  rc = sql
2fd60 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
2fd70 74 69 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72  ticate(db, zUser
2fd80 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73  , zPasswd, nPass
2fd90 77 64 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  wd);.  Tcl_SetRe
2fda0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2fdb0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2fdc0 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
2fdd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2fde0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2fdf0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2fe00 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23  ENTICATION */..#
2fe10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
2fe20 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2fe30 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2fe40 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64  sqlite3_user_add
2fe50 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
2fe60 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f  SWORD ISADMIN.*/
2fe70 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2fe80 5f 75 73 65 72 5f 61 64 64 28 0a 20 20 43 6c 69  _user_add(.  Cli
2fe90 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2fea0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2feb0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2fec0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2fed0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2fee0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2fef0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2ff00 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2ff10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ff20 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2ff30 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2ff40 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2ff50 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2ff60 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
2ff70 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
2ff80 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  zPasswd = 0;.  i
2ff90 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a  nt nPasswd = 0;.
2ffa0 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20    int isAdmin = 
2ffb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
2ffc0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2ffd0 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
2ffe0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2fff0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
30000 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45  jv, "DB USERNAME
30010 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
30020 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
30030 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
30040 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
30050 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
30060 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
30070 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
30080 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30090 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
300a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
300b0 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20  [2]);.  zPasswd 
300c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
300d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
300e0 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c  &nPasswd);.  Tcl
300f0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
30100 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
30110 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20  4], &isAdmin);. 
30120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
30130 65 72 5f 61 64 64 28 64 62 2c 20 7a 55 73 65 72  er_add(db, zUser
30140 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73  , zPasswd, nPass
30150 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20  wd, isAdmin);.  
30160 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
30170 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
30180 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
30190 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
301a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
301b0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
301c0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
301d0 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  ION */..#ifdef S
301e0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
301f0 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
30200 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
30210 5f 75 73 65 72 5f 63 68 61 6e 67 65 20 44 42 20  _user_change DB 
30220 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
30230 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61  D ISADMIN.*/.sta
30240 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65  tic int test_use
30250 72 5f 63 68 61 6e 67 65 28 0a 20 20 43 6c 69 65  r_change(.  Clie
30260 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
30270 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
30280 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
30290 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
302a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
302b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
302c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
302d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
302e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
302f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
30300 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
30310 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
30320 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
30330 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
30340 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
30350 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
30360 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20  t nPasswd = 0;. 
30370 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30   int isAdmin = 0
30380 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
30390 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
303a0 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20  ( objc!=5 ){.   
303b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
303c0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
303d0 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20  v, "DB USERNAME 
303e0 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
303f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
30400 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30410 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
30420 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
30430 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
30440 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
30450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30460 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c   }.  zUser = Tcl
30470 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
30480 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d  2]);.  zPasswd =
30490 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
304a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
304b0 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f  nPasswd);.  Tcl_
304c0 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
304d0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
304e0 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20  ], &isAdmin);.  
304f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
30500 72 5f 63 68 61 6e 67 65 28 64 62 2c 20 7a 55 73  r_change(db, zUs
30510 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61  er, zPasswd, nPa
30520 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a  sswd, isAdmin);.
30530 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
30540 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
30550 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
30560 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
30570 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
30580 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30590 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
305a0 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  ATION */..#ifdef
305b0 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
305c0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a  HENTICATION./*.*
305d0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
305e0 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 20 44  e3_user_delete D
305f0 42 20 55 53 45 52 4e 41 4d 45 0a 2a 2f 0a 73 74  B USERNAME.*/.st
30600 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 73  atic int test_us
30610 65 72 5f 64 65 6c 65 74 65 28 0a 20 20 43 6c 69  er_delete(.  Cli
30620 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
30630 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
30640 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
30650 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
30660 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
30670 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
30680 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
30690 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
306a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
306b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
306c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
306d0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
306e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
306f0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
30700 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
30710 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
30720 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
30730 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
30740 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
30750 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45  1, objv, "DB USE
30760 52 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  RNAME");.    ret
30770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30780 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
30790 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
307a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
307b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
307c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
307d0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
307e0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
307f0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d  objv[2]);.  rc =
30800 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65   sqlite3_user_de
30810 6c 65 74 65 28 64 62 2c 20 7a 55 73 65 72 29 3b  lete(db, zUser);
30820 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
30830 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
30840 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
30850 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
30860 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
30870 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
30880 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
30890 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CATION */../*.**
308a0 20 74 63 6c 63 6d 64 3a 20 62 61 64 5f 62 65 68   tclcmd: bad_beh
308b0 61 76 69 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a  avior TYPE.**.**
308c0 20 44 6f 20 73 6f 6d 65 20 74 68 69 6e 67 73 20   Do some things 
308d0 74 68 61 74 20 73 68 6f 75 6c 64 20 74 72 69 67  that should trig
308e0 67 65 72 20 61 20 76 61 6c 67 72 69 6e 64 20 6f  ger a valgrind o
308f0 72 20 2d 66 73 61 6e 69 74 69 7a 65 3d 75 6e 64  r -fsanitize=und
30900 65 66 69 6e 65 64 0a 2a 2a 20 77 61 72 6e 69 6e  efined.** warnin
30910 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
30920 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
30930 65 72 72 6f 72 73 20 61 6e 64 20 77 61 72 6e 69  errors and warni
30940 6e 67 73 20 6f 75 74 70 75 74 20 62 79 20 74 68  ngs output by th
30950 6f 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72 65  ose.** tools are
30960 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
30970 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a 2a   test scripts..*
30980 2a 0a 2a 2a 20 20 20 20 20 20 20 54 59 50 45 20  *.**       TYPE 
30990 20 20 20 20 20 20 42 45 48 41 56 49 4f 52 0a 2a        BEHAVIOR.*
309a0 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  *       1       
309b0 20 20 20 4f 76 65 72 66 6c 6f 77 20 61 20 73 69     Overflow a si
309c0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
309d0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
309e0 20 4a 75 6d 70 20 62 61 73 65 64 20 6f 6e 20 61   Jump based on a
309f0 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
30a00 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20  variable.**     
30a10 20 20 33 20 20 20 20 20 20 20 20 20 20 52 65 61    3          Rea
30a20 64 20 61 66 74 65 72 20 66 72 65 65 0a 2a 2a 20  d after free.** 
30a30 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
30a40 20 50 61 6e 69 63 0a 2a 2f 0a 73 74 61 74 69 63   Panic.*/.static
30a50 20 69 6e 74 20 74 65 73 74 5f 62 61 64 5f 62 65   int test_bad_be
30a60 68 61 76 69 6f 72 28 0a 20 20 43 6c 69 65 6e 74  havior(.  Client
30a70 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
30a80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
30a90 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 74 61 69  n integer contai
30aa0 6e 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 54  ning zero */.  T
30ab0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
30ac0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
30ad0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
30ae0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
30af0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
30b00 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
30b10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30b20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
30b30 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
30b40 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
30b50 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
30b60 0a 20 20 69 6e 74 20 69 54 79 70 65 3b 0a 20 20  .  int iType;.  
30b70 69 6e 74 20 78 79 7a 3b 0a 20 20 69 6e 74 20 69  int xyz;.  int i
30b80 20 3d 20 2a 28 69 6e 74 2a 29 63 6c 69 65 6e 74   = *(int*)client
30b90 44 61 74 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20  Data;.  int j;. 
30ba0 20 69 6e 74 20 77 5b 31 30 5d 3b 0a 20 20 69 6e   int w[10];.  in
30bb0 74 20 2a 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t *a;.  if( objc
30bc0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
30bd0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
30be0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 59  rp, 1, objv, "TY
30bf0 50 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  PE");.    return
30c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30c10 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
30c20 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
30c30 6f 62 6a 76 5b 31 5d 2c 20 26 69 54 79 70 65 29  objv[1], &iType)
30c40 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
30c50 52 4f 52 3b 0a 20 20 73 77 69 74 63 68 28 20 69  ROR;.  switch( i
30c60 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Type ){.    case
30c70 20 31 3a 20 7b 0a 20 20 20 20 20 20 78 79 7a 20   1: {.      xyz 
30c80 3d 20 30 78 37 66 66 66 66 66 30 30 20 2d 20 69  = 0x7fffff00 - i
30c90 3b 0a 20 20 20 20 20 20 78 79 7a 20 2b 3d 20 30  ;.      xyz += 0
30ca0 78 31 30 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f  x100;.      Tcl_
30cb0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
30cc0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
30cd0 62 6a 28 78 79 7a 29 29 3b 0a 20 20 20 20 20 20  bj(xyz));.      
30ce0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
30cf0 20 63 61 73 65 20 32 3a 20 7b 0a 20 20 20 20 20   case 2: {.     
30d00 20 77 5b 31 5d 20 3d 20 35 3b 0a 20 20 20 20 20   w[1] = 5;.     
30d10 20 69 66 28 20 77 5b 69 5d 3e 30 20 29 20 77 5b   if( w[i]>0 ) w[
30d20 31 5d 2b 2b 3b 0a 20 20 20 20 20 20 54 63 6c 5f  1]++;.      Tcl_
30d30 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
30d40 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
30d50 62 6a 28 77 5b 31 5d 29 29 3b 0a 20 20 20 20 20  bj(w[1]));.     
30d60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30d70 20 20 63 61 73 65 20 33 3a 20 7b 0a 20 20 20 20    case 3: {.    
30d80 20 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69    a = malloc( si
30d90 7a 65 6f 66 28 69 6e 74 29 2a 31 30 20 29 3b 0a  zeof(int)*10 );.
30da0 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
30db0 3c 31 30 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d  <10; j++) a[j] =
30dc0 20 6a 3b 0a 20 20 20 20 20 20 66 72 65 65 28 61   j;.      free(a
30dd0 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
30de0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
30df0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
30e00 61 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 62 72  a[i]));.      br
30e10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
30e20 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 54  ase 4: {.      T
30e30 63 6c 5f 50 61 6e 69 63 28 22 44 65 6c 69 62 65  cl_Panic("Delibe
30e40 72 61 74 65 20 70 61 6e 69 63 22 29 3b 0a 20 20  rate panic");.  
30e50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
30e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
30e70 4c 5f 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a  L_OK;.}  ../*.**
30e80 20 74 63 6c 63 6d 64 3a 20 20 20 72 65 67 69 73   tclcmd:   regis
30e90 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20  ter_dbstat_vtab 
30ea0 44 42 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 74  DB.**.** Cause t
30eb0 68 65 20 64 62 73 74 61 74 20 76 69 72 74 75 61  he dbstat virtua
30ec0 6c 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 76  l table to be av
30ed0 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 63  ailable on the c
30ee0 6f 6e 6e 65 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a  onnection DB.*/.
30ef0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
30f00 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f  register_dbstat_
30f10 76 74 61 62 28 0a 20 20 76 6f 69 64 20 2a 63 6c  vtab(.  void *cl
30f20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
30f30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
30f40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
30f50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
30f60 76 5b 5d 0a 29 7b 0a 23 69 66 64 65 66 20 53 51  v[].){.#ifdef SQ
30f70 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
30f80 4c 54 41 42 4c 45 0a 20 20 54 63 6c 5f 41 70 70  LTABLE.  Tcl_App
30f90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
30fa0 2c 20 22 64 62 73 74 61 74 20 6e 6f 74 20 61 76  , "dbstat not av
30fb0 61 69 6c 61 62 6c 65 20 62 65 63 61 75 73 65 20  ailable because 
30fc0 6f 66 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  of ".           
30fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30fe0 22 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  "SQLITE_OMIT_VIR
30ff0 54 55 41 4c 54 41 42 4c 45 22 2c 20 28 76 6f 69  TUALTABLE", (voi
31000 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  d*)0);.  return 
31010 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
31020 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74 65  .  struct Sqlite
31030 44 62 20 7b 20 73 71 6c 69 74 65 33 20 2a 64 62  Db { sqlite3 *db
31040 3b 20 7d 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62  ; };.  char *zDb
31050 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  ;.  Tcl_CmdInfo 
31060 63 6d 64 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  cmdInfo;..  if( 
31070 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
31080 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
31090 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
310a0 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
310b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
310c0 7d 0a 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  }..  zDb = Tcl_G
310d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
310e0 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
310f0 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
31100 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66  rp, zDb, &cmdInf
31110 6f 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  o) ){.    sqlite
31120 33 2a 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  3* db = ((struct
31130 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
31140 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
31150 29 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  )->db;.    sqlit
31160 65 33 44 62 73 74 61 74 52 65 67 69 73 74 65 72  e3DbstatRegister
31170 28 64 62 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (db);.  }.  retu
31180 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
31190 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
311a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f  _VIRTUALTABLE */
311b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
311c0 3a 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  :   sqlite3_db_c
311d0 6f 6e 66 69 67 20 44 42 20 53 45 54 54 49 4e 47  onfig DB SETTING
311e0 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76   VALUE.**.** Inv
311f0 6f 6b 65 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  oke sqlite3_db_c
31200 6f 6e 66 69 67 28 29 20 66 6f 72 20 6f 6e 65 20  onfig() for one 
31210 6f 66 20 74 68 65 20 73 65 74 74 69 6e 67 20 76  of the setting v
31220 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  alues..*/.static
31230 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65   int test_sqlite
31240 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a 20 20 76  3_db_config(.  v
31250 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c  oid *clientData,
31260 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
31270 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
31280 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
31290 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
312a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
312b0 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
312c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
312d0 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20 7d 20 61   int eVal;.  } a
312e0 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b 0a 20 20  Setting[] = {.  
312f0 20 20 7b 20 22 46 4b 45 59 22 2c 20 20 20 20 20    { "FKEY",     
31300 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
31310 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b  CONFIG_ENABLE_FK
31320 45 59 20 7d 2c 0a 20 20 20 20 7b 20 22 54 52 49  EY },.    { "TRI
31330 47 47 45 52 22 2c 20 20 20 20 20 20 20 20 20 53  GGER",         S
31340 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
31350 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 20 7d 2c  NABLE_TRIGGER },
31360 0a 20 20 20 20 7b 20 22 46 54 53 33 5f 54 4f 4b  .    { "FTS3_TOK
31370 45 4e 49 5a 45 52 22 2c 20 20 53 51 4c 49 54 45  ENIZER",  SQLITE
31380 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
31390 5f 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 20  _FTS3_TOKENIZER 
313a0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
313b0 0a 20 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73  .  int v;.  cons
313c0 74 20 63 68 61 72 20 2a 7a 53 65 74 74 69 6e 67  t char *zSetting
313d0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
313e0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
313f0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
31400 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
31410 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 45 54  1, objv, "DB SET
31420 54 49 4e 47 20 56 41 4c 55 45 22 29 3b 0a 20 20  TING VALUE");.  
31430 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31440 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
31450 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
31460 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
31470 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
31480 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
31490 4f 52 3b 0a 20 20 7a 53 65 74 74 69 6e 67 20 3d  OR;.  zSetting =
314a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
314b0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 73  bjv[2]);.  if( s
314c0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
314d0 53 51 4c 49 54 45 5f 2a 22 2c 20 7a 53 65 74 74  SQLITE_*", zSett
314e0 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69  ing)==0 ) zSetti
314f0 6e 67 20 2b 3d 20 37 3b 0a 20 20 69 66 28 20 73  ng += 7;.  if( s
31500 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22  qlite3_strglob("
31510 44 42 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53 65  DBCONFIG_*", zSe
31520 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
31530 74 69 6e 67 20 2b 3d 20 39 3b 0a 20 20 69 66 28  ting += 9;.  if(
31540 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
31550 28 22 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53 65  ("ENABLE_*", zSe
31560 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74  tting)==0 ) zSet
31570 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 66 6f 72  ting += 7;.  for
31580 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
31590 65 28 61 53 65 74 74 69 6e 67 29 3b 20 69 2b 2b  e(aSetting); i++
315a0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
315b0 70 28 7a 53 65 74 74 69 6e 67 2c 20 61 53 65 74  p(zSetting, aSet
315c0 74 69 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  ting[i].zName)==
315d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
315e0 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69 7a   if( i>=ArraySiz
315f0 65 28 61 53 65 74 74 69 6e 67 29 20 29 7b 0a 20  e(aSetting) ){. 
31600 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
31610 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20 20  ult(interp,.    
31620 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
31630 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69  bj("unknown sqli
31640 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 73 65  te3_db_config se
31650 74 74 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20  tting", -1));.  
31660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31670 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
31680 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
31690 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
316a0 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 54 43   &v) ) return TC
316b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
316c0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
316d0 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 65 56 61   aSetting[i].eVa
316e0 6c 2c 20 76 2c 20 26 76 29 3b 0a 20 20 54 63 6c  l, v, &v);.  Tcl
316f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
31700 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
31710 4f 62 6a 28 76 29 29 3b 0a 20 20 72 65 74 75 72  Obj(v));.  retur
31720 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
31730 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d  ** Register comm
31740 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43  ands with the TC
31750 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a  L interpreter..*
31760 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74  /.int Sqlitetest
31770 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  1_Init(Tcl_Inter
31780 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78  p *interp){.  ex
31790 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
317a0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20  _search_count;. 
317b0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
317c0 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b  te3_found_count;
317d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
317e0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
317f0 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
31800 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
31810 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _file_count;.  e
31820 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
31830 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20  3_sort_count;.  
31840 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31850 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b  e3_current_time;
31860 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
31870 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f  NIX && defined(_
31880 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
31890 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
318a0 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72  NG_STYLE.  exter
318b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  n int sqlite3_ho
318c0 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66  stid_num;.#endif
318d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
318e0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
318f0 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ze;.  extern int
31900 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61   sqlite3BtreeSha
31910 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 28 76  redCacheReport(v
31920 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20 20  oid*,.          
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31950 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c  Tcl_Interp*,int,
31960 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b  Tcl_Obj*CONST*);
31970 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 5a  .  static int iZ
31980 65 72 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  ero = 0;.  stati
31990 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  c struct {.     
319a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
319b0 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78    Tcl_CmdProc *x
319c0 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d  Proc;.  } aCmd[]
319d0 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f   = {.     { "db_
319e0 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  enter",         
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
31a00 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e  l_CmdProc*)db_en
31a10 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
31a20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f    },.     { "db_
31a30 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20 20  leave",         
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
31a50 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65  l_CmdProc*)db_le
31a60 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ave             
31a70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31a80 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
31a90 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
31aa0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31ab0 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20  e3_mprintf_int  
31ac0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31ad0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
31ae0 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54 63  64",         (Tc
31af0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31b00 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34  e3_mprintf_int64
31b10 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31b20 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
31b30 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  g",          (Tc
31b40 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31b50 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20  e3_mprintf_long 
31b60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31b70 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
31b80 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54 63  ",           (Tc
31b90 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31ba0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 20  e3_mprintf_str  
31bb0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31bc0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
31bd0 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63  r",          (Tc
31be0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31bf0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20  e3_snprintf_str 
31c00 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
31c10 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
31c20 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54 63  only",       (Tc
31c30 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31c40 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
31c50 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  ly},.     { "sql
31c60 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75  ite3_mprintf_dou
31c70 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54 63  ble",        (Tc
31c80 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31c90 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
31ca0 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  e },.     { "sql
31cb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61  ite3_mprintf_sca
31cc0 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54 63  led",        (Tc
31cd0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
31ce0 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65  e3_mprintf_scale
31cf0 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  d },.     { "sql
31d00 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
31d10 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f  double",   (Tcl_
31d20 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33  CmdProc*)sqlite3
31d30 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62  _mprintf_hexdoub
31d40 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  le},.     { "sql
31d50 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74  ite3_mprintf_z_t
31d60 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
31d70 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
31d80 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20 20  mprintf_z       
31d90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
31da0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65  te3_mprintf_n_te
31db0 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  st",        (Tcl
31dc0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d  _CmdProc*)test_m
31dd0 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20 20  printf_n        
31de0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31df0 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22  e3_snprintf_int"
31e00 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f  ,          (Tcl_
31e10 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e  CmdProc*)test_sn
31e20 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d  printf_int     }
31e30 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31e40 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
31e50 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f 43  wid",     (Tcl_C
31e60 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73  mdProc*)test_las
31e70 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d 2c  t_rowid       },
31e80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31e90 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20 20  _exec_printf",  
31ea0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
31eb0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
31ec0 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a  _printf      },.
31ed0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31ee0 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20 20  exec_hex",      
31ef0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
31f00 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f  Proc*)test_exec_
31f10 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  hex         },. 
31f20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
31f30 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  xec",           
31f40 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
31f50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20 20  roc*)test_exec  
31f60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
31f70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
31f80 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20 20  ec_nr",         
31f90 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
31fa0 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e 72  oc*)test_exec_nr
31fb0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
31fc0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31fd0 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20 20  _GET_TABLE.     
31fe0 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f 74  { "sqlite3_get_t
31ff0 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20 20  able_printf",   
32000 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
32010 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f  )test_get_table_
32020 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66  printf },.#endif
32030 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32040 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  _close",        
32050 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
32060 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
32070 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a  st_close     },.
32080 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32090 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20 20  close_v2",      
320a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
320b0 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73  Proc*)sqlite_tes
320c0 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20  t_close_v2  },. 
320d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
320e0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c  reate_function",
320f0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
32100 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
32110 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20  _function  },.  
32120 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72     { "sqlite3_cr
32130 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22 2c  eate_aggregate",
32140 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32150 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f  oc*)test_create_
32160 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20 20  aggregate },.   
32170 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67 69    { "sqlite_regi
32180 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
32190 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f  on", (Tcl_CmdPro
321a0 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65 72  c*)test_register
321b0 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20  _func    },.    
321c0 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72 74   { "sqlite_abort
321d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
321e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
321f0 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20 20  *)sqlite_abort  
32200 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
32210 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c  { "sqlite_bind",
32220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32230 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
32240 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20 20  )test_bind      
32250 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
32260 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20   "breakpoint",  
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32280 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32290 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20  test_breakpoint 
322a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
322b0 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20  "sqlite3_key",  
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
322d0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
322e0 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20 20  est_key         
322f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
32300 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c 20  sqlite3_rekey", 
32310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32320 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
32330 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20 20  st_rekey        
32340 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
32350 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 22  qlite_set_magic"
32360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
32370 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c  Tcl_CmdProc*)sql
32380 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20 20  ite_set_magic   
32390 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
323a0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 22  lite3_interrupt"
323b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54  ,             (T
323c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
323d0 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20 20  _interrupt      
323e0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
323f0 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74  ite_delete_funct
32400 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54 63  ion",        (Tc
32410 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
32420 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20 20  e_function      
32430 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32440 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  te_delete_collat
32450 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
32460 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65  _CmdProc*)delete
32470 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20  _collation      
32480 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32490 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
324a0 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f  t",        (Tcl_
324b0 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75 74  CmdProc*)get_aut
324c0 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 7d  ocommit        }
324d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
324e0 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20 20  3_stack_used",  
324f0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
32500 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74 61  mdProc*)test_sta
32510 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d 2c  ck_used       },
32520 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32530 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20  _busy_timeout", 
32540 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
32550 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79  dProc*)test_busy
32560 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a  _timeout     },.
32570 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c       { "printf",
32580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32590 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
325a0 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74  Proc*)test_print
325b0 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  f           },. 
325c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f      { "sqlite3Io
325d0 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20 20  Trace",         
325e0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
325f0 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  c*)test_io_trace
32600 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
32610 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69   { "clang_saniti
32620 7a 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20  ze_address",    
32630 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
32640 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65  *)clang_sanitize
32650 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b  _address },.  };
32660 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
32670 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e   {.     char *zN
32680 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62  ame;.     Tcl_Ob
32690 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b  jCmdProc *xProc;
326a0 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65  .     void *clie
326b0 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a  ntData;.  } aObj
326c0 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
326d0 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e   "sqlite3_db_con
326e0 66 69 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  fig",           
326f0 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64    test_sqlite3_d
32700 62 5f 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 20  b_config, 0 },. 
32710 20 20 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76      { "bad_behav
32720 69 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ior",           
32730 20 20 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f         test_bad_
32740 62 65 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64  behavior,  (void
32750 2a 29 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20  *)&iZero },.    
32760 20 7b 20 22 72 65 67 69 73 74 65 72 5f 64 62 73   { "register_dbs
32770 74 61 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20  tat_vtab",      
32780 20 20 20 20 74 65 73 74 5f 72 65 67 69 73 74 65      test_registe
32790 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d  r_dbstat_vtab  }
327a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
327b0 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69  3_connection_poi
327c0 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71  nter",    get_sq
327d0 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20  lite_pointer, 0 
327e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
327f0 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20  e3_bind_int",   
32800 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
32810 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30  bind_int,      0
32820 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32830 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
32840 62 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  b",         test
32850 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20  _bind_zeroblob, 
32860 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32870 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
32880 6f 62 36 34 22 2c 20 20 20 20 20 20 20 74 65 73  ob64",       tes
32890 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  t_bind_zeroblob6
328a0 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  4, 0 },.     { "
328b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
328c0 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  64",            
328d0 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c  test_bind_int64,
328e0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
328f0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f  "sqlite3_bind_do
32900 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  uble",          
32910 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
32920 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  e,   0 },.     {
32930 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e   "sqlite3_bind_n
32940 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ull",           
32950 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c    test_bind_null
32960 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
32970 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
32980 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20  text",          
32990 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78     test_bind_tex
329a0 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  t     ,0 },.    
329b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
329c0 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20 20  _text16",       
329d0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
329e0 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt16   ,0 },.   
329f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
32a00 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  d_blob",        
32a10 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62       test_bind_b
32a20 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  lob     ,0 },.  
32a30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
32a40 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
32a50 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  nt",  test_bind_
32a60 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c  parameter_count,
32a70 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
32a80 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
32a90 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  ter_name",   tes
32aa0 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
32ab0 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20  _name,  0},.    
32ac0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
32ad0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
32ae0 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ",  test_bind_pa
32af0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30  rameter_index, 0
32b00 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
32b10 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
32b20 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  s",        test_
32b30 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20  clear_bindings, 
32b40 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
32b50 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  te3_clear_bindin
32b60 67 73 5f 6e 75 6c 6c 22 2c 20 20 20 74 65 73 74  gs_null",   test
32b70 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 5f  _clear_bindings_
32b80 6e 75 6c 6c 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  null, 0},.     {
32b90 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
32ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32bb0 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
32bc0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
32bd0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
32be0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
32bf0 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
32c00 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
32c10 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
32c20 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20  nded_errcode",  
32c30 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63      test_ex_errc
32c40 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ode    ,0 },.   
32c50 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
32c60 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
32c70 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
32c80 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
32c90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
32ca0 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
32cb0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
32cc0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
32cd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
32ce0 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
32cf0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
32d00 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
32d10 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32d20 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
32d30 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
32d40 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
32d50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32d60 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20  _open_v2",      
32d70 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
32d80 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d  en_v2       ,0 }
32d90 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32da0 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
32db0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
32dc0 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
32dd0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
32de0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
32df0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
32e00 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
32e10 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32e20 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
32e30 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
32e40 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
32e50 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
32e60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
32e70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
32e80 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
32e90 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
32ea0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
32eb0 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
32ec0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
32ed0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
32ee0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
32ef0 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
32f00 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
32f10 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
32f20 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
32f30 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
32f40 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
32f50 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
32f60 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
32f70 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
32f80 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
32f90 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
32fa0 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
32fb0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
32fc0 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
32fd0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
32fe0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
32ff0 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
33000 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
33010 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
33020 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
33030 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
33040 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
33050 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
33060 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
33070 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
33080 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
33090 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
330a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
330b0 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
330c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
330d0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
330e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
330f0 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
33100 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
33110 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
33120 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33130 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
33140 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
33150 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
33160 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33170 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
33180 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
33190 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30  stmt_readonly ,0
331a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
331b0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20  te3_stmt_busy", 
331c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
331d0 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c  _stmt_busy     ,
331e0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65  0 },.     { "use
331f0 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c  s_stmt_journal",
33200 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
33210 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c  s_stmt_journal ,
33220 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
33230 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
33240 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65  mory",        te
33250 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
33260 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  y,     0},.     
33270 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  { "sqlite3_db_re
33280 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
33290 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61     test_db_relea
332a0 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a  se_memory,  0},.
332b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
332c0 64 62 5f 63 61 63 68 65 66 6c 75 73 68 22 2c 20  db_cacheflush", 
332d0 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
332e0 63 61 63 68 65 66 6c 75 73 68 2c 20 20 20 20 20  cacheflush,     
332f0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
33300 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
33310 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
33320 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20  t_db_filename,  
33330 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
33340 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61   "sqlite3_db_rea
33350 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20  donly",         
33360 20 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e    test_db_readon
33370 6c 79 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20  ly,        0},. 
33380 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
33390 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c  oft_heap_limit",
333a0 20 20 20 20 20 20 20 74 65 73 74 5f 73 6f 66 74         test_soft
333b0 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20  _heap_limit,    
333c0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
333d0 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
333e0 75 70 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  up",        test
333f0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c  _thread_cleanup,
33400 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
33410 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  "sqlite3_pager_r
33420 65 66 63 6f 75 6e 74 73 22 2c 20 20 20 20 20 20  efcounts",      
33430 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65 66 63   test_pager_refc
33440 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20  ounts,    0},.. 
33450 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
33460 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20  oad_extension", 
33470 20 20 20 20 20 20 20 74 65 73 74 5f 6c 6f 61 64         test_load
33480 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20  _extension,     
33490 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
334a0 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
334b0 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74  extension", test
334c0 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20  _enable_load,   
334d0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
334e0 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65  "sqlite3_extende
334f0 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c  d_result_codes",
33500 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72   test_extended_r
33510 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c  esult_codes, 0},
33520 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33530 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20 20  _limit",        
33540 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c 69           test_li
33550 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
33560 20 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b       0},..     {
33570 20 22 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74   "save_prng_stat
33580 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
33590 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
335a0 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  e,    0 },.     
335b0 7b 20 22 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  { "restore_prng_
335c0 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  state",         
335d0 20 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f     restore_prng_
335e0 73 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20  state, 0 },.    
335f0 20 7b 20 22 72 65 73 65 74 5f 70 72 6e 67 5f 73   { "reset_prng_s
33600 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  tate",          
33610 20 20 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73      reset_prng_s
33620 74 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20  tate,   0 },.   
33630 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6e 65    { "database_ne
33640 76 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20  ver_corrupt",   
33650 20 20 20 20 20 64 61 74 61 62 61 73 65 5f 6e 65       database_ne
33660 76 65 72 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c  ver_corrupt, 0},
33670 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
33680 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
33690 22 2c 20 20 20 20 20 20 20 64 61 74 61 62 61 73  ",       databas
336a0 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74  e_may_be_corrupt
336b0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70  , 0},.     { "op
336c0 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
336d0 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20 6f 70  ol",          op
336e0 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72  timization_contr
336f0 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54  ol,0},.#if SQLIT
33700 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20  E_OS_WIN.     { 
33710 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65  "lock_win32_file
33720 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33730 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
33740 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
33750 20 22 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70   "exists_win32_p
33760 61 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  ath",           
33770 20 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70    win32_exists_p
33780 61 74 68 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20  ath,  0 },.     
33790 7b 20 22 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69  { "find_win32_fi
337a0 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
337b0 20 20 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69     win32_find_fi
337c0 6c 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  le,    0 },.    
337d0 20 7b 20 22 64 65 6c 65 74 65 5f 77 69 6e 33 32   { "delete_win32
337e0 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  _file",         
337f0 20 20 20 20 77 69 6e 33 32 5f 64 65 6c 65 74 65      win32_delete
33800 5f 66 69 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20  _file,  0 },.   
33810 20 20 7b 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f    { "make_win32_
33820 64 69 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  dir",           
33830 20 20 20 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72       win32_mkdir
33840 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  ,        0 },.  
33850 20 20 20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e     { "remove_win
33860 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20  32_dir",        
33870 20 20 20 20 20 20 77 69 6e 33 32 5f 72 6d 64 69        win32_rmdi
33880 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  r,        0 },.#
33890 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63  endif.     { "tc
338a0 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20  l_objproc",     
338b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75                ru
338c0 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20  nAsObjProc,     
338d0 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20    0 },..     /* 
338e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a  sqlite3_column_*
338f0 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b  () API */.     {
33900 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
33910 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20  _count",        
33920 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f    test_column_co
33930 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  unt  ,0 },.     
33940 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  { "sqlite3_data_
33950 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
33960 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75     test_data_cou
33970 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt    ,0 },.    
33980 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
33990 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20  mn_type",       
339a0 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
339b0 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20  type   ,0 },.   
339c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
339d0 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20  umn_blob",      
339e0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
339f0 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20  _blob   ,0 },.  
33a00 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
33a10 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20  lumn_double",   
33a20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
33a30 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20  n_double ,0 },. 
33a40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
33a50 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20  olumn_int64",   
33a60 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
33a70 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a  mn_int64  ,0 },.
33a80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33a90 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20  column_text",   
33aa0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20  test_stmt_utf8, 
33ab0 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
33ac0 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20  column_text },. 
33ad0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
33ae0 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74  olumn_name",   t
33af0 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20  est_stmt_utf8,  
33b00 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33b10 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20  olumn_name },.  
33b20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
33b30 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65  lumn_int",    te
33b40 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28  st_stmt_int,   (
33b50 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
33b60 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20  lumn_int  },.   
33b70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
33b80 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73  umn_bytes",  tes
33b90 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76  t_stmt_int,   (v
33ba0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
33bb0 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e  umn_bytes},.#ifn
33bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33bd0 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20  DECLTYPE.     { 
33be0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
33bf0 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73  decltype",test_s
33c00 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
33c10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
33c20 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66  ecltype},.#endif
33c30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
33c40 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
33c50 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33  ADATA.{ "sqlite3
33c60 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
33c70 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
33c80 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
33c90 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
33ca0 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73  base_name},.{ "s
33cb0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
33cc0 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73  ble_name",test_s
33cd0 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
33ce0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
33cf0 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73  able_name},.{ "s
33d00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
33d10 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f  igin_name",test_
33d20 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a  stmt_utf8,(void*
33d30 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
33d40 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65  origin_name},.#e
33d50 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
33d60 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
33d70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33d80 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c  column_bytes16",
33d90 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20   test_stmt_int, 
33da0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
33db0 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c  olumn_bytes16 },
33dc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33dd0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c  _column_text16",
33de0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
33df0 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
33e00 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d  3_column_text16}
33e10 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33e20 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22  3_column_name16"
33e30 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ,  test_stmt_utf
33e40 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
33e50 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36  e3_column_name16
33e60 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61  },.     { "add_a
33e70 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
33e80 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61  llations", add_a
33e90 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
33ea0 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20  llations, 0     
33eb0 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   },.#ifndef SQLI
33ec0 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45  TE_OMIT_DECLTYPE
33ed0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33ee0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
33ef0 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  16",test_stmt_ut
33f00 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  f16,(void*)sqlit
33f10 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
33f20 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69  pe16},.#endif.#i
33f30 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
33f40 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
33f50 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  TA.{"sqlite3_col
33f60 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
33f70 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d  e16",.  test_stm
33f80 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
33f90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
33fa0 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c  atabase_name16},
33fb0 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
33fc0 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c  n_table_name16",
33fd0 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
33fe0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
33ff0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
34000 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33  me16},.{"sqlite3
34010 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
34020 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d  ame16", test_stm
34030 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
34040 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
34050 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23  rigin_name16},.#
34060 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20  endif.#endif.   
34070 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
34080 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
34090 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63  ", test_create_c
340a0 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d  ollation_v2, 0 }
340b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
340c0 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
340d0 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62  ",     test_glob
340e0 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20  al_recover, 0   
340f0 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69  },.     { "worki
34100 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20  ng_64bit_int",  
34110 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f          working_
34120 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20  64bit_int,   0  
34130 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
34140 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20  unlink_test",   
34150 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c           vfs_unl
34160 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20  ink_test,     0 
34170 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
34180 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c  _initfail_test",
34190 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e            vfs_in
341a0 69 74 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30  itfail_test,   0
341b0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
341c0 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
341d0 22 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 75  ",         vfs_u
341e0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20  nregister_all,  
341f0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
34200 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
34210 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f  l",         vfs_
34220 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20  reregister_all, 
34230 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
34240 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73  file_control_tes
34250 74 22 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c  t",          fil
34260 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20  e_control_test, 
34270 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
34280 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61  "file_control_la
34290 73 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66  sterrno_test", f
342a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
342b0 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20  errno_test,  0  
342c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
342d0 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
342e0 78 79 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  xy_test", file_c
342f0 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
34300 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23  _test,  0   },.#
34310 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
34320 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
34330 74 72 6f 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65  trol_truncate_te
34340 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  st", file_contro
34350 6c 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74 2c  l_truncate_test,
34360 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
34370 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65  "file_control_re
34380 70 6c 61 63 65 5f 74 65 73 74 22 2c 20 66 69 6c  place_test", fil
34390 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63  e_control_replac
343a0 65 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a  e_test,  0   },.
343b0 23 65 6e 64 69 66 20 0a 20 20 20 20 20 7b 20 22  #endif .     { "
343c0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
343d0 6e 6b 73 69 7a 65 5f 74 65 73 74 22 2c 20 66 69  nksize_test", fi
343e0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
343f0 73 69 7a 65 5f 74 65 73 74 2c 20 20 30 20 20 20  size_test,  0   
34400 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
34410 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74  control_sizehint
34420 5f 74 65 73 74 22 2c 20 20 66 69 6c 65 5f 63 6f  _test",  file_co
34430 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
34440 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 23 69  est,   0   },.#i
34450 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
34460 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
34470 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
34480 74 72 79 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  try", file_contr
34490 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
344a0 79 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  y,  0   },.     
344b0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
344c0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
344d0 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ", file_control_
344e0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
344f0 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20  , 0  },.#endif. 
34500 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
34510 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 22  rol_persist_wal"
34520 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  ,    file_contro
34530 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 2c 20 20  l_persist_wal,  
34540 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
34550 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70   "file_control_p
34560 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69  owersafe_overwri
34570 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te",file_control
34580 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
34590 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20 20 7b 20  rite,0},.     { 
345a0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66  "file_control_vf
345b0 73 6e 61 6d 65 22 2c 20 20 20 20 20 20 20 20 66  sname",        f
345c0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e  ile_control_vfsn
345d0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 30 20 20  ame,         0  
345e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
345f0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c  _control_tempfil
34600 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c 65 5f 63  ename",   file_c
34610 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
34620 61 6d 65 2c 20 20 20 20 30 20 20 20 7d 2c 0a 20  ame,    0   },. 
34630 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 76      { "sqlite3_v
34640 66 73 5f 6c 69 73 74 22 2c 20 20 20 20 20 20 20  fs_list",       
34650 20 20 20 20 76 66 73 5f 6c 69 73 74 2c 20 20 20      vfs_list,   
34660 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
34670 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
34680 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c 20 74 65  function_v2", te
34690 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
346a0 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
346b0 20 7b 20 22 70 61 74 68 5f 69 73 5f 6c 6f 63 61   { "path_is_loca
346c0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
346d0 20 70 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 2c 20   path_is_local, 
346e0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
346f0 70 61 74 68 5f 69 73 5f 64 6f 73 22 2c 20 20 20  path_is_dos",   
34700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
34710 68 5f 69 73 5f 64 6f 73 2c 20 20 30 20 20 20 7d  h_is_dos,  0   }
34720 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
34730 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
34740 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
34750 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
34760 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
34770 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
34780 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
34790 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
347a0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
347b0 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
347c0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
347d0 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
347e0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
347f0 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
34800 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
34810 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
34820 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 75 74 66   { "add_test_utf
34830 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20  16bin_collate", 
34840 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e     test_utf16bin
34850 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
34860 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20     },.#endif.   
34870 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73    { "sqlite3_tes
34880 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74  t_errstr",     t
34890 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20  est_errstr, 0   
348a0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
348b0 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c    { "tcl_variabl
348c0 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74  e_type",       t
348d0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
348e0 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66  , 0       },.#if
348f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34900 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
34910 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
34920 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
34930 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  e", test_enable_
34940 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20  shared, 0  },.  
34950 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68     { "sqlite3_sh
34960 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72  ared_cache_repor
34970 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  t", sqlite3Btree
34980 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
34990 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  t, 0},.#endif.  
349a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
349b0 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22  bversion_number"
349c0 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  , test_libversio
349d0 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a  n_number, 0  },.
349e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
349f0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
34a00 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62  adata", test_tab
34a10 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
34a20 74 61 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  ta, 0  },.#ifnde
34a30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
34a40 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
34a50 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
34a60 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 72  en", test_blob_r
34a70 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a 23 65 6e  eopen, 0  },.#en
34a80 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63  dif.     { "pcac
34a90 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20  he_stats",      
34aa0 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
34ab0 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  ts, 0  },.#ifdef
34ac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
34ad0 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20  NLOCK_NOTIFY.   
34ae0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c    { "sqlite3_unl
34af0 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73  ock_notify", tes
34b00 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c  t_unlock_notify,
34b10 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
34b20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
34b30 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20  l_checkpoint",  
34b40 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70   test_wal_checkp
34b50 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20  oint, 0  },.    
34b60 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
34b70 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74  checkpoint_v2",t
34b80 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
34b90 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20  nt_v2, 0  },.   
34ba0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c    { "sqlite3_wal
34bb0 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22  _autocheckpoint"
34bc0 2c 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68  ,test_wal_autoch
34bd0 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a  eckpoint, 0  },.
34be0 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c       { "test_sql
34bf0 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20  ite3_log",      
34c00 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f     test_sqlite3_
34c10 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64  log, 0  },.#ifnd
34c20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
34c30 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70  XPLAIN.     { "p
34c40 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65  rint_explain_que
34c50 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70  ry_plan", test_p
34c60 72 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a  rint_eqp, 0  },.
34c70 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
34c80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
34c90 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f  rol", test_test_
34ca0 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53  control },.#if S
34cb0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20  QLITE_OS_UNIX.  
34cc0 20 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22     { "getrusage"
34cd0 2c 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65  , test_getrusage
34ce0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
34cf0 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65  { "load_static_e
34d00 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f  xtension", tclLo
34d10 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
34d20 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22  nCmd },.     { "
34d30 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65  sorter_test_fake
34d40 68 65 61 70 22 2c 20 73 6f 72 74 65 72 5f 74 65  heap", sorter_te
34d50 73 74 5f 66 61 6b 65 68 65 61 70 20 7d 2c 0a 20  st_fakeheap },. 
34d60 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65      { "sorter_te
34d70 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 22  st_sort4_helper"
34d80 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f  , sorter_test_so
34d90 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c 0a 23 69  rt4_helper },.#i
34da0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
34db0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
34dc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34dd0 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
34de0 65 22 2c 20 74 65 73 74 5f 75 73 65 72 5f 61 75  e", test_user_au
34df0 74 68 65 6e 74 69 63 61 74 65 2c 20 30 20 7d 2c  thenticate, 0 },
34e00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34e10 5f 75 73 65 72 5f 61 64 64 22 2c 20 20 20 20 20  _user_add",     
34e20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f 61       test_user_a
34e30 64 64 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  dd,          0 }
34e40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34e50 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 22 2c 20  3_user_change", 
34e60 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f        test_user_
34e70 63 68 61 6e 67 65 2c 20 20 20 20 20 20 20 30 20  change,       0 
34e80 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34e90 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 22 2c  e3_user_delete",
34ea0 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72         test_user
34eb0 5f 64 65 6c 65 74 65 2c 20 20 20 20 20 20 20 30  _delete,       0
34ec0 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   },.#endif.#ifde
34ed0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
34ee0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
34ef0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34f00 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 22  stmt_scanstatus"
34f10 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
34f20 74 5f 73 63 61 6e 73 74 61 74 75 73 2c 20 20 20  t_scanstatus,   
34f30 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
34f40 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
34f50 61 74 75 73 5f 72 65 73 65 74 22 2c 20 74 65 73  atus_reset", tes
34f60 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
34f70 73 5f 72 65 73 65 74 2c 20 20 20 30 20 7d 2c 0a  s_reset,   0 },.
34f80 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
34f90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
34fa0 4f 47 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  OG.     { "sqlit
34fb0 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67  e3_config_sqllog
34fc0 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
34fd0 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 2c 20 20  config_sqllog,  
34fe0 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20   0 },.#endif.   
34ff0 20 20 7b 20 22 76 66 73 5f 63 75 72 72 65 6e 74    { "vfs_current
35000 5f 74 69 6d 65 5f 69 6e 74 36 34 22 2c 20 20 20  _time_int64",   
35010 20 20 20 20 20 20 20 20 76 66 73 43 75 72 72 65          vfsCurre
35020 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 30  ntTimeInt64,   0
35030 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
35040 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
35050 54 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  T.     { "sqlite
35060 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 22 2c  3_snapshot_get",
35070 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67   test_snapshot_g
35080 65 74 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  et, 0 },.     { 
35090 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  "sqlite3_snapsho
350a0 74 5f 6f 70 65 6e 22 2c 20 74 65 73 74 5f 73 6e  t_open", test_sn
350b0 61 70 73 68 6f 74 5f 6f 70 65 6e 2c 20 30 20 7d  apshot_open, 0 }
350c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
350d0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 22  3_snapshot_free"
350e0 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f  , test_snapshot_
350f0 66 72 65 65 2c 20 30 20 7d 2c 0a 23 65 6e 64 69  free, 0 },.#endi
35100 66 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  f.  };.  static 
35110 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65  int bitmask_size
35120 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73   = sizeof(Bitmas
35130 6b 29 2a 38 3b 0a 20 20 73 74 61 74 69 63 20 69  k)*8;.  static i
35140 6e 74 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69  nt longdouble_si
35150 7a 65 20 3d 20 73 69 7a 65 6f 66 28 4c 4f 4e 47  ze = sizeof(LONG
35160 44 4f 55 42 4c 45 5f 54 59 50 45 29 3b 0a 20 20  DOUBLE_TYPE);.  
35170 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20  int i;.  extern 
35180 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
35190 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f  _count, sqlite3_
351a0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a  fullsync_count;.
351b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
351c0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
351d0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
351e0 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63  t sqlite3_like_c
351f0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
35200 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  nt sqlite3_xfero
35210 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  pt_count;.  exte
35220 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
35230 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
35240 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
35250 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
35260 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65  itedb_count;.  e
35270 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
35280 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
35290 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45  ount;.#if SQLITE
352a0 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e  _OS_WIN.  extern
352b0 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73   LONG volatile s
352c0 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a  qlite3_os_type;.
352d0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
352e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74  LITE_DEBUG.  ext
352f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
35300 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74  hereTrace;.  ext
35310 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f  ern int sqlite3O
35320 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e  STrace;.  extern
35330 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54   int sqlite3WalT
35340 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66  race;.#endif.#if
35350 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
35360 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
35370 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65  ABLE_FTS3.  exte
35380 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
35390 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e  ts3_enable_paren
353a0 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23  theses;.#endif.#
353b0 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30  endif..  for(i=0
353c0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29  ; i<sizeof(aCmd)
353d0 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29  /sizeof(aCmd[0])
353e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
353f0 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e  CreateCommand(in
35400 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e  terp, aCmd[i].zN
35410 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72  ame, aCmd[i].xPr
35420 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  oc, 0, 0);.  }. 
35430 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
35440 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65  of(aObjCmd)/size
35450 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20  of(aObjCmd[0]); 
35460 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
35470 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
35480 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69  nterp, aObjCmd[i
35490 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
354a0 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72    aObjCmd[i].xPr
354b0 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63  oc, aObjCmd[i].c
354c0 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20  lientData, 0);. 
354d0 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72   }.  Tcl_LinkVar
354e0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
354f0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20  _search_count", 
35500 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35510 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
35520 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
35530 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
35540 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
35550 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20  e_found_count", 
35560 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35570 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75  qlite3_found_cou
35580 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
35590 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
355a0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
355b0 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20  _sort_count", . 
355c0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
355d0 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c  ite3_sort_count,
355e0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
355f0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
35600 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d  terp, "sqlite3_m
35610 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20  ax_blobsize", . 
35620 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
35630 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
35640 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  e, TCL_LINK_INT)
35650 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
35660 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
35670 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  like_count", .  
35680 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
35690 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20  te3_like_count, 
356a0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
356b0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
356c0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e 74  erp, "sqlite_int
356d0 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20 0a  errupt_count", .
356e0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
356f0 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f  lite3_interrupt_
35700 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
35710 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
35720 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35730 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  ite_open_file_co
35740 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
35750 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
35760 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54 43  n_file_count, TC
35770 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
35780 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
35790 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72 65  p, "sqlite_curre
357a0 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20 20  nt_time", .     
357b0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
357c0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20 54  _current_time, T
357d0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69  CL_LINK_INT);.#i
357e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
357f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
35800 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
35810 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
35820 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b  STYLE.  Tcl_Link
35830 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
35840 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22 2c  ite_hostid_num",
35850 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
35860 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
35870 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  um, TCL_LINK_INT
35880 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f  );.#endif.  Tcl_
35890 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
358a0 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74  "sqlite3_xferopt
358b0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
358c0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 78  char*)&sqlite3_x
358d0 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54 43  feropt_count, TC
358e0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
358f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
35900 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65  p, "sqlite3_page
35910 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22 2c  r_readdb_count",
35920 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
35930 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
35940 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ddb_count, TCL_L
35950 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
35960 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
35970 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
35980 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a 20  ritedb_count",. 
35990 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
359a0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
359b0 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  db_count, TCL_LI
359c0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
359d0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
359e0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
359f0 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  itej_count",.   
35a00 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
35a10 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
35a20 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
35a30 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  INT);.#ifndef SQ
35a40 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
35a50 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
35a60 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65 64  terp, "unaligned
35a70 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 22  _string_counter"
35a80 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
35a90 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
35aa0 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c 49  _counter, TCL_LI
35ab0 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a  NK_INT);.#endif.
35ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35ad0 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f  MIT_UTF16.  Tcl_
35ae0 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
35af0 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65 65  "sqlite_last_nee
35b00 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a  ded_collation",.
35b10 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70 7a        (char*)&pz
35b20 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c  NeededCollation,
35b30 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47   TCL_LINK_STRING
35b40 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f  |TCL_LINK_READ_O
35b50 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  NLY);.#endif.#if
35b60 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
35b70 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
35b80 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
35b90 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63 68  type",.      (ch
35ba0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73 5f  ar*)&sqlite3_os_
35bb0 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 4c  type, TCL_LINK_L
35bc0 4f 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ONG);.#endif.#if
35bd0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
35be0 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63    {.    static c
35bf0 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65 72 79  onst char *query
35c00 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53  _plan = "*** OBS
35c10 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45 20 2a  OLETE VARIABLE *
35c20 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 6e  **";.    Tcl_Lin
35c30 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
35c40 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e 22  lite_query_plan"
35c50 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72 2a 29  ,.       (char*)
35c60 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43 4c  &query_plan, TCL
35c70 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
35c80 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
35c90 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
35ca0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
35cb0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
35cc0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 77  nterp, "sqlite_w
35cd0 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20 20  here_trace",.   
35ce0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
35cf0 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54 43  e3WhereTrace, TC
35d00 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
35d10 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
35d20 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 72  p, "sqlite_os_tr
35d30 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
35d40 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72 61  r*)&sqlite3OSTra
35d50 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
35d60 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
35d70 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63 6c  E_OMIT_WAL.  Tcl
35d80 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
35d90 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72 61   "sqlite_wal_tra
35da0 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ce",.      (char
35db0 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72 61  *)&sqlite3WalTra
35dc0 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ce, TCL_LINK_INT
35dd0 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  );.#endif.#endif
35de0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35df0 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54 63  OMIT_DISKIO.  Tc
35e00 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
35e10 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74 65  , "sqlite_opente
35e20 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  mp_count",.     
35e30 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
35e40 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c  _opentemp_count,
35e50 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
35e60 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e  #endif.  Tcl_Lin
35e70 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
35e80 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
35e90 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20 28  _value",.      (
35ea0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74  char*)&sqlite_st
35eb0 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
35ec0 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47   TCL_LINK_STRING
35ed0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
35ee0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35ef0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
35f00 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  te",.      (char
35f10 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
35f20 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43 4c  _bind_nbyte, TCL
35f30 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
35f40 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
35f50 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64  , "sqlite_temp_d
35f60 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20  irectory",.     
35f70 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
35f80 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 2c  _temp_directory,
35f90 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47   TCL_LINK_STRING
35fa0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
35fb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
35fc0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 22  _data_directory"
35fd0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
35fe0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
35ff0 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b  ectory, TCL_LINK
36000 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
36010 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36020 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a  "bitmask_size",.
36030 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62 69        (char*)&bi
36040 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f  tmask_size, TCL_
36050 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e  LINK_INT|TCL_LIN
36060 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20  K_READ_ONLY);.  
36070 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
36080 72 70 2c 20 22 6c 6f 6e 67 64 6f 75 62 6c 65 5f  rp, "longdouble_
36090 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68  size",.      (ch
360a0 61 72 2a 29 26 6c 6f 6e 67 64 6f 75 62 6c 65 5f  ar*)&longdouble_
360b0 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  size, TCL_LINK_I
360c0 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NT|TCL_LINK_READ
360d0 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69  _ONLY);.  Tcl_Li
360e0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
360f0 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75 6e 74  qlite_sync_count
36100 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
36110 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f  &sqlite3_sync_co
36120 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
36130 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
36140 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
36150 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  e_fullsync_count
36160 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
36170 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e  &sqlite3_fullsyn
36180 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  c_count, TCL_LIN
36190 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65 66 69  K_INT);.#if defi
361a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
361b0 45 5f 46 54 53 33 29 20 26 26 20 64 65 66 69 6e  E_FTS3) && defin
361c0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
361d0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
361e0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 74  terp, "sqlite_ft
361f0 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
36200 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20 28 63  heses",.      (c
36210 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 74  har*)&sqlite3_ft
36220 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74  s3_enable_parent
36230 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  heses, TCL_LINK_
36240 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  INT);.#endif.  r
36250 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.