/ Hex Artifact Content
Login

Artifact 0fcf7ae97001ced91bfbfaf738e9689779d9bf61:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ata;.  sqlite3_s
0910: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
0920: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 70 22  Buf), zBuf, "%p"
0930: 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 54 63 6c 5f  , p->db);.  Tcl_
0940: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0950: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0970: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
0980: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
0990: 73 71 6c 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a  sqlite3 object..
09a0: 2a 2f 0a 69 6e 74 20 67 65 74 44 62 50 6f 69 6e  */.int getDbPoin
09b0: 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ter(Tcl_Interp *
09c0: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68  interp, const ch
09d0: 61 72 20 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20  ar *zA, sqlite3 
09e0: 2a 2a 70 70 44 62 29 7b 0a 20 20 73 74 72 75 63  **ppDb){.  struc
09f0: 74 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20  t SqliteDb *p;. 
0a00: 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64   Tcl_CmdInfo cmd
0a10: 49 6e 66 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f  Info;.  if( Tcl_
0a20: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
0a30: 6e 74 65 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49  nterp, zA, &cmdI
0a40: 6e 66 6f 29 20 29 7b 0a 20 20 20 20 70 20 3d 20  nfo) ){.    p = 
0a50: 28 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  (struct SqliteDb
0a60: 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  *)cmdInfo.objCli
0a70: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 2a 70 70  entData;.    *pp
0a80: 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65  Db = p->db;.  }e
0a90: 6c 73 65 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d  lse{.    *ppDb =
0aa0: 20 28 73 71 6c 69 74 65 33 2a 29 73 71 6c 69 74   (sqlite3*)sqlit
0ab0: 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28  e3TestTextToPtr(
0ac0: 7a 41 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  zA);.  }.  retur
0ad0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
0ae0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
0af0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 57 69  *.** Decode a Wi
0b00: 6e 33 32 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63  n32 HANDLE objec
0b10: 74 2e 0a 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e  t..*/.int getWin
0b20: 33 32 48 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74  32Handle(Tcl_Int
0b30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e  erp *interp, con
0b40: 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48  st char *zA, LPH
0b50: 41 4e 44 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20  ANDLE phFile){. 
0b60: 20 2a 70 68 46 69 6c 65 20 3d 20 28 48 41 4e 44   *phFile = (HAND
0b70: 4c 45 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  LE)sqlite3TestTe
0b80: 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72  xtToPtr(zA);.  r
0b90: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
0ba0: 23 65 6e 64 69 66 0a 0a 65 78 74 65 72 6e 20 63  #endif..extern c
0bb0: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
0bc0: 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a  e3ErrName(int);.
0bd0: 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f 72 4e  #define t1ErrorN
0be0: 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ame sqlite3ErrNa
0bf0: 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  me../*.** Conver
0c00: 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d  t an sqlite3_stm
0c10: 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74  t* into an sqlit
0c20: 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70 65 6e  e3*.  This depen
0c30: 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63  ds on the.** fac
0c40: 74 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  t that the sqlit
0c50: 65 33 2a 20 69 73 20 74 68 65 20 66 69 72 73 74  e3* is the first
0c60: 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 56 64   field in the Vd
0c70: 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  be structure..*/
0c80: 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54 6f 44  .#define StmtToD
0c90: 62 28 58 29 20 20 20 73 71 6c 69 74 65 33 5f 64  b(X)   sqlite3_d
0ca0: 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a  b_handle(X)../*.
0cb0: 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74 75 72  ** Check a retur
0cc0: 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20  n value to make 
0cd0: 73 75 72 65 20 69 74 20 61 67 72 65 65 73 20 77  sure it agrees w
0ce0: 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ith the results.
0cf0: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ** from sqlite3_
0d00: 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  errcode..*/.int 
0d10: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
0d20: 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  de(Tcl_Interp *i
0d30: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 20 2a  nterp, sqlite3 *
0d40: 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20 69  db, int rc){.  i
0d50: 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  f( sqlite3_threa
0d60: 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20 72 63  dsafe()==0 && rc
0d70: 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  !=SQLITE_MISUSE 
0d80: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  && rc!=SQLITE_OK
0d90: 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 65  .   && sqlite3_e
0da0: 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63 20 29  rrcode(db)!=rc )
0db0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
0dc0: 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32  200];.    int r2
0dd0: 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
0de0: 64 65 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  de(db);.    sqli
0df0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
0e00: 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
0e10: 0a 20 20 20 20 20 20 20 22 65 72 72 6f 72 20 63  .       "error c
0e20: 6f 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73  ode %s (%d) does
0e30: 20 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74   not match sqlit
0e40: 65 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25  e3_errcode %s (%
0e50: 64 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72  d)",.       t1Er
0e60: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c  rorName(rc), rc,
0e70: 20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29   t1ErrorName(r2)
0e80: 2c 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52  , r2);.    Tcl_R
0e90: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
0ea0: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  p);.    Tcl_Appe
0eb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
0ec0: 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72   zBuf, 0);.    r
0ed0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
0ee0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
0ef0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
0f00: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
0f10: 5f 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  _stmt object..*/
0f20: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53  .static int getS
0f30: 74 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63  tmtPointer(.  Tc
0f40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0f50: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
0f60: 2a 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74  *zArg,  .  sqlit
0f70: 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74  e3_stmt **ppStmt
0f80: 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20  .){.  *ppStmt = 
0f90: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73  (sqlite3_stmt*)s
0fa0: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0fb0: 50 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74  Ptr(zArg);.  ret
0fc0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
0fd0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
0fe0: 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74  text representat
0ff0: 69 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ion of a pointer
1000: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64   that can be und
1010: 65 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68  erstood.** by th
1020: 65 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61  e getDbPointer a
1030: 6e 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20  nd getVmPointer 
1040: 72 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a  routines above..
1050: 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65  **.** The proble
1060: 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61  m is, on some ma
1070: 63 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29  chines (Solaris)
1080: 20 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69   if you do a pri
1090: 6e 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22  ntf with.** "%p"
10a0: 20 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e   you cannot turn
10b0: 20 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61   around and do a
10c0: 20 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20   scanf with the 
10d0: 73 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a  same "%p" and.**
10e0: 20 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65   get your pointe
10f0: 72 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76  r back.  You hav
1100: 65 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22  e to prepend a "
1110: 30 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69  0x" before it wi
1120: 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20  ll.** work.  Or 
1130: 61 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73  at least that is
1140: 20 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65   what is reporte
1150: 64 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20  d to me (drh).  
1160: 42 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61  But this.** beha
1170: 76 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d  vior varies from
1180: 20 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68   machine to mach
1190: 69 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69  ine.  The soluti
11a0: 6f 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a  on used her is.*
11b0: 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74  * to test the st
11c0: 72 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72  ring right after
11d0: 20 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64   it is generated
11e0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61   to see if it ca
11f0: 6e 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f  n be.** understo
1200: 6f 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64  od by scanf, and
1210: 20 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65   if not, try pre
1220: 70 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20  pending an "0x" 
1230: 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61  to see if.** tha
1240: 74 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74  t helps.  If not
1250: 68 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61  hing works, a fa
1260: 74 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e  tal error is gen
1270: 65 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  erated..*/.int s
1280: 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1290: 69 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74  interStr(Tcl_Int
12a0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61  erp *interp, cha
12b0: 72 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70  r *zPtr, void *p
12c0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ){.  sqlite3_snp
12d0: 72 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c  rintf(100, zPtr,
12e0: 20 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74   "%p", p);.  ret
12f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1300: 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63  *.** The callbac
1310: 6b 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71  k routine for sq
1320: 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
1330: 66 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f()..*/.static i
1340: 6e 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  nt exec_printf_c
1350: 62 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  b(void *pArg, in
1360: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
1370: 72 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65  rgv, char **name
1380: 29 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ){.  Tcl_DString
1390: 20 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74   *str = (Tcl_DSt
13a0: 72 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ring*)pArg;.  in
13b0: 74 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f  t i;..  if( Tcl_
13c0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74  DStringLength(st
13d0: 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  r)==0 ){.    for
13e0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
13f0: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  +){.      Tcl_DS
1400: 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65  tringAppendEleme
1410: 6e 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20  nt(str, name[i] 
1420: 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c  ? name[i] : "NUL
1430: 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  L");.    }.  }. 
1440: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1450: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
1460: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65  DStringAppendEle
1470: 6d 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69  ment(str, argv[i
1480: 5d 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e  ] ? argv[i] : "N
1490: 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ULL");.  }.  ret
14a0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
14b0: 54 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  The I/O tracing 
14c0: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66  callback..*/.#if
14d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14e0: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20  _OMIT_TRACE) && 
14f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1500: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73  NABLE_IOTRACE).s
1510: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
1520: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74  ace_file = 0;.st
1530: 61 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61  atic void io_tra
1540: 63 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  ce_callback(cons
1550: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1560: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1570: 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1580: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1590: 76 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  vfprintf(iotrace
15a0: 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  _file, zFormat, 
15b0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
15c0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72  );.  fflush(iotr
15d0: 61 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e  ace_file);.}.#en
15e0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  dif../*.** Usage
15f0: 3a 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45  :  io_trace FILE
1600: 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20  NAME.**.** Turn 
1610: 49 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f  I/O tracing on o
1620: 72 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e  r off.  If FILEN
1630: 41 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d  AME is not an em
1640: 70 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49  pty string,.** I
1650: 2f 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e  /O tracing begin
1660: 73 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c  s going into FIL
1670: 45 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41  ENAME. If FILENA
1680: 4d 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a  ME is an empty.*
1690: 2a 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72  * string, I/O tr
16a0: 61 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  acing is turned 
16b0: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
16c0: 6e 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65  nt test_io_trace
16d0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
16e0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
16f0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1700: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1710: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1720: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1730: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1750: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1760: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1780: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1790: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ment */.){.#if !
17a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
17b0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
17c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17d0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69  BLE_IOTRACE).  i
17e0: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
17f0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1800: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1810: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1820: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1830: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49  ,.          " FI
1840: 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20  LENAME\"", 0);. 
1850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1860: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  ROR;.  }.  if( i
1870: 6f 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20  otrace_file ){. 
1880: 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66     if( iotrace_f
1890: 69 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69  ile!=stdout && i
18a0: 6f 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64  otrace_file!=std
18b0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c  err ){.      fcl
18c0: 6f 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65  ose(iotrace_file
18d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74  );.    }.    iot
18e0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20  race_file = 0;. 
18f0: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1900: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1910: 20 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20   argv[1][0] ){. 
1920: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
1930: 67 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d  gv[1],"stdout")=
1940: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72  =0 ){.      iotr
1950: 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75  ace_file = stdou
1960: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
1970: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c   strcmp(argv[1],
1980: 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a  "stderr")==0 ){.
1990: 20 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69        iotrace_fi
19a0: 6c 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20  le = stderr;.   
19b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f   }else{.      io
19c0: 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70  trace_file = fop
19d0: 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29  en(argv[1], "w")
19e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19f0: 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f  te3IoTrace = io_
1a00: 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a  trace_callback;.
1a10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
1a20: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1a30: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61  *.** Usage:  cla
1a40: 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
1a50: 65 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ess .**.** Retur
1a60: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70  ns true if the p
1a70: 72 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69  rogram was compi
1a80: 6c 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20  led using clang 
1a90: 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73  with the .** -fs
1aa0: 61 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20  anitize=address 
1ab0: 73 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f  switch on the co
1ac0: 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73  mmand line. Fals
1ad0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
1ae0: 2a 2a 20 41 6c 73 6f 20 72 65 74 75 72 6e 20 74  ** Also return t
1af0: 72 75 65 20 69 66 20 74 68 65 20 4f 4d 49 54 5f  rue if the OMIT_
1b00: 4d 49 53 55 53 45 20 65 6e 76 69 72 6f 6e 6d 65  MISUSE environme
1b10: 6e 74 20 76 61 72 69 61 62 6c 65 20 65 78 69 73  nt variable exis
1b20: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
1b30: 74 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65  t clang_sanitize
1b40: 5f 61 64 64 72 65 73 73 28 0a 20 20 76 6f 69 64  _address(.  void
1b50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1b60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1b80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1b90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ba0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1bb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1bc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1bd0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1be0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1bf0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1c00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1c10: 29 7b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 30  ){.  int res = 0
1c20: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ;.#if defined(__
1c30: 68 61 73 5f 66 65 61 74 75 72 65 29 0a 23 20 69  has_feature).# i
1c40: 66 20 5f 5f 68 61 73 5f 66 65 61 74 75 72 65 28  f __has_feature(
1c50: 61 64 64 72 65 73 73 5f 73 61 6e 69 74 69 7a 65  address_sanitize
1c60: 72 29 0a 20 20 72 65 73 20 3d 20 31 3b 0a 23 20  r).  res = 1;.# 
1c70: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
1c80: 64 65 66 20 5f 5f 53 41 4e 49 54 49 5a 45 5f 41  def __SANITIZE_A
1c90: 44 44 52 45 53 53 5f 5f 0a 20 20 72 65 73 20 3d  DDRESS__.  res =
1ca0: 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   1;.#endif.  if(
1cb0: 20 72 65 73 3d 3d 30 20 26 26 20 67 65 74 65 6e   res==0 && geten
1cc0: 76 28 22 4f 4d 49 54 5f 4d 49 53 55 53 45 22 29  v("OMIT_MISUSE")
1cd0: 21 3d 30 20 29 20 72 65 73 20 3d 20 31 3b 0a 20  !=0 ) res = 1;. 
1ce0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1cf0: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1d00: 77 49 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20  wIntObj(res));. 
1d10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d20: 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  }.  ./*.** Usage
1d30: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
1d40: 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d  printf  DB  FORM
1d50: 41 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  AT  STRING.**.**
1d60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
1d70: 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28  te3_exec_printf(
1d80: 29 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  ) interface usin
1d90: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
1da0: 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20  ase.** DB.  The 
1db0: 53 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e  SQL is the strin
1dc0: 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66  g FORMAT.  The f
1dd0: 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f  ormat string sho
1de0: 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f  uld contain.** o
1df0: 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54  ne %s or %q.  ST
1e00: 52 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75  RING is the valu
1e10: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  e inserted into 
1e20: 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61  %s or %q..*/.sta
1e30: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
1e40: 63 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  c_printf(.  void
1e50: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
1e60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1e70: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
1e80: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
1e90: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
1ea0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
1eb0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
1ec0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
1ed0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
1ee0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
1ef0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
1f00: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
1f10: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1f20: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  ;.  Tcl_DString 
1f30: 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  str;.  int rc;. 
1f40: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
1f50: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
1f60: 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a   char zBuf[30];.
1f70: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
1f80: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1fa0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1fb0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1fc0: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
1fd0: 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22  B FORMAT STRING"
1fe0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ff0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2000: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2010: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
2020: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
2030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
2040: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2050: 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  str);.  zSql = s
2060: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
2070: 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29  rgv[2], argv[3])
2080: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2090: 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20  _exec(db, zSql, 
20a0: 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20  exec_printf_cb, 
20b0: 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20  &str, &zErr);.  
20c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
20d0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  l);.  sqlite3_sn
20e0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
20f0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
2100: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2120: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2140: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2150: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2160: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2170: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2180: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2190: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
21a0: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
21b0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
21c0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
21d0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
21e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
21f0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2200: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2210: 6c 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20  lite3_exec_hex  
2220: 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e  DB  HEX.**.** In
2230: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
2240: 5f 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72  _exec() on a str
2250: 69 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61  ing that is obta
2260: 69 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74  ined by translat
2270: 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20  ing.** HEX into 
2280: 41 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61  ASCII.  Most cha
2290: 72 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e  racters are tran
22a0: 73 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25  slated as is.  %
22b0: 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20  HH becomes.** a 
22c0: 68 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  hex character..*
22d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
22e0: 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f  t_exec_hex(.  vo
22f0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2300: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2310: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2320: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2330: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2340: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2350: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2370: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2380: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2390: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
23a0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
23b0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23c0: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
23d0: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c  g str;.  int rc,
23e0: 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a   i, j;.  char *z
23f0: 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Err = 0;.  char 
2400: 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53  *zHex;.  char zS
2410: 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72 20  ql[501];.  char 
2420: 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20  zBuf[30];.  if( 
2430: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
2440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2450: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2460: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2470: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2480: 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22         " DB HEX"
2490: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
24a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24b0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24c0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
24d0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
24e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
24f0: 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20  Hex = argv[2];. 
2500: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28 73   for(i=j=0; i<(s
2510: 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20 26  izeof(zSql)-1) &
2520: 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c 20  & zHex[j]; i++, 
2530: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 48  j++){.    if( zH
2540: 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a 48  ex[j]=='%' && zH
2550: 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78 5b  ex[j+2] && zHex[
2560: 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a 53  j+2] ){.      zS
2570: 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65 78  ql[i] = (testHex
2580: 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d 29  ToInt(zHex[j+1])
2590: 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54 6f  <<4) + testHexTo
25a0: 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b 0a  Int(zHex[j+2]);.
25b0: 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20 20        j += 2;.  
25c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
25d0: 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a 5d  Sql[i] = zHex[j]
25e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53  ;.    }.  }.  zS
25f0: 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63 6c  ql[i] = 0;.  Tcl
2600: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74  _DStringInit(&st
2610: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
2620: 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71 6c  e3_exec(db, zSql
2630: 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  , exec_printf_cb
2640: 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a  , &str, &zErr);.
2650: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2660: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
2670: 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29   zBuf, "%d", rc)
2680: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
2690: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42  ement(interp, zB
26a0: 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  uf);.  Tcl_Appen
26b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
26c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
26d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
26e0: 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b  e(&str) : zErr);
26f0: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  .  Tcl_DStringFr
2700: 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20  ee(&str);.  if( 
2710: 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66  zErr ) sqlite3_f
2720: 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28  ree(zErr);.  if(
2730: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
2740: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
2750: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
2760: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
2770: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2780: 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e 74  * Usage:  db_ent
2790: 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20 20  er DB.**        
27a0: 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a   db_leave DB.**.
27b0: 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61 76  ** Enter or leav
27c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 61  e the mutex on a
27d0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
27e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
27f0: 69 6e 74 20 64 62 5f 65 6e 74 65 72 28 0a 20 20  int db_enter(.  
2800: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
2810: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2820: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2830: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2840: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2850: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2860: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
2870: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2880: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2890: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
28a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
28b0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
28c0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28d0: 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
28e0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
28f0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2900: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2910: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
2920: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
2930: 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
2940: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2950: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2960: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2970: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2980: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2990: 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ROR;.  sqlite3_m
29a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
29b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
29c0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  TCL_OK;.}.static
29d0: 20 69 6e 74 20 64 62 5f 6c 65 61 76 65 28 0a 20   int db_leave(. 
29e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
29f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2a00: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2a10: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2a20: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2a30: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2a40: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2a50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2a70: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2a90: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2aa0: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2ab0: 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
2ac0: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2ad0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2ae0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2af0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2b00: 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
2b10: 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
2b20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2b40: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2b50: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2b60: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2b70: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
2b80: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
2b90: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
2ba0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2bb0: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
2bc0: 33 5f 65 78 65 63 20 20 44 42 20 20 53 51 4c 0a  3_exec  DB  SQL.
2bd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
2be0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e   sqlite3_exec in
2bf0: 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74 68  terface using th
2c00: 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
2c10: 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
2c20: 20 74 65 73 74 5f 65 78 65 63 28 0a 20 20 76 6f   test_exec(.  vo
2c30: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2c40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c50: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2c60: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2c70: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2c80: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c90: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2cb0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2cc0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2cd0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2ce0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2cf0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2d00: 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  db;.  Tcl_DStrin
2d10: 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b  g str;.  int rc;
2d20: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2d30: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  0;.  char *zSql;
2d40: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
2d50: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
2d60: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
2d70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2d90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2da0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
2db0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
2dc0: 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  SQL", 0);.    re
2dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2de0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2df0: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
2e00: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
2e10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2e20: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e  .  Tcl_DStringIn
2e30: 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c  it(&str);.  zSql
2e40: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e50: 74 66 28 22 25 73 22 2c 20 61 72 67 76 5b 32 5d  tf("%s", argv[2]
2e60: 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
2e70: 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69  zSql[i];){.    i
2e80: 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20  f( zSql[i]=='%' 
2e90: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ){.      zSql[j+
2ea0: 2b 5d 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49  +] = (testHexToI
2eb0: 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34  nt(zSql[i+1])<<4
2ec0: 29 20 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74  ) + testHexToInt
2ed0: 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20  (zSql[i+2]);.   
2ee0: 20 20 20 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d     i += 3;.    }
2ef0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c  else{.      zSql
2f00: 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b  [j++] = zSql[i++
2f10: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2f20: 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63  Sql[j] = 0;.  rc
2f30: 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2f40: 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70  db, zSql, exec_p
2f50: 72 69 6e 74 66 5f 63 62 2c 20 26 73 74 72 2c 20  rintf_cb, &str, 
2f60: 26 7a 45 72 72 29 3b 0a 20 20 73 71 6c 69 74 65  &zErr);.  sqlite
2f70: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2f80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f90: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2fa0: 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a  Buf, "%d", rc);.
2fb0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2fc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ent(interp, zBuf
2fd0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2fe0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72  lement(interp, r
2ff0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54  c==SQLITE_OK ? T
3000: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
3010: 26 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20  &str) : zErr);. 
3020: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3030: 28 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45  (&str);.  if( zE
3040: 72 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  rr ) sqlite3_fre
3050: 65 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73  e(zErr);.  if( s
3060: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
3070: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
3080: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3090: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
30a0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30b0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
30c0: 65 78 65 63 5f 6e 72 20 20 44 42 20 20 53 51 4c  exec_nr  DB  SQL
30d0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
30e0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 20 69  e sqlite3_exec i
30f0: 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67 20 74  nterface using t
3100: 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
3110: 20 44 42 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a   DB.  Discard.**
3120: 20 61 6c 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a   all results.*/.
3130: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3140: 65 78 65 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20  exec_nr(.  void 
3150: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
3160: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
3170: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
3180: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
3190: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
31a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
31b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
31c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
31d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
31e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
31f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
3200: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
3210: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
3220: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
3230: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
3240: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
3250: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3260: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
3270: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
3280: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
3290: 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 53  , .       " DB S
32a0: 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  QL", 0);.    ret
32b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
32d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
32e0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
32f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3300: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
3310: 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  xec(db, argv[2],
3320: 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20   0, 0, &zErr);. 
3330: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
3340: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
3350: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
3360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
3370: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
33a0: 74 65 73 74 20 20 53 45 50 41 52 41 54 4f 52 20  test  SEPARATOR 
33b0: 20 41 52 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a   ARG0  ARG1 ....
33c0: 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25  **.** Test the %
33d0: 7a 20 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69  z format of sqli
33e0: 74 65 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 55  te_mprintf().  U
33f0: 73 65 20 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69  se multiple mpri
3400: 6e 74 66 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a  ntf() calls to .
3410: 2a 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61  ** concatenate a
3420: 72 67 30 20 74 68 72 6f 75 67 68 20 61 72 67 6e  rg0 through argn
3430: 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 6f 72   using separator
3440: 20 61 73 20 74 68 65 20 73 65 70 61 72 61 74 6f   as the separato
3450: 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  r..** Return the
3460: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
3470: 69 63 20 69 6e 74 20 74 65 73 74 5f 6d 70 72 69  ic int test_mpri
3480: 6e 74 66 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e  ntf_z(.  void *N
3490: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
34a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
34b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
34c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
34d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
34e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3500: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3510: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3520: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3530: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3540: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3550: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 20    char *zResult 
3560: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  = 0;.  int i;.. 
3570: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67 63   for(i=2; i<argc
3580: 20 26 26 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65   && (i==2 || zRe
3590: 73 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sult); i++){.   
35a0: 20 7a 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   zResult = sqlit
35b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 73  e3_mprintf("%z%s
35c0: 25 73 22 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72  %s", zResult, ar
35d0: 67 76 5b 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b  gv[1], argv[i]);
35e0: 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
35f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3600: 7a 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73  zResult, 0);.  s
3610: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 52 65 73  qlite3_free(zRes
3620: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ult);.  return T
3630: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
3640: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
3650: 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20  mprintf_n_test  
3660: 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73  STRING.**.** Tes
3670: 74 20 74 68 65 20 25 6e 20 66 6f 72 6d 61 74 20  t the %n format 
3680: 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  of sqlite_mprint
3690: 66 28 29 2e 20 20 52 65 74 75 72 6e 20 74 68 65  f().  Return the
36a0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a   length of the.*
36b0: 2a 20 69 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a  * input string..
36c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
36d0: 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20  st_mprintf_n(.  
36e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
36f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3700: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3710: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3720: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3730: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3740: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3760: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3770: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3780: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3790: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
37a0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
37b0: 53 74 72 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  Str;.  int n = 0
37c0: 3b 0a 20 20 7a 53 74 72 20 3d 20 73 71 6c 69 74  ;.  zStr = sqlit
37d0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 25 6e  e3_mprintf("%s%n
37e0: 22 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b  ", argv[1], &n);
37f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3800: 7a 53 74 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74  zStr);.  Tcl_Set
3810: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3820: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3830: 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
3840: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3850: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
3860: 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a  nprintf_int  SIZ
3870: 45 20 46 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a  E FORMAT  INT.**
3880: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 6f 66 20  .** Test the of 
3890: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
38a0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a  () routine.  SIZ
38b0: 45 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  E is the size of
38c0: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
38d0: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 2e 20  uffer in bytes. 
38e0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
38f0: 65 20 69 73 20 31 30 30 2e 20 20 46 4f 52 4d 41  e is 100.  FORMA
3900: 54 20 69 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  T is the.** form
3910: 61 74 20 73 74 72 69 6e 67 2e 20 20 49 4e 54 20  at string.  INT 
3920: 69 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 74 65  is a single inte
3930: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 54  ger argument.  T
3940: 68 65 20 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72  he FORMAT.** str
3950: 69 6e 67 20 6d 75 73 74 20 72 65 71 75 69 72 65  ing must require
3960: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 74 68   no more than th
3970: 69 73 20 6f 6e 65 20 69 6e 74 65 67 65 72 20 61  is one integer a
3980: 72 67 75 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20  rgument.  If.** 
3990: 59 6f 75 20 70 61 73 73 20 69 6e 20 61 20 66 6f  You pass in a fo
39a0: 72 6d 61 74 20 73 74 72 69 6e 67 20 74 68 61 74  rmat string that
39b0: 20 72 65 71 75 69 72 65 73 20 6d 6f 72 65 20 74   requires more t
39c0: 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74  han one argument
39d0: 2c 0a 2a 2a 20 62 61 64 20 74 68 69 6e 67 73 20  ,.** bad things 
39e0: 77 69 6c 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a  will happen..*/.
39f0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
3a00: 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20  snprintf_int(.  
3a10: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3a20: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3a30: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3a40: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3a50: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3a60: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3a70: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3a90: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3aa0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3ab0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3ac0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3ad0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53   */.){.  char zS
3ae0: 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e  tr[100];.  int n
3af0: 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 31 5d 29   = atoi(argv[1])
3b00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
3b10: 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67 76 5b 32  zFormat = argv[2
3b20: 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d 20 61 74  ];.  int a1 = at
3b30: 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  oi(argv[3]);.  i
3b40: 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72  f( n>sizeof(zStr
3b50: 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a  ) ) n = sizeof(z
3b60: 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Str);.  sqlite3_
3b70: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
3b80: 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20 22 61 62  zStr), zStr, "ab
3b90: 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
3ba0: 73 74 75 76 77 78 79 7a 22 29 3b 0a 20 20 73 71  stuvwxyz");.  sq
3bb0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
3bc0: 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c  , zStr, zFormat,
3bd0: 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   a1);.  Tcl_Appe
3be0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3bf0: 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20 72 65 74   zStr, 0);.  ret
3c00: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
3c10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3c20: 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a  IT_GET_TABLE../*
3c30: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3c40: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3c50: 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41 54  intf  DB  FORMAT
3c60: 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d    STRING  ?--no-
3c70: 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e  counts?.**.** In
3c80: 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
3c90: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3ca0: 66 28 29 20 69 6e 74 65 72 66 61 63 65 20 75 73  f() interface us
3cb0: 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ing the open dat
3cc0: 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68  abase.** DB.  Th
3cd0: 65 20 53 51 4c 20 69 73 20 74 68 65 20 73 74 72  e SQL is the str
3ce0: 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20 54 68 65  ing FORMAT.  The
3cf0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 73   format string s
3d00: 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  hould contain.**
3d10: 20 6f 6e 65 20 25 73 20 6f 72 20 25 71 2e 20 20   one %s or %q.  
3d20: 53 54 52 49 4e 47 20 69 73 20 74 68 65 20 76 61  STRING is the va
3d30: 6c 75 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  lue inserted int
3d40: 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73  o %s or %q..*/.s
3d50: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
3d60: 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28  et_table_printf(
3d70: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3d80: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3d90: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3da0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3db0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3dc0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3dd0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3de0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3df0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3e00: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3e20: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3e30: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
3e40: 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44  te3 *db;.  Tcl_D
3e50: 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e  String str;.  in
3e60: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
3e70: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  rr = 0;.  int nR
3e80: 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20 30  ow = 0, nCol = 0
3e90: 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75  ;.  char **aResu
3ea0: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
3eb0: 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
3ec0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
3ed0: 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b  t resCount = -1;
3ee0: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29  .  if( argc==5 )
3ef0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
3f00: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
3f10: 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29  v[4], &resCount)
3f20: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3f30: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  ROR;.  }.  if( a
3f40: 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d  rgc!=4 && argc!=
3f50: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
3f60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3f70: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
3f80: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
3f90: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
3fa0: 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52   " DB FORMAT STR
3fb0: 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29  ING ?COUNT?", 0)
3fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3fd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3fe0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
3ff0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4000: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4010: 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44  L_ERROR;.  Tcl_D
4020: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
4030: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ;.  zSql = sqlit
4040: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
4050: 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  2],argv[3]);.  i
4060: 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20  f( argc==5 ){.  
4070: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
4080: 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71  et_table(db, zSq
4090: 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20  l, &aResult, 0, 
40a0: 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c  0, &zErr);.  }el
40b0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
40c0: 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64  ite3_get_table(d
40d0: 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c  b, zSql, &aResul
40e0: 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c  t, &nRow, &nCol,
40f0: 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73   &zErr);.    res
4100: 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29  Count = (nRow+1)
4110: 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c  *nCol;.  }.  sql
4120: 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
4130: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
4140: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
4150: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
4160: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
4170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
4180: 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Buf);.  if( rc==
4190: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
41a0: 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a   if( argc==4 ){.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
41c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
41d0: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
41e0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54 63   nRow);.      Tc
41f0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4200: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4210: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
4220: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
4230: 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
4240: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4250: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4260: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4270: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4280: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4290: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
42a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
42b0: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
42c0: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
42d0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
42e0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
42f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4300: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
4310: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
4320: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4330: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4340: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4350: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4360: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4370: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4380: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4390: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
43a0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
43b0: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
43c0: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
43d0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
43e0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
43f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
4400: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
4410: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
4420: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4430: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4440: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4450: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4460: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4470: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4480: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4490: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
44a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
44b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
44c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
44d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
44e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
44f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4500: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4510: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
4520: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4530: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4540: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4560: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4570: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4580: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4590: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
45a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
45b0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
45c0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
45d0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
45e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
45f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4600: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
4610: 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74  f, "%lld", sqlit
4620: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
4630: 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c  owid(db));.  Tcl
4640: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4650: 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
4660: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4670: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
4680: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  ge:  sqlite3_key
4690: 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65   DB KEY.**.** Se
46a0: 74 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e  t the codec key.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
46c0: 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20  est_key(.  void 
46d0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
46e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
46f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4700: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4710: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4720: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4730: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4740: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
4750: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
4760: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
4770: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
4780: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
4790: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
47a0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71 6c 69  HAS_CODEC.  sqli
47b0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
47c0: 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 69   char *zKey;.  i
47d0: 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28 20 61  nt nKey;.  if( a
47e0: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
47f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
4800: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
4810: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
4820: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
4830: 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c       " FILENAME\
4840: 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  "", 0);.    retu
4850: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4860: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
4870: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
4880: 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
4890: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
48a0: 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32 5d 3b   zKey = argv[2];
48b0: 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c 65 6e  .  nKey = strlen
48c0: 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65  (zKey);.  sqlite
48d0: 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20  3_key(db, zKey, 
48e0: 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nKey);.#endif.  
48f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
4900: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
4910: 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 20 44 42  sqlite3_rekey DB
4920: 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67   KEY.**.** Chang
4930: 65 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e  e the codec key.
4940: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
4950: 65 73 74 5f 72 65 6b 65 79 28 0a 20 20 76 6f 69  est_rekey(.  voi
4960: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4970: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4980: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
4990: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
49a0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
49b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
49c0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
49d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
49e0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
49f0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4a00: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4a10: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4a20: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
4a30: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
4a40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
4a50: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
4a60: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
4a70: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
4a80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
4a90: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
4aa0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
4ab0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
4ac0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
4ad0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
4ae0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4af0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
4b00: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
4b10: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4b20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4b30: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
4b40: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
4b50: 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69  en(zKey);.  sqli
4b60: 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20 7a 4b  te3_rekey(db, zK
4b70: 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69  ey, nKey);.#endi
4b80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
4b90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4ba0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  e:  sqlite3_clos
4bb0: 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  e DB.**.** Close
4bc0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4bd0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4be0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4bf0: 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65 73 74   int sqlite_test
4c00: 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64 20 2a  _close(.  void *
4c10: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4c20: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4c30: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4c40: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
4c50: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
4c60: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
4c70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4c80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4c90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
4ca0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4cb0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4cc0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4ce0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
4cf0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
4d00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4d10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
4d20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
4d30: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
4d40: 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45        " FILENAME
4d50: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
4d60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4d70: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
4d80: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
4d90: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
4da0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4db0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
4dc0: 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f  lose(db);.  Tcl_
4dd0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
4de0: 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
4df0: 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
4e00: 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
4e10: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
4e20: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
4e30: 33 5f 63 6c 6f 73 65 5f 76 32 20 44 42 0a 2a 2a  3_close_v2 DB.**
4e40: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4e50: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4e60: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4e70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4e80: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f  lite_test_close_
4e90: 76 32 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  v2(.  void *NotU
4ea0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4eb0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ec0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4ed0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4ee0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4ef0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4f00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4f10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4f20: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4f30: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4f40: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4f50: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
4f60: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
4f70: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
4f80: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
4f90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
4fa0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
4fb0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
4fc0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
4fd0: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
4fe0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4ff0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
5000: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
5010: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
5020: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
5030: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
5040: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   = sqlite3_close
5050: 5f 76 32 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  _v2(db);.  Tcl_S
5060: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
5070: 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
5080: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
5090: 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
50a0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
50b0: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
50c0: 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65 73 63  of the x_coalesc
50d0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  e() function..**
50e0: 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 72 73   Return the firs
50f0: 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e 2d 4e  t argument non-N
5100: 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ULL argument..*/
5110: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 5f  .static void t1_
5120: 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20 73 71  ifnullFunc(.  sq
5130: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
5140: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
5150: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
5160: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5170: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
5180: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
5190: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
51a0: 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c  ULL!=sqlite3_val
51b0: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69 5d 29  ue_type(argv[i])
51c0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
51d0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
51e0: 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29 3b 0a  bytes(argv[i]);.
51f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
5200: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
5210: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
5220: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5230: 76 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20 20 20  v[i]),.         
5240: 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   n, SQLITE_TRANS
5250: 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62 72 65  IENT);.      bre
5260: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
5270: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
5280: 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e 73 2e   test functions.
5290: 20 20 20 20 68 65 78 38 28 29 20 69 6e 74 65 72      hex8() inter
52a0: 70 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65  prets its argume
52b0: 6e 74 20 61 73 0a 2a 2a 20 55 54 46 38 20 61 6e  nt as.** UTF8 an
52c0: 64 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20  d returns a hex 
52d0: 65 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78 31 36  encoding.  hex16
52e0: 6c 65 28 29 20 69 6e 74 65 72 70 72 65 74 73 20  le() interprets 
52f0: 69 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  its argument.** 
5300: 61 73 20 55 54 46 31 36 6c 65 20 61 6e 64 20 72  as UTF16le and r
5310: 65 74 75 72 6e 73 20 61 20 68 65 78 20 65 6e 63  eturns a hex enc
5320: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5330: 20 76 6f 69 64 20 68 65 78 38 46 75 6e 63 28 73   void hex8Func(s
5340: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5350: 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  p, int argc, sql
5360: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
5370: 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  v){.  const unsi
5380: 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20  gned char *z;.  
5390: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 7a 42  int i;.  char zB
53a0: 75 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d 20 73  uf[200];.  z = s
53b0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53c0: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f  t(argv[0]);.  fo
53d0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
53e0: 7a 42 75 66 29 2f 32 20 2d 20 32 20 26 26 20 7a  zBuf)/2 - 2 && z
53f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
5400: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
5410: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 32  sizeof(zBuf)-i*2
5420: 2c 20 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25  , &zBuf[i*2], "%
5430: 30 32 78 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 7d  02x", z[i]);.  }
5440: 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20 3d 20 30  .  zBuf[i*2] = 0
5450: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
5460: 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72  lt_text(p, (char
5470: 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49  *)zBuf, -1, SQLI
5480: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d  TE_TRANSIENT);.}
5490: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
54a0: 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74 69  OMIT_UTF16.stati
54b0: 63 20 76 6f 69 64 20 68 65 78 31 36 46 75 6e 63  c void hex16Func
54c0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
54d0: 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73   *p, int argc, s
54e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
54f0: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  rgv){.  const un
5500: 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
5510: 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *z;.  int i;.  
5520: 63 68 61 72 20 7a 42 75 66 5b 34 30 30 5d 3b 0a  char zBuf[400];.
5530: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
5540: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
5550: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5560: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 34  i<sizeof(zBuf)/4
5570: 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 4 && z[i]; i+
5580: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
5590: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
55a0: 7a 42 75 66 29 2d 69 2a 34 2c 20 26 7a 42 75 66  zBuf)-i*4, &zBuf
55b0: 5b 69 2a 34 5d 2c 22 25 30 34 78 22 2c 20 7a 5b  [i*4],"%04x", z[
55c0: 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20  i]&0xff);.  }.  
55d0: 7a 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b 0a 20  zBuf[i*4] = 0;. 
55e0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
55f0: 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a  text(p, (char*)z
5600: 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  Buf, -1, SQLITE_
5610: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 65  TRANSIENT);.}.#e
5620: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  ndif../*.** A st
5630: 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77 68 69  ructure into whi
5640: 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61 74 65  ch to accumulate
5650: 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   text..*/.struct
5660: 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20 6e 41   dstr {.  int nA
5670: 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63 65 20  lloc;  /* Space 
5680: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
5690: 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a 20 53  nt nUsed;   /* S
56a0: 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 63  pace used */.  c
56b0: 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a 20 54  har *z;     /* T
56c0: 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b 0a 0a  he space */.};..
56d0: 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78  /*.** Append tex
56e0: 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f 0a 73  t to a dstr.*/.s
56f0: 74 61 74 69 63 20 76 6f 69 64 20 64 73 74 72 41  tatic void dstrA
5700: 70 70 65 6e 64 28 73 74 72 75 63 74 20 64 73 74  ppend(struct dst
5710: 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  r *p, const char
5720: 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64 65 72   *z, int divider
5730: 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  ){.  int n = (in
5740: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  t)strlen(z);.  i
5750: 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 20  f( p->nUsed + n 
5760: 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f 63 20  + 2 > p->nAlloc 
5770: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  ){.    char *zNe
5780: 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  w;.    p->nAlloc
5790: 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b   = p->nAlloc*2 +
57a0: 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 4e   n + 200;.    zN
57b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
57c0: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  lloc(p->z, p->nA
57d0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
57e0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
57f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
5800: 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  z);.      memset
5810: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
5820: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
5830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a  ;.    }.    p->z
5840: 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20 69   = zNew;.  }.  i
5850: 66 28 20 64 69 76 69 64 65 72 20 26 26 20 70 2d  f( divider && p-
5860: 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20 20 20  >nUsed>0 ){.    
5870: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b 2b 5d  p->z[p->nUsed++]
5880: 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20 7d 0a   = divider;.  }.
5890: 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70    memcpy(&p->z[p
58a0: 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e 2b 31  ->nUsed], z, n+1
58b0: 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d  );.  p->nUsed +=
58c0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   n;.}../*.** Inv
58d0: 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20 63 61  oked for each ca
58e0: 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71 6c 69  llback from sqli
58f0: 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f 0a 73  te3ExecFunc.*/.s
5900: 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 46 75  tatic int execFu
5910: 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ncCallback(void 
5920: 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63  *pData, int argc
5930: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63  , char **argv, c
5940: 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a  har **NotUsed){.
5950: 20 20 73 74 72 75 63 74 20 64 73 74 72 20 2a 70    struct dstr *p
5960: 20 3d 20 28 73 74 72 75 63 74 20 64 73 74 72 2a   = (struct dstr*
5970: 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b  )pData;.  int i;
5980: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72  .  for(i=0; i<ar
5990: 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  gc; i++){.    if
59a0: 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a  ( argv[i]==0 ){.
59b0: 20 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64        dstrAppend
59c0: 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20 27 29  (p, "NULL", ' ')
59d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
59e0: 20 20 20 64 73 74 72 41 70 70 65 6e 64 28 70 2c     dstrAppend(p,
59f0: 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29 3b 0a   argv[i], ' ');.
5a00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5a10: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
5a20: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
5a30: 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f 65 78   the x_sqlite_ex
5a40: 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ec() function.  
5a50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 61  This function ta
5a60: 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20  kes.** a single 
5a70: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 74 74  argument and att
5a80: 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75 74 65  empts to execute
5a90: 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 61   that argument a
5aa0: 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a 20 54  s SQL code..** T
5ab0: 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c 20 61  his is illegal a
5ac0: 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68  nd should set th
5ad0: 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  e SQLITE_MISUSE 
5ae0: 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61 74 61  flag on the data
5af0: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 34  base..**.** 2004
5b00: 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68 61 76  -Jan-07:  We hav
5b10: 65 20 63 68 61 6e 67 65 64 20 74 68 69 73 20 74  e changed this t
5b20: 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61 6c 20  o make it legal 
5b30: 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f  to call sqlite3_
5b40: 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d 20 77  exec().** from w
5b50: 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69 6f 6e  ithin a function
5b60: 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a 2a 20   call.  .** .** 
5b70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 69 6d  This routine sim
5b80: 75 6c 61 74 65 73 20 74 68 65 20 65 66 66 65 63  ulates the effec
5b90: 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77 6f 20  t of having two 
5ba0: 74 68 72 65 61 64 73 20 61 74 74 65 6d 70 74 20  threads attempt 
5bb0: 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20 73 61  to.** use the sa
5bc0: 6d 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74  me database at t
5bd0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2f  he same time..*/
5be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
5bf0: 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a 20 20  ite3ExecFunc(.  
5c00: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
5c10: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
5c20: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
5c30: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
5c40: 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72  ){.  struct dstr
5c50: 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26 78 2c   x;.  memset(&x,
5c60: 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a   0, sizeof(x));.
5c70: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
5c80: 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a 29 73  exec((sqlite3*)s
5c90: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
5ca0: 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20 20 20  (context),.     
5cb0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
5cc0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5cd0: 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65 63 46  0]),.      execF
5ce0: 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26 78 2c  uncCallback, &x,
5cf0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72   0);.  sqlite3_r
5d00: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
5d10: 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73 65 64  xt, x.z, x.nUsed
5d20: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
5d30: 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  NT);.  sqlite3_f
5d40: 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  ree(x.z);.}../*.
5d50: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
5d60: 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75 6e 63  n of tkt2213func
5d70: 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66 75 6e  (), a scalar fun
5d80: 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b 65 73  ction that takes
5d90: 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20   exactly.** one 
5da0: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68 61 73  argument. It has
5db0: 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69 6e 67   two interesting
5dc0: 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a 2a 2a   features:.**.**
5dd0: 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71 6c 69   * It calls sqli
5de0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 29  te3_value_text()
5df0: 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68 65 20   3 times on the 
5e00: 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74 65 33  argument sqlite3
5e10: 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20 49 66  _value*..**   If
5e20: 20 74 68 65 20 74 68 72 65 65 20 70 6f 69 6e 74   the three point
5e30: 65 72 73 20 72 65 74 75 72 6e 65 64 20 61 72 65  ers returned are
5e40: 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61 6e   not the same an
5e50: 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20 72 61   SQL error is ra
5e60: 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20 4f 74  ised..**.** * Ot
5e70: 68 65 72 77 69 73 65 20 69 74 20 72 65 74 75 72  herwise it retur
5e80: 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ns a copy of the
5e90: 20 74 65 78 74 20 72 65 70 72 65 73 65 6e 74 61   text representa
5ea0: 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a 2a 20  tion of its .** 
5eb0: 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 75    argument in su
5ec0: 63 68 20 61 20 77 61 79 20 61 73 20 74 68 65 20  ch a way as the 
5ed0: 56 44 42 45 20 72 65 70 72 65 73 65 6e 74 61 74  VDBE representat
5ee0: 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20 63 65  ion is a Mem* ce
5ef0: 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20 74 68  ll .**   with th
5f00: 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61 67 20  e MEM_Term flag 
5f10: 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20 54 69  clear. .**.** Ti
5f20: 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e 20 74  cket #2213 can t
5f30: 68 65 72 65 66 6f 72 65 20 62 65 20 74 65 73 74  herefore be test
5f40: 65 64 20 62 79 20 65 76 61 6c 75 61 74 69 6e 67  ed by evaluating
5f50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
5f60: 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e  * SQL expression
5f70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32 32 31  :.**.**   tkt221
5f80: 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66 75 6e  3func(tkt2213fun
5f90: 63 28 27 61 20 73 74 72 69 6e 67 27 29 29 3b 0a  c('a string'));.
5fa0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
5fb0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 28 0a  kt2213Function(.
5fc0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5fd0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5fe0: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
5ff0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6000: 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65 78 74  v.){.  int nText
6010: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6020: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 31 3b  r const *zText1;
6030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
6040: 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32 3b 0a   const *zText2;.
6050: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6060: 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b 0a 0a  const *zText3;..
6070: 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69 74 65    nText = sqlite
6080: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72  3_value_bytes(ar
6090: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 31  gv[0]);.  zText1
60a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
60b0: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
60c0: 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c 69 74    zText2 = sqlit
60d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
60e0: 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74 33  gv[0]);.  zText3
60f0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
6100: 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a  _text(argv[0]);.
6110: 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21 3d 7a  .  if( zText1!=z
6120: 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74 32 21  Text2 || zText2!
6130: 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20 20 73  =zText3 ){.    s
6140: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
6150: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 74 6b  ror(context, "tk
6160: 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66 69 78  t2213 is not fix
6170: 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73  ed", -1);.  }els
6180: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  e{.    char *zCo
6190: 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  py = (char *)sql
61a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54 65 78  ite3_malloc(nTex
61b0: 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  t);.    memcpy(z
61c0: 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20 6e 54  Copy, zText1, nT
61d0: 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ext);.    sqlite
61e0: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f  3_result_text(co
61f0: 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20 6e 54  ntext, zCopy, nT
6200: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66 72 65  ext, sqlite3_fre
6210: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
6220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53   The following S
6230: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 65  QL function take
6240: 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  s 4 arguments.  
6250: 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a 20 34  The 2nd and.** 4
6260: 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  th argument must
6270: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 73 65   be one of these
6280: 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65 78 74   strings:  'text
6290: 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a 2a 20  ', 'text16',.** 
62a0: 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72 65 73  or 'blob' corres
62b0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 20 66  ponding to API f
62c0: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 20  unctions.**.**  
62d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75      sqlite3_valu
62e0: 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20 20 20  e_text().**     
62f0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
6300: 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20 20 20  ext16().**      
6310: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6320: 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ob().**.** The t
6330: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
6340: 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74 68 65   a string, eithe
6350: 72 20 27 62 79 74 65 73 27 20 6f 72 20 27 62 79  r 'bytes' or 'by
6360: 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f 70 27  tes16' or 'noop'
6370: 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  ,.** correspondi
6380: 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a 0a 2a  ng to APIs:.**.*
6390: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
63a0: 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a 2a 20  alue_bytes().** 
63b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
63c0: 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a 2a 20  ue_bytes16().** 
63d0: 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a 2a 20       noop.**.** 
63e0: 54 68 65 20 41 50 49 73 20 64 65 73 69 67 6e 61  The APIs designa
63f0: 74 65 64 20 62 79 20 74 68 65 20 32 6e 64 20 74  ted by the 2nd t
6400: 68 72 6f 75 67 68 20 34 74 68 20 61 72 67 75 6d  hrough 4th argum
6410: 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69 65 64  ents are applied
6420: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
6430: 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f 72 64   argument in ord
6440: 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f 69 6e  er.  If the poin
6450: 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 62 79  ters returned by
6460: 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 61   the.** second a
6470: 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20 64 69  nd fourth are di
6480: 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20 72 6f  fferent, this ro
6490: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 31 2e  utine returns 1.
64a0: 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
64b0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
64c0: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  urns 0..**.** Th
64d0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
64e0: 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f 20 73  sed to test to s
64f0: 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e 65 64  ee when returned
6500: 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 0a 2a   pointers from.*
6510: 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c 20 5f  * the _text(), _
6520: 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f 62 6c  text16() and _bl
6530: 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f 6d 65  ob() APIs become
6540: 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
6550: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72  .static void ptr
6560: 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a 20 20  ChngFunction(.  
6570: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
6580: 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74  *context, .  int
6590: 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74   argc,  .  sqlit
65a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
65b0: 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ){.  const void 
65c0: 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f 6e 73  *p1, *p2;.  cons
65d0: 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20  t char *zCmd;.  
65e0: 69 66 28 20 61 72 67 63 21 3d 34 20 29 20 72 65  if( argc!=4 ) re
65f0: 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d 20 28  turn;.  zCmd = (
6600: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
6610: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6620: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[1]);.  if( z
6630: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
6640: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
6650: 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20 29 7b  md,"text")==0 ){
6660: 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74  .    p1 = (const
6670: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6680: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
6690: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
66a0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
66b0: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
66c0: 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36 22 29  (zCmd, "text16")
66d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20  ==0 ){.    p1 = 
66e0: 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c  (const void*)sql
66f0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
6700: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6710: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6720: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 6c 6f  trcmp(zCmd, "blo
6730: 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  b")==0 ){.    p1
6740: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6750: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
6760: 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7d  ob(argv[0]);.  }
6770: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6780: 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d 20 28  ;.  }.  zCmd = (
6790: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
67a0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
67b0: 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  rgv[2]);.  if( z
67c0: 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cmd==0 ) return;
67d0: 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43  .  if( strcmp(zC
67e0: 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30 20 29  md,"bytes")==0 )
67f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  {.    sqlite3_va
6800: 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 30  lue_bytes(argv[0
6810: 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
6820: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6830: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6840: 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31 36 22  (zCmd, "bytes16"
6850: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
6860: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31  te3_value_bytes1
6870: 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65 6e 64  6(argv[0]);.#end
6880: 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  if.  }else if( s
6890: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e 6f 6f  trcmp(zCmd, "noo
68a0: 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  p")==0 ){.    /*
68b0: 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   do nothing */. 
68c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
68d0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  rn;.  }.  zCmd =
68e0: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
68f0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6900: 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (argv[3]);.  if(
6910: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
6920: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
6930: 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20  zCmd,"text")==0 
6940: 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e  ){.    p2 = (con
6950: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
6960: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6970: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6980: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6990: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
69a0: 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36  mp(zCmd, "text16
69b0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20  ")==0 ){.    p2 
69c0: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
69d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
69e0: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  t16(argv[0]);.#e
69f0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
6a00: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62   strcmp(zCmd, "b
6a10: 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lob")==0 ){.    
6a20: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
6a30: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6a40: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
6a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6a60: 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
6a70: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6a80: 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b 0a 7d  text, p1!=p2);.}
6a90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 53 51 4c  ../*.** This SQL
6aa0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
6ab0: 73 20 61 20 64 69 66 66 65 72 65 6e 74 20 61 6e  s a different an
6ac0: 73 77 65 72 20 65 61 63 68 20 74 69 6d 65 20 69  swer each time i
6ad0: 74 20 69 73 20 63 61 6c 6c 65 64 2c 20 65 76 65  t is called, eve
6ae0: 6e 20 69 66 0a 2a 2a 20 74 68 65 20 61 72 67 75  n if.** the argu
6af0: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 20 73 61  ments are the sa
6b00: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  me..*/.static vo
6b10: 69 64 20 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73  id nondeterminis
6b20: 74 69 63 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  ticFunction(.  s
6b30: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
6b40: 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69 6e 74 20  context, .  int 
6b50: 61 72 67 63 2c 20 20 0a 20 20 73 71 6c 69 74 65  argc,  .  sqlite
6b60: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
6b70: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  {.  static int c
6b80: 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  nt = 0;.  sqlite
6b90: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
6ba0: 74 65 78 74 2c 20 63 6e 74 2b 2b 29 3b 0a 7d 0a  text, cnt++);.}.
6bb0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
6bc0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6bd0: 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a 20  nction DB.**.** 
6be0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
6bf0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
6c00: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
6c10: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
6c20: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
6c30: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
6c40: 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e 20  d "x_coalesce". 
6c50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
6c60: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68 69  oes the same thi
6c70: 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63 6f  ng.** as the "co
6c80: 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f 6e  alesce" function
6c90: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
6ca0: 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73 20   also registers 
6cb0: 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 0a  an SQL function.
6cc0: 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c 69  ** named "x_sqli
6cd0: 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69 6e  te_exec" that in
6ce0: 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65 78  vokes sqlite3_ex
6cf0: 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67 20  ec().  Invoking 
6d00: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a 2a  sqlite3_exec().*
6d10: 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69 73  * in this way is
6d20: 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73 69   illegal recursi
6d30: 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 61  on and should ra
6d40: 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d 49  ise an SQLITE_MI
6d50: 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20 54  SUSE error..** T
6d60: 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69 6d  he effect is sim
6d70: 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20 74  ilar to trying t
6d80: 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 64  o use the same d
6d90: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6da0: 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20 74  on from.** two t
6db0: 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73 61  hreads at the sa
6dc0: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54  me time..**.** T
6dd0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69  he original moti
6de0: 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  vation for this 
6df0: 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62  routine was to b
6e00: 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74  e able to call t
6e10: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72  he.** sqlite3_cr
6e20: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66 75  eate_function fu
6e30: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
6e40: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
6e50: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
6e60: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
6e70: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
6e80: 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74  ion logic..*/.st
6e90: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
6ea0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
6eb0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
6ec0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6ed0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
6ee0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
6ef0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
6f00: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
6f10: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
6f20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6f30: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
6f40: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
6f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
6f60: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
6f70: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
6f80: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
6f90: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
6fa0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
6fb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
6fc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
6fd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
6fe0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
6ff0: 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  DB\"", 0);.    r
7000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7010: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
7020: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
7030: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
7040: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7050: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7060: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7070: 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65  (db, "x_coalesce
7080: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7090: 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  F8, 0, .        
70a0: 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30  t1_ifnullFunc, 0
70b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
70c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
70d0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
70e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
70f0: 2c 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c  , "hex8", 1, SQL
7100: 49 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54  ITE_UTF8 | SQLIT
7110: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c  E_DETERMINISTIC,
7120: 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20 68 65  .          0, he
7130: 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  x8Func, 0, 0);. 
7140: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
7150: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
7160: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7170: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7180: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7190: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22  tion(db, "hex16"
71a0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
71b0: 36 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  6 | SQLITE_DETER
71c0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
71d0: 20 20 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63      0, hex16Func
71e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
71f0: 64 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  dif.  if( rc==SQ
7200: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
7210: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7220: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
7230: 22 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31  "tkt2213func", 1
7240: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7250: 20 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32   .          tkt2
7260: 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  213Function, 0, 
7270: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
7280: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7290: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
72a0: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
72b0: 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61  db, "pointer_cha
72c0: 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  nge", 4, SQLITE_
72d0: 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  ANY, 0, .       
72e0: 20 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69     ptrChngFuncti
72f0: 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  on, 0, 0);.  }..
7300: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63    /* Functions c
7310: 6f 75 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f  ounter1() and co
7320: 75 6e 74 65 72 32 28 29 20 68 61 76 65 20 74 68  unter2() have th
7330: 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74  e same implement
7340: 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a  ation - they.  *
7350: 2a 20 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e  * both return an
7360: 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67   ascending integ
7370: 65 72 20 77 69 74 68 20 65 61 63 68 20 63 61 6c  er with each cal
7380: 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31  l.  But counter1
7390: 28 29 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a  () is marked.  *
73a0: 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  * as non-determi
73b0: 6e 69 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74  nistic and count
73c0: 65 72 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20  er2() is marked 
73d0: 61 73 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63  as deterministic
73e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
73f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7400: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7410: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7420: 62 2c 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d  b, "counter1", -
7430: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  1, SQLITE_UTF8,.
7440: 20 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e            0, non
7450: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e  deterministicFun
7460: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7470: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
7480: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
7490: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
74a0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63  _function(db, "c
74b0: 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51  ounter2", -1, SQ
74c0: 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45  LITE_UTF8|SQLITE
74d0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
74e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e            0, non
74f0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e  deterministicFun
7500: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7510: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
7520: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f  E_OMIT_UTF16.  /
7530: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
7540: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7550: 6e 31 36 28 29 20 41 50 49 20 68 65 72 65 2e 20  n16() API here. 
7560: 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75 6e 2c 20  Mainly for fun, 
7570: 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a 2a 20 62  but also .  ** b
7580: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
7590: 20 74 65 73 74 65 64 20 61 6e 79 77 68 65 72 65   tested anywhere
75a0: 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20   else. */.  if( 
75b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
75c0: 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  .    const void 
75d0: 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 73 71 6c  *zUtf16;.    sql
75e0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
75f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7600: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7610: 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d  tex);.    pVal =
7620: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
7630: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
7640: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
7650: 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c 69 74 65  l, -1, "x_sqlite
7660: 5f 65 78 65 63 22 2c 20 53 51 4c 49 54 45 5f 55  _exec", SQLITE_U
7670: 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
7680: 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20  IC);.    zUtf16 
7690: 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
76a0: 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
76b0: 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
76c0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
76d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
76e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
76f0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
7700: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7710: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7720: 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 0a  16(db, zUtf16, .
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c  1, SQLITE_UTF16,
7750: 20 64 62 2c 20 73 71 6c 69 74 65 33 45 78 65 63   db, sqlite3Exec
7760: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Func, 0, 0);.   
7770: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
7780: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
7790: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
77a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
77b0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
77c0: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
77d0: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
77e0: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
77f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
7800: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
7810: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
7820: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
7830: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
7840: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ;.}../*.** Routi
7850: 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  nes to implement
7860: 20 74 68 65 20 78 5f 63 6f 75 6e 74 28 29 20 61   the x_count() a
7870: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7880: 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f 75 6e 74  n..**.** x_count
7890: 28 29 20 63 6f 75 6e 74 73 20 74 68 65 20 6e 75  () counts the nu
78a0: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c  mber of non-null
78b0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 42 75 74   arguments.  But
78c0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 73 6f   there are.** so
78d0: 6d 65 20 74 77 69 73 74 73 20 66 6f 72 20 74 65  me twists for te
78e0: 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 0a  sting purposes..
78f0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 61 72 67  **.** If the arg
7900: 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f 75 6e 74  ument to x_count
7910: 28 29 20 69 73 20 34 30 20 74 68 65 6e 20 61 20  () is 40 then a 
7920: 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72  UTF-8 error is r
7930: 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e 20 74 68  eported.** on th
7940: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e  e step function.
7950: 20 20 49 66 20 78 5f 63 6f 75 6e 74 28 34 31 29    If x_count(41)
7960: 20 69 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 61   is seen, then a
7970: 20 55 54 46 2d 31 36 20 65 72 72 6f 72 0a 2a 2a   UTF-16 error.**
7980: 20 69 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20   is reported on 
7990: 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f  the step functio
79a0: 6e 2e 20 20 49 66 20 74 68 65 20 74 6f 74 61 6c  n.  If the total
79b0: 20 63 6f 75 6e 74 20 69 73 20 34 32 2c 20 74 68   count is 42, th
79c0: 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38 20 65 72  en.** a UTF-8 er
79d0: 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 20  ror is reported 
79e0: 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 20  on the finalize 
79f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  function..*/.typ
7a00: 65 64 65 66 20 73 74 72 75 63 74 20 74 31 43 6f  edef struct t1Co
7a10: 75 6e 74 43 74 78 20 74 31 43 6f 75 6e 74 43 74  untCtx t1CountCt
7a20: 78 3b 0a 73 74 72 75 63 74 20 74 31 43 6f 75 6e  x;.struct t1Coun
7a30: 74 43 74 78 20 7b 0a 20 20 69 6e 74 20 6e 3b 0a  tCtx {.  int n;.
7a40: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  };.static void t
7a50: 31 43 6f 75 6e 74 53 74 65 70 28 0a 20 20 73 71  1CountStep(.  sq
7a60: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
7a70: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
7a80: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
7a90: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
7aa0: 74 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20  t1CountCtx *p;. 
7ab0: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67   p = sqlite3_agg
7ac0: 72 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63  regate_context(c
7ad0: 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a  ontext, sizeof(*
7ae0: 70 29 29 3b 0a 20 20 69 66 28 20 28 61 72 67 63  p));.  if( (argc
7af0: 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4e 55  ==0 || SQLITE_NU
7b00: 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76 61 6c 75  LL!=sqlite3_valu
7b10: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 20  e_type(argv[0]) 
7b20: 29 20 26 26 20 70 20 29 7b 0a 20 20 20 20 70 2d  ) && p ){.    p-
7b30: 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >n++;.  }.  if( 
7b40: 61 72 67 63 3e 30 20 29 7b 0a 20 20 20 20 69 6e  argc>0 ){.    in
7b50: 74 20 76 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  t v = sqlite3_va
7b60: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 30 5d 29  lue_int(argv[0])
7b70: 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 34 30 20  ;.    if( v==40 
7b80: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7b90: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
7ba0: 6e 74 65 78 74 2c 20 22 76 61 6c 75 65 20 6f 66  ntext, "value of
7bb0: 20 34 30 20 68 61 6e 64 65 64 20 74 6f 20 78 5f   40 handed to x_
7bc0: 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a 23 69 66  count", -1);.#if
7bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7be0: 5f 55 54 46 31 36 0a 20 20 20 20 7d 65 6c 73 65  _UTF16.    }else
7bf0: 20 69 66 28 20 76 3d 3d 34 31 20 29 7b 0a 20 20   if( v==41 ){.  
7c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 7a      const char z
7c10: 55 74 66 31 36 45 72 72 4d 73 67 5b 5d 20 3d 20  Utf16ErrMsg[] = 
7c20: 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c 20 30 78  { 0, 0x61, 0, 0x
7c30: 36 32 2c 20 30 2c 20 30 78 36 33 2c 20 30 2c 20  62, 0, 0x63, 0, 
7c40: 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0};.      sql
7c50: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
7c60: 72 31 36 28 63 6f 6e 74 65 78 74 2c 20 26 7a 55  r16(context, &zU
7c70: 74 66 31 36 45 72 72 4d 73 67 5b 31 2d 53 51 4c  tf16ErrMsg[1-SQL
7c80: 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 5d 2c 20  ITE_BIGENDIAN], 
7c90: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
7ca0: 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74 61 74 69  }.  }.}   .stati
7cb0: 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 46 69  c void t1CountFi
7cc0: 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63  nalize(sqlite3_c
7cd0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29  ontext *context)
7ce0: 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a  {.  t1CountCtx *
7cf0: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  p;.  p = sqlite3
7d00: 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65  _aggregate_conte
7d10: 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65  xt(context, size
7d20: 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 70  of(*p));.  if( p
7d30: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
7d40: 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20 20 73 71  ==42 ){.      sq
7d50: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
7d60: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 78 5f 63  or(context, "x_c
7d70: 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74 6f 20 34  ount totals to 4
7d80: 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 65 6c  2", -1);.    }el
7d90: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
7da0: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
7db0: 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e 6e 20 3a  text, p ? p->n :
7dc0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   0);.    }.  }.}
7dd0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7de0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
7df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
7e00: 61 63 79 43 6f 75 6e 74 53 74 65 70 28 0a 20 20  acyCountStep(.  
7e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7e20: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
7e30: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
7e40: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
7e50: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a    /* no-op */.}.
7e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 65 67  .static void leg
7e70: 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  acyCountFinalize
7e80: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
7e90: 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 73 71   *context){.  sq
7ea0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
7eb0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
7ec0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
7ed0: 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a 7d 0a 23  t(context));.}.#
7ee0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
7ef0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65  ge:  sqlite3_cre
7f00: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 44 42  ate_aggregate DB
7f10: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20  .**.** Call the 
7f20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7f30: 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74  unction API on t
7f40: 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73  he given databas
7f50: 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  e in order.** to
7f60: 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74 69   create a functi
7f70: 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 75 6e  on named "x_coun
7f80: 74 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  t".  This functi
7f90: 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a  on is similar.**
7fa0: 20 74 6f 20 74 68 65 20 62 75 69 6c 74 2d 69 6e   to the built-in
7fb0: 20 63 6f 75 6e 74 28 29 20 66 75 6e 63 74 69 6f   count() functio
7fc0: 6e 2c 20 77 69 74 68 20 61 20 66 65 77 20 73 70  n, with a few sp
7fd0: 65 63 69 61 6c 20 71 75 69 72 6b 73 0a 2a 2a 20  ecial quirks.** 
7fe0: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
7ff0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8000: 72 72 6f 72 28 29 20 41 50 49 73 2e 0a 2a 2a 0a  rror() APIs..**.
8010: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
8020: 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20 74  motivation for t
8030: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
8040: 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63 61  to be able to ca
8050: 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ll the.** sqlite
8060: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
8070: 74 65 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  te function whil
8080: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
8090: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
80a0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
80b0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
80c0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 20  etection logic. 
80d0: 20 53 65 65 20 6d 69 73 75 73 65 2e 74 65 73 74   See misuse.test
80e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
80f0: 74 69 6e 65 20 77 61 73 20 6c 61 74 65 72 20 65  tine was later e
8100: 78 74 65 6e 64 65 64 20 74 6f 20 74 65 73 74 20  xtended to test 
8110: 74 68 65 20 75 73 65 20 6f 66 20 73 71 6c 69 74  the use of sqlit
8120: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8130: 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61 67 67 72  ).** within aggr
8140: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
8150: 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a 20 49 74  .**.** Later: It
8160: 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20 65 78 74   is now also ext
8170: 65 6e 64 65 64 20 74 6f 20 72 65 67 69 73 74 65  ended to registe
8180: 72 20 74 68 65 20 61 67 67 72 65 67 61 74 65 20  r the aggregate 
8190: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 6c 65 67  function.** "leg
81a0: 61 63 79 5f 63 6f 75 6e 74 28 29 22 20 77 69 74  acy_count()" wit
81b0: 68 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 64  h the supplied d
81c0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 20  atabase handle. 
81d0: 54 68 69 73 20 69 73 20 75 73 65 64 0a 2a 2a 20  This is used.** 
81e0: 74 6f 20 74 65 73 74 20 74 68 65 20 64 65 70 72  to test the depr
81f0: 65 63 61 74 65 64 20 73 71 6c 69 74 65 33 5f 61  ecated sqlite3_a
8200: 67 67 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 29  ggregate_count()
8210: 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   API..*/.static 
8220: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
8230: 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f 69  aggregate(.  voi
8240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
82a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
82b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
82c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
82d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
82e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
82f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
8310: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
8320: 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
8330: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8340: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8350: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8360: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8370: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
8380: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
8390: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
83a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
83b0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
83c0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
83d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
83e0: 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
83f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8400: 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22 2c  n(db, "x_count",
8410: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
8420: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31 43   0, 0,.      t1C
8430: 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e 74  ountStep,t1Count
8440: 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66 28  Finalize);.  if(
8450: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
8460: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8470: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8480: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
8490: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
84a0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
84b0: 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f  t1CountStep,t1Co
84c0: 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20  untFinalize);.  
84d0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
84e0: 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
84f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8500: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8510: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8520: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c 65  function(db, "le
8530: 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  gacy_count", 0, 
8540: 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 30  SQLITE_ANY, 0, 0
8550: 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63 79  ,.        legacy
8560: 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61 63  CountStep, legac
8570: 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a 20  yCountFinalize. 
8580: 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66     );.  }.#endif
8590: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
85a0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
85b0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
85c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
85d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
85e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
85f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30  ErrorName(rc), 0
8600: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8610: 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
8620: 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45 58  age:  printf TEX
8630: 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75 74  T.**.** Send out
8640: 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20 20  put to printf.  
8650: 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72 20  Use this rather 
8660: 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65 72  than puts to mer
8670: 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a  ge the output.**
8680: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
8690: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64 65  sequence with de
86a0: 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73 20  bugging printfs 
86b0: 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43 20  inserted into C 
86c0: 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75 73  code..** Puts us
86d0: 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62 75  es a separate bu
86e0: 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67 69  ffer and debuggi
86f0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69  ng statements wi
8700: 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a 20  ll be out of.** 
8710: 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20 69  sequence if it i
8720: 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  s used..*/.stati
8730: 63 20 69 6e 74 20 74 65 73 74 5f 70 72 69 6e 74  c int test_print
8740: 66 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  f(.  void *NotUs
8750: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8760: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8770: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8780: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8790: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
87a0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
87b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
87c0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
87d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
87e0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
87f0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8800: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66  ument */.){.  if
8810: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
8820: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8830: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8840: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8850: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8860: 0a 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22  .       " TEXT\"
8870: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8890: 0a 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22  .  printf("%s\n"
88a0: 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65  , argv[1]);.  re
88b0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
88c0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
88d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
88e0: 69 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  int FORMAT INTEG
88f0: 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47  ER INTEGER INTEG
8900: 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  ER.**.** Call mp
8910: 72 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65  rintf with three
8920: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
8930: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
8940: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8950: 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _int(.  void *No
8960: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
8970: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8980: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8990: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
89a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
89b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
89c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
89e0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
89f0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
8a00: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
8a10: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
8a20: 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20   int a[3], i;.  
8a30: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8a40: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
8a50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8a60: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8a70: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8a80: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8a90: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
8aa0: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
8ab0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8ac0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
8ad0: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
8ae0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
8af0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
8b00: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
8b10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8b20: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
8b30: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
8b40: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
8b50: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
8b60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8b70: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
8b80: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
8b90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8ba0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
8bb0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
8bc0: 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49 4e 54  int64 FORMAT INT
8bd0: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
8be0: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
8bf0: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
8c00: 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65  ee 64-bit intege
8c10: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
8c20: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8c30: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28  3_mprintf_int64(
8c40: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8c50: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8c60: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8c70: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8c80: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8c90: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8ca0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8cc0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
8cd0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
8cf0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
8d00: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
8d10: 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  i;.  sqlite_int6
8d20: 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  4 a[3];.  char *
8d30: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
8d40: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8d50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d60: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8d70: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8d80: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8d90: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
8da0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
8db0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8dc0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
8dd0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
8de0: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
8df0: 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  4(argv[i], &a[i-
8e00: 32 5d 2c 20 31 30 30 30 30 30 30 2c 20 53 51 4c  2], 1000000, SQL
8e10: 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20 20  ITE_UTF8) ){.   
8e20: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8e30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72 67  ult(interp, "arg
8e40: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 76  ument is not a v
8e50: 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74 65  alid 64-bit inte
8e60: 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ger", 0);.      
8e70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8e80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 20  ;.    }.  }.  z 
8e90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8ea0: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8eb0: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
8ec0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8ed0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8ee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8ef0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8f00: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
8f10: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
8f20: 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54  intf_long FORMAT
8f30: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
8f40: 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43   INTEGER.**.** C
8f50: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
8f60: 20 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74 65   three long inte
8f70: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ger arguments.  
8f80: 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20 74   This might be t
8f90: 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73 71  he.** same as sq
8fa0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8fb0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70 72  t or sqlite3_mpr
8fc0: 69 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65 70 65  intf_int64, depe
8fd0: 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74  nding on.** plat
8fe0: 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  form..*/.static 
8ff0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9000: 6e 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64  ntf_long(.  void
9010: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9020: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9030: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9040: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9050: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
9060: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
9070: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
9080: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
9090: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
90a0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
90b0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
90c0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
90d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f  ){.  int i;.  lo
90e0: 6e 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69  ng int a[3];.  i
90f0: 6e 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20  nt b[3];.  char 
9100: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  *z;.  if( argc!=
9110: 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
9120: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9130: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
9140: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
9150: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
9160: 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  " FORMAT INT INT
9170: 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20   INT\"", 0);.   
9180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9190: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
91a0: 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<5; i++){.   
91b0: 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
91c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c  interp, argv[i],
91d0: 20 26 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75   &b[i-2]) ) retu
91e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
91f0: 20 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67    a[i-2] = (long
9200: 20 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20   int)b[i-2];.   
9210: 20 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36   a[i-2] &= (((u6
9220: 34 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e  4)1)<<(sizeof(in
9230: 74 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20  t)*8))-1;.  }.  
9240: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9250: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9260: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a  ], a[1], a[2]);.
9270: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9280: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9290: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
92a0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
92b0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
92c0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
92d0: 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41  printf_str FORMA
92e0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
92f0: 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  R STRING.**.** C
9300: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
9310: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
9320: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73  uments and one s
9330: 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a  tring argument.*
9340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
9350: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
9360: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9370: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9380: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9390: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
93a0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
93b0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
93c0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
93d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
93e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
93f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9410: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9420: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9430: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
9440: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
9450: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
9460: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9480: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9490: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
94a0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
94b0: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
94c0: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
94d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
94e0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
94f0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
9500: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9510: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9520: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
9530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9540: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9550: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9560: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
9570: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
9580: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
9590: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
95a0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
95b0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
95c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
95d0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
95e0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
95f0: 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54  r INTEGER FORMAT
9600: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9610: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9620: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9630: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9640: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9650: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9660: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9670: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
9680: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9690: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
96a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
96b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
96c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
96d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
96e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
96f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9700: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9710: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9730: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9740: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9750: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20   a[3], i;.  int 
9760: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  n;.  char *z;.  
9770: 69 66 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72  if( argc<5 || ar
9780: 67 63 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>6 ){.    Tcl_
9790: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
97a0: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
97b0: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
97c0: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
97d0: 20 20 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20     " INT FORMAT 
97e0: 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f  INT INT ?STRING?
97f0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9810: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
9820: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
9830: 5b 31 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [1], &n) ) retur
9840: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
9850: 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63  f( n<0 ){.    Tc
9860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9870: 6e 74 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62  nterp, "N must b
9880: 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c  e non-negative",
9890: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
98a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
98b0: 20 66 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69   for(i=3; i<5; i
98c0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
98d0: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
98e0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d  argv[i], &a[i-3]
98f0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
9900: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
9910: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
9920: 6e 2b 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  n+1 );.  sqlite3
9930: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20  _snprintf(n, z, 
9940: 61 72 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61  argv[2], a[0], a
9950: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9960: 67 76 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[5] : NULL);. 
9970: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9980: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9990: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
99a0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
99b0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
99c0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
99d0: 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52  rintf_double FOR
99e0: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
99f0: 47 45 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a  GER DOUBLE.**.**
9a00: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9a10: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
9a20: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
9a30: 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74   double argument
9a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
9a50: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9a60: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ouble(.  void *N
9a70: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9a80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9a90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9aa0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9ab0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9ac0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ae0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9af0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9b00: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9b10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9b20: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9b30: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
9b40: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 63 68 61   double r;.  cha
9b50: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9b60: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9b70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9b80: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9b90: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9ba0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9bb0: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9bc0: 4e 54 20 44 4f 55 42 4c 45 5c 22 22 2c 20 30 29  NT DOUBLE\"", 0)
9bd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9be0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
9bf0: 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=2; i<4; i++)
9c00: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
9c10: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
9c20: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29  v[i], &a[i-2]) )
9c30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9c40: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
9c50: 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72  _GetDouble(inter
9c60: 70 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 29 20  p, argv[4], &r) 
9c70: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9c80: 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  OR;.  z = sqlite
9c90: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
9ca0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72  ], a[0], a[1], r
9cb0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
9cc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
9cd0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
9ce0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
9cf0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9d00: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
9d10: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
9d20: 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44   FORMAT DOUBLE D
9d30: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
9d40: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
9d50: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
9d60: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
9d70: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
9d80: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
9d90: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
9da0: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
9db0: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
9dc0: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
9dd0: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
9de0: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
9df0: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
9e00: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
9e10: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72   int sqlite3_mpr
9e20: 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20 20 76  intf_scaled(.  v
9e30: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
9e40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9e50: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9e60: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9e70: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9e80: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9e90: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
9ea0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9eb0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9ec0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
9ed0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
9ee0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
9ef0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
9f00: 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a 20 20   double r[2];.  
9f10: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
9f20: 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  rgc!=4 ){.    Tc
9f30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9f40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
9f50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
9f60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
9f70: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 44 4f       " FORMAT DO
9f80: 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22 2c 20  UBLE DOUBLE\"", 
9f90: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9fa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9fb0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
9fc0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
9fd0: 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65 72 70  GetDouble(interp
9fe0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b 69 2d  , argv[i], &r[i-
9ff0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
a000: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
a010: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
a020: 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30 5d 2a  f(argv[1], r[0]*
a030: 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  r[1]);.  Tcl_App
a040: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a050: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a060: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a070: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a080: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a090: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
a0a0: 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53 54 52  ronly FORMAT STR
a0b0: 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  ING.**.** Call m
a0c0: 70 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69  printf with a si
a0d0: 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75  ngle double argu
a0e0: 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20 74 68  ment which is th
a0f0: 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65  e product of the
a100: 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74  .** two argument
a110: 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20  s given above.  
a120: 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
a130: 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f  generate overflo
a140: 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a  w and underflow.
a150: 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65  ** doubles to te
a160: 73 74 20 74 68 61 74 20 74 68 65 79 20 61 72 65  st that they are
a170: 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65   converted prope
a180: 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rly..*/.static i
a190: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
a1a0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a1b0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a1c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a1d0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a1e0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a1f0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a200: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a210: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a220: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a230: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a240: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a250: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a260: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a270: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a280: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a290: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a2a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a2b0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a2c0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a2d0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a2e0: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a2f0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a300: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a310: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a320: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a330: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a340: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a350: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a360: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a370: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a380: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a390: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a3a0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a3b0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a3c0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a3d0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a3e0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a3f0: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a400: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a410: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a420: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a430: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  ic int sqlite3_m
a440: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a450: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
a460: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
a470: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
a480: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a490: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
a4a0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
a4b0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
a4c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a4d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a4e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a500: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
a510: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ment */.){.  cha
a520: 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72  r *z;.  double r
a530: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
a540: 20 78 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74   x1, x2;.  sqlit
a550: 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66  e_uint64 d;.  if
a560: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
a570: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a580: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
a590: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
a5a0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
a5b0: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
a5c0: 20 53 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a   STRING\"", 0);.
a5d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a5e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
a5f0: 73 73 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20  sscanf(argv[2], 
a600: 22 25 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c  "%08x%08x", &x2,
a610: 20 26 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20   &x1)!=2 ){.    
a620: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a630: 28 69 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72  (interp, "2nd ar
a640: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
a650: 20 31 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f   16-characters o
a660: 66 20 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20  f hex", 0);.    
a670: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a680: 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a  ;.  }.  d = x2;.
a690: 20 20 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20    d = (d<<32) + 
a6a0: 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c  x1;.  memcpy(&r,
a6b0: 20 26 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b   &d, sizeof(r));
a6c0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
a6d0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
a6e0: 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  r);.  Tcl_Append
a6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
a700: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
a710: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
a720: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a730: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
a740: 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f  3_enable_shared_
a750: 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  cache ?BOOLEAN?.
a760: 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  **.*/.#if !defin
a770: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a780: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61  HARED_CACHE).sta
a790: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 6e 61  tic int test_ena
a7a0: 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43 6c  ble_shared(.  Cl
a7b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
a7c0: 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
a7d0: 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
a7e0: 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
a7f0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
a800: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a810: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a820: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a830: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a840: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
a850: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a860: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a870: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
a880: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
a890: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
a8a0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
a8b0: 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20    int enable;.  
a8c0: 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20 20  int ret = 0;..  
a8d0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
a8e0: 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
a8f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
a900: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
a910: 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20  "?BOOLEAN?");.  
a920: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a930: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d 20  OR;.  }.  ret = 
a940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
a950: 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65 45  fig.sharedCacheE
a960: 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20 6f  nabled;..  if( o
a970: 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
a980: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
a990: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
a9a0: 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c 65  objv[1], &enable
a9b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
a9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a9d0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a9e0: 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65  te3_enable_share
a9f0: 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29 3b  d_cache(enable);
aa00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
aa10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
aa20: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
aa30: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
aa40: 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
aa50: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
aa60: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
aa70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
aa80: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
aa90: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
aaa0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 74  ewBooleanObj(ret
aab0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
aac0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
aad0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
aae0: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
aaf0: 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44 42  esult_codes   DB
ab00: 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a      BOOLEAN.**.*
ab10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
ab20: 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  t_extended_resul
ab30: 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e  t_codes(.  Clien
ab40: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
ab50: 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
ab60: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
ab70: 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
ab80: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ab90: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
aba0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
abb0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
abc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
abd0: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
abe0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
abf0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
ac00: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
ac10: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
ac20: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
ac30: 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b  ){.  int enable;
ac40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
ac50: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
ac60: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
ac70: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ac80: 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c  , objv, "DB BOOL
ac90: 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  EAN");.    retur
aca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
acb0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
acc0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
acd0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ace0: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
acf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
ad00: 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
ad10: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
ad20: 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c   objv[2], &enabl
ad30: 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
ad40: 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
ad50: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ad60: 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c  _codes(db, enabl
ad70: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
ad80: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
ad90: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62  age: sqlite3_lib
ada0: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a  version_number.*
adb0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
adc0: 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
add0: 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74  number(.  Client
ade0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
adf0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
ae00: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
ae10: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
ae20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ae30: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
ae40: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
ae50: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
ae60: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
ae70: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
ae80: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ae90: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aea0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aeb0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aec0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aed0: 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {.  Tcl_SetObjRe
aee0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
aef0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
af00: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
af10: 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75  mber()));.  retu
af20: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
af30: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
af40: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
af50: 6d 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61  metadata DB dbna
af60: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
af70: 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  me.**.*/.static 
af80: 69 6e 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  int test_table_c
af90: 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
afa0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
afb0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
afc0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
afd0: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
afe0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
aff0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b000: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b010: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b020: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b030: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b050: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b060: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b070: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b080: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b090: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
b0a0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
b0b0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f   char *zDb;.  co
b0c0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a  nst char *zTbl;.
b0d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
b0e0: 6f 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ol;.  int rc;.  
b0f0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
b100: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
b110: 61 74 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74  atatype;.  const
b120: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b   char *zCollseq;
b130: 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a  .  int notnull;.
b140: 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
b150: 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72  ;.  int autoincr
b160: 65 6d 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62  ement;..  if( ob
b170: 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
b180: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b190: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b1a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62   1, objv, "DB db
b1b0: 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c  name tblname col
b1c0: 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75  name");.    retu
b1d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b1e0: 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
b1f0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
b200: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b210: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
b220: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b230: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
b240: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
b250: 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zTbl = Tcl_GetSt
b260: 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
b270: 20 7a 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20   zCol = objc==5 
b280: 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
b290: 6f 62 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20  objv[4]) : 0;.. 
b2a0: 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29   if( strlen(zDb)
b2b0: 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a  ==0 ) zDb = 0;..
b2c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
b2d0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b2e0: 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54  data(db, zDb, zT
b2f0: 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20  bl, zCol, .     
b300: 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43   &zDatatype, &zC
b310: 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c  ollseq, &notnull
b320: 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26  , &primarykey, &
b330: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a  autoincrement);.
b340: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
b360: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b370: 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  erp, sqlite3_err
b380: 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
b390: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b3a0: 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
b3b0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
b3c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b3d0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b3e0: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
b3f0: 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d  Obj(zDatatype, -
b400: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
b410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b420: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b430: 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73  StringObj(zColls
b440: 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  eq, -1));.  Tcl_
b450: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b460: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b470: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e  l_NewIntObj(notn
b480: 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ull));.  Tcl_Lis
b490: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b4a0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
b4b0: 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79  ewIntObj(primary
b4c0: 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  key));.  Tcl_Lis
b4d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b4e0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
b4f0: 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63  ewIntObj(autoinc
b500: 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f  rement));.  Tcl_
b510: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b520: 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72  erp, pRet);..  r
b530: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b540: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b550: 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73  OMIT_INCRBLOB..s
b560: 74 61 74 69 63 20 69 6e 74 20 62 6c 6f 62 48 61  tatic int blobHa
b570: 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 0a 20 20 54  ndleFromObj(.  T
b580: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b590: 70 2c 20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  p, .  Tcl_Obj *p
b5a0: 4f 62 6a 2c 0a 20 20 73 71 6c 69 74 65 33 5f 62  Obj,.  sqlite3_b
b5b0: 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a  lob **ppBlob.){.
b5c0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
b5d0: 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54 63 6c 5f 47   n;..  z = Tcl_G
b5e0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
b5f0: 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20 20 69 66 28  pObj, &n);.  if(
b600: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70   n==0 ){.    *pp
b610: 42 6c 6f 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Blob = 0;.  }els
b620: 65 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  e{.    int notUs
b630: 65 64 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ed;.    Tcl_Chan
b640: 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b 0a 20 20 20  nel channel;.   
b650: 20 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74   ClientData inst
b660: 61 6e 63 65 44 61 74 61 3b 0a 20 20 20 20 0a 20  anceData;.    . 
b670: 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 54 63 6c     channel = Tcl
b680: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
b690: 72 70 2c 20 7a 2c 20 26 6e 6f 74 55 73 65 64 29  rp, z, &notUsed)
b6a0: 3b 0a 20 20 20 20 69 66 28 20 21 63 68 61 6e 6e  ;.    if( !chann
b6b0: 65 6c 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  el ) return TCL_
b6c0: 45 52 52 4f 52 3b 0a 0a 20 20 20 20 54 63 6c 5f  ERROR;..    Tcl_
b6d0: 46 6c 75 73 68 28 63 68 61 6e 6e 65 6c 29 3b 0a  Flush(channel);.
b6e0: 20 20 20 20 54 63 6c 5f 53 65 65 6b 28 63 68 61      Tcl_Seek(cha
b6f0: 6e 6e 65 6c 2c 20 30 2c 20 53 45 45 4b 5f 53 45  nnel, 0, SEEK_SE
b700: 54 29 3b 0a 0a 20 20 20 20 69 6e 73 74 61 6e 63  T);..    instanc
b710: 65 44 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 43  eData = Tcl_GetC
b720: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
b730: 74 61 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20  ta(channel);.   
b740: 20 2a 70 70 42 6c 6f 62 20 3d 20 2a 28 28 73 71   *ppBlob = *((sq
b750: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e  lite3_blob **)in
b760: 73 74 61 6e 63 65 44 61 74 61 29 3b 0a 20 20 7d  stanceData);.  }
b770: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b780: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
b790: 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
b7a0: 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  n(.  ClientData 
b7b0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e  clientData, /* N
b7c0: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c  ot used */.  Tcl
b7d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b7e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b7f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b800: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b810: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b820: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b830: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b840: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b850: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b860: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b870: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b880: 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69 52 6f   Tcl_WideInt iRo
b890: 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  wid;.  sqlite3_b
b8a0: 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e  lob *pBlob;.  in
b8b0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
b8c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
b8d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
b8e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 43  erp, 1, objv, "C
b8f0: 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29 3b 0a  HANNEL ROWID");.
b900: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b910: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
b920: 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f   blobHandleFromO
b930: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
b940: 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20 72 65  1], &pBlob) ) re
b950: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b960: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
b970: 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
b980: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 52  rp, objv[2], &iR
b990: 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e 20 54  owid) ) return T
b9a0: 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
b9b0: 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  = sqlite3_blob_r
b9c0: 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f  eopen(pBlob, iRo
b9d0: 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  wid);.  if( rc!=
b9e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b9f0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
ba00: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
ba10: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
ba20: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
ba30: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ba40: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f  (rc==SQLITE_OK ?
ba50: 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52   TCL_OK : TCL_ER
ba60: 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a  ROR);.}..#endif.
ba70: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ba80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
ba90: 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48 41 4e  lation_v2 DB-HAN
baa0: 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f  DLE NAME CMP-PRO
bab0: 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a  C DEL-PROC.**.**
bac0: 20 20 20 54 68 69 73 20 54 63 6c 20 70 72 6f 63     This Tcl proc
bad0: 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
bae0: 74 69 6e 67 20 74 68 65 20 65 78 70 65 72 69 6d  ting the experim
baf0: 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c 69 74  ental.**   sqlit
bb00: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
bb10: 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72 66 61  ion_v2() interfa
bb20: 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 65  ce..*/.struct Te
bb30: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20  stCollationX {. 
bb40: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
bb50: 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
bb60: 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pCmp;.  Tcl_Obj 
bb70: 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65  *pDel;.};.typede
bb80: 66 20 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c  f struct TestCol
bb90: 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f 6c 6c  lationX TestColl
bba0: 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63 20 76  ationX;.static v
bbb0: 6f 69 64 20 74 65 73 74 43 72 65 61 74 65 43 6f  oid testCreateCo
bbc0: 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69 64 20  llationDel(void 
bbd0: 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74 43 6f  *pCtx){.  TestCo
bbe0: 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54  llationX *p = (T
bbf0: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29  estCollationX *)
bc00: 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72 63 20  pCtx;..  int rc 
bc10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
bc20: 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44  p->interp, p->pD
bc30: 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52  el, TCL_EVAL_DIR
bc40: 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  ECT|TCL_EVAL_GLO
bc50: 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  BAL);.  if( rc!=
bc60: 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  TCL_OK ){.    Tc
bc70: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
bc80: 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20  r(p->interp);.  
bc90: 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  }..  Tcl_DecrRef
bca0: 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a  Count(p->pCmp);.
bcb0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
bcc0: 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20 20 73  nt(p->pDel);.  s
bcd0: 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76 6f 69  qlite3_free((voi
bce0: 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74 69 63  d *)p);.}.static
bcf0: 20 69 6e 74 20 74 65 73 74 43 72 65 61 74 65 43   int testCreateC
bd00: 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20 20 76  ollationCmp(.  v
bd10: 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  oid *pCtx,.  int
bd20: 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73 74 20   nLeft,.  const 
bd30: 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20 20 69  void *zLeft,.  i
bd40: 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63 6f 6e  nt nRight,.  con
bd50: 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68 74 0a  st void *zRight.
bd60: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
bd70: 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f  onX *p = (TestCo
bd80: 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b  llationX *)pCtx;
bd90: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 63 72  .  Tcl_Obj *pScr
bda0: 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  ipt = Tcl_Duplic
bdb0: 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70 29 3b  ateObj(p->pCmp);
bdc0: 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b  .  int iRes = 0;
bdd0: 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ..  Tcl_IncrRefC
bde0: 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 20  ount(pScript);. 
bdf0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
be00: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
be10: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
be20: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a  ingObj((char *)z
be30: 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b 0a 20  Left, nLeft));. 
be40: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
be50: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 53 63  ndElement(0, pSc
be60: 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  ript, Tcl_NewStr
be70: 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29 7a  ingObj((char *)z
be80: 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29 3b 0a  Right,nRight));.
be90: 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
bea0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e  cl_EvalObjEx(p->
beb0: 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70 74 2c  interp, pScript,
bec0: 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54   TCL_EVAL_DIRECT
bed0: 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c  |TCL_EVAL_GLOBAL
bee0: 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d  ).   || TCL_OK!=
bef0: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
bf00: 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c  j(p->interp, Tcl
bf10: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 70 2d  _GetObjResult(p-
bf20: 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65 73 29  >interp), &iRes)
bf30: 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  .  ){.    Tcl_Ba
bf40: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
bf50: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20  >interp);.  }.  
bf60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
bf70: 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20 72 65  (pScript);..  re
bf80: 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73 74 61  turn iRes;.}.sta
bf90: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72 65  tic int test_cre
bfa0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
bfb0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
bfc0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
bfd0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
bfe0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
bff0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c000: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c010: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c020: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c030: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c040: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c050: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c060: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c070: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c080: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c090: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c0a0: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c0b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c0c0: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c0d0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c0e0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c0f0: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c100: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c110: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c120: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c130: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c140: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c150: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c160: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c170: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c180: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c190: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c1a0: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c1b0: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c1c0: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c1d0: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c1e0: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c1f0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c200: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c210: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c220: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c230: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c240: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c250: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c260: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c270: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c280: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c290: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c2a0: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c2b0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c2c0: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c2d0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c2e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c2f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c300: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c310: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c320: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c330: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c340: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c350: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c360: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c370: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c380: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c390: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c3a0: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c3b0: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c3c0: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c3d0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c3e0: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c3f0: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c400: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c420: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c430: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c440: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c450: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c460: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c470: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c480: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c490: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c4a0: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c4b0: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c4c0: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c4d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c4e0: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c4f0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c500: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c510: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c530: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c540: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c550: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c560: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c570: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c580: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c5a0: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c5b0: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c5c0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c5d0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c5e0: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c5f0: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c600: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c610: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c620: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c630: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c640: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c650: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c660: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c670: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c680: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c690: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c6a0: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c6b0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c6c0: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c6d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c6e0: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c6f0: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c700: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c710: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c720: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c730: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c740: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c750: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c760: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
c770: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
c780: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
c790: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
c7a0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
c7b0: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
c7c0: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
c7d0: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
c7e0: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
c7f0: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
c800: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
c810: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
c820: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
c830: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
c840: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
c850: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
c860: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
c870: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
c880: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
c890: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
c8a0: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
c8b0: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
c8c0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
c8d0: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
c8e0: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
c8f0: 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69  nction_v2(.  Cli
c900: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
c910: 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta,          /* 
c920: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c940: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
c950: 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43   The invoking TC
c960: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  L interpreter */
c970: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c990: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c9a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
c9b0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
c9c0: 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f  jv[]           /
c9d0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
c9e0: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
c9f0: 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
ca00: 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20   char *zFunc;.  
ca10: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20  int nArg;.  int 
ca20: 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e  enc;.  CreateFun
ca30: 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e  ctionV2 *p;.  in
ca40: 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  t i;.  int rc;..
ca50: 20 20 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c    struct EncTabl
ca60: 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  e {.    const ch
ca70: 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e  ar *zEnc;.    in
ca80: 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b  t enc;.  } aEnc[
ca90: 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38  ] = {.    {"utf8
caa0: 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46  ",    SQLITE_UTF
cab0: 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  8 },.    {"utf16
cac0: 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31  ",   SQLITE_UTF1
cad0: 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  6 },.    {"utf16
cae0: 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  le", SQLITE_UTF1
caf0: 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  6LE },.    {"utf
cb00: 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16be", SQLITE_UT
cb10: 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61  F16BE },.    {"a
cb20: 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ny",     SQLITE_
cb30: 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c  ANY },.    {"0",
cb40: 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28   0 }.  };..  if(
cb50: 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63   objc<5 || (objc
cb60: 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  %2)==0 ){.    Tc
cb70: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
cb80: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
cb90: 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e  "DB NAME NARG EN
cba0: 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b  C SWITCHES...");
cbb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cbc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
cbd0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
cbe0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
cbf0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
cc00: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
cc10: 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20  _ERROR;.  zFunc 
cc20: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
cc30: 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
cc40: 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
cc50: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
cc60: 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65 74 75  ], &nArg) ) retu
cc70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cc80: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  if( Tcl_GetIndex
cc90: 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e  FromObjStruct(in
cca0: 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61  terp, objv[4], a
ccb0: 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63  Enc, sizeof(aEnc
ccc0: 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20  [0]), .         
ccd0: 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20   "encoding", 0, 
cce0: 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72  &enc).  ){.    r
ccf0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cd00: 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e  .  }.  enc = aEn
cd10: 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70  c[enc].enc;..  p
cd20: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
cd30: 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46  c(sizeof(CreateF
cd40: 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61  unctionV2));.  a
cd50: 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65  ssert( p );.  me
cd60: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
cd70: 66 28 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  f(CreateFunction
cd80: 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  V2));.  p->inter
cd90: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66  p = interp;..  f
cda0: 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20  or(i=5; i<objc; 
cdb0: 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  i+=2){.    int i
cdc0: 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73  Switch;.    cons
cdd0: 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68  t char *azSwitch
cde0: 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22  [] = {"-func", "
cdf0: 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22  -step", "-final"
ce00: 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d  , "-destroy", 0}
ce10: 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  ;.    if( Tcl_Ge
ce20: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
ce30: 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61  terp, objv[i], a
ce40: 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74 63 68  zSwitch, "switch
ce50: 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68 29 20  ", 0, &iSwitch) 
ce60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ce70: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
ce80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ce90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
cea0: 74 63 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a  tch( iSwitch ){.
ceb0: 20 20 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d        case 0: p-
cec0: 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b  >pFunc = objv[i+
ced0: 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1];      break;.
cee0: 20 20 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d        case 1: p-
cef0: 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b  >pStep = objv[i+
cf00: 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1];      break;.
cf10: 20 20 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d        case 2: p-
cf20: 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69  >pFinal = objv[i
cf30: 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  +1];     break;.
cf40: 20 20 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d        case 3: p-
cf50: 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76  >pDestroy = objv
cf60: 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a  [i+1];   break;.
cf70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
cf80: 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46  p->pFunc ) p->pF
cf90: 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  unc = Tcl_Duplic
cfa0: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29  ateObj(p->pFunc)
cfb0: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65  ; .  if( p->pSte
cfc0: 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54  p ) p->pStep = T
cfd0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
cfe0: 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66  p->pStep); .  if
cff0: 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d  ( p->pFinal ) p-
d000: 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75  >pFinal = Tcl_Du
d010: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46  plicateObj(p->pF
d020: 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d  inal); .  if( p-
d030: 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70  >pDestroy ) p->p
d040: 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75  Destroy = Tcl_Du
d050: 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44  plicateObj(p->pD
d060: 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28  estroy); ..  if(
d070: 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f   p->pFunc ) Tcl_
d080: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
d090: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
d0a0: 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e  ->pStep ) Tcl_In
d0b0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53  crRefCount(p->pS
d0c0: 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  tep); .  if( p->
d0d0: 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63  pFinal ) Tcl_Inc
d0e0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69  rRefCount(p->pFi
d0f0: 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  nal); .  if( p->
d100: 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49  pDestroy ) Tcl_I
d110: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
d120: 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63  Destroy); ..  rc
d130: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
d140: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
d150: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
d160: 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a  nc, (void *)p, .
d170: 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20        (p->pFunc 
d180: 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a  ? cf2Func : 0),.
d190: 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20        (p->pStep 
d1a0: 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a  ? cf2Step : 0),.
d1b0: 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c        (p->pFinal
d1c0: 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29   ? cf2Final : 0)
d1d0: 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73 74 72  ,.      cf2Destr
d1e0: 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  oy.  );.  if( rc
d1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d200: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
d210: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
d220: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d230: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
d240: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
d250: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d260: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
d270: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
d280: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
d290: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
d2a0: 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c  on DB-HANDLE FIL
d2b0: 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74  E ?PROC?.*/.stat
d2c0: 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f 61 64  ic int test_load
d2d0: 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43 6c  _extension(.  Cl
d2e0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
d2f0: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
d300: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
d310: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
d320: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
d330: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
d340: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
d350: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
d360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d370: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d380: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
d390: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
d3a0: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
d3b0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
d3c0: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
d3d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d3e0: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
d3f0: 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  zDb;.  char *zFi
d400: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f  le;.  char *zPro
d410: 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  c = 0;.  char *z
d420: 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Err = 0;..  if( 
d430: 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21  objc!=4 && objc!
d440: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
d450: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
d460: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
d470: 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52 4f  HANDLE FILE ?PRO
d480: 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  C?");.    return
d490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
d4a0: 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53    zDb = Tcl_GetS
d4b0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
d4c0: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
d4d0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
d4e0: 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ;.  if( objc==4 
d4f0: 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 54  ){.    zProc = T
d500: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d510: 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  v[3]);.  }..  /*
d520: 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64   Extract the C d
d530: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66  atabase handle f
d540: 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d  rom the Tcl comm
d550: 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66  and name */.  if
d560: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
d570: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
d580: 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
d590: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d5a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
d5b0: 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
d5c0: 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29   ", zDb, (char*)
d5d0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
d5e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d5f0: 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71  db = ((struct Sq
d600: 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e  liteDb*)cmdInfo.
d610: 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e  objClientData)->
d620: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29  db;.  assert(db)
d630: 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  ;..  /* Call the
d640: 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66 75   underlying C fu
d650: 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65 72  nction. If an er
d660: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d670: 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f  rc to .  ** TCL_
d680: 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20 61  ERROR and load a
d690: 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67 20  ny error string 
d6a0: 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 72  into the interpr
d6b0: 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20 2a  eter. If no .  *
d6c0: 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  * error occurs, 
d6d0: 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f 4b  set rc to TCL_OK
d6e0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
d6f0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
d700: 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d 20  XTENSION.  rc = 
d710: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
d720: 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zErr = sqlite3_m
d730: 70 72 69 6e 74 66 28 22 74 68 69 73 20 62 75 69  printf("this bui
d740: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
d750: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
d760: 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20  )");.#else.  rc 
d770: 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  = sqlite3_load_e
d780: 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69  xtension(db, zFi
d790: 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72  le, zProc, &zErr
d7a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
d7b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d7c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
d7d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20  lt(interp, zErr 
d7e0: 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c  ? zErr : "", TCL
d7f0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20  _VOLATILE);.    
d800: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
d810: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d820: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  = TCL_OK;.  }.  
d830: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
d840: 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  r);..  return rc
d850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d860: 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  : sqlite3_enable
d870: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20  _load_extension 
d880: 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a  DB-HANDLE ONOFF.
d890: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
d8a0: 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a  st_enable_load(.
d8b0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
d8c0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
d8d0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
d8e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
d8f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
d900: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
d910: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
d920: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d940: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d950: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d960: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d970: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
d980: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
d990: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
d9a0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
d9b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
d9c0: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69   int onoff;..  i
d9d0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
d9e0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
d9f0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
da00: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f  jv, "DB-HANDLE O
da10: 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75  NOFF");.    retu
da20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
da30: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
da40: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
da50: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
da60: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
da70: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
da80: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
da90: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
daa0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
dab0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
dac0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
dad0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dae0: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
daf0: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
db00: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
db10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
db20: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
db30: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
db40: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
db50: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
db60: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  ert(db);..  /* G
db70: 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72  et the onoff par
db80: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  ameter */.  if( 
db90: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
dba0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
dbb0: 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
dbc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
dbd0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66  _ERROR;.  }..#if
dbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbf0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
dc00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
dc10: 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20  t(interp, "this 
dc20: 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69  build omits sqli
dc30: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
dc40: 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e  on()");.  return
dc50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
dc60: 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  e.  sqlite3_enab
dc70: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
dc80: 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  n(db, onoff);.  
dc90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23  return TCL_OK;.#
dca0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
dcb0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62  sage:  sqlite_ab
dcc0: 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f  ort.**.** Shutdo
dcd0: 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  wn the process i
dce0: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69  mmediately.  Thi
dcf0: 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e  s is not a clean
dd00: 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68   shutdown..** Th
dd10: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
dd20: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 72  ed to test the r
dd30: 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66  ecoverability of
dd40: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a   a database in.*
dd50: 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  * the event of a
dd60: 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a   program crash..
dd70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
dd80: 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f  lite_abort(.  vo
dd90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
dda0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ddb0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ddc0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ddd0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
dde0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
ddf0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
de00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
de10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
de20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
de30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
de40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
de50: 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  /.){.#if defined
de60: 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20  (_MSC_VER).  /* 
de70: 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74 68 65  We do this, othe
de80: 72 77 69 73 65 20 74 68 65 20 74 65 73 74 20 77  rwise the test w
de90: 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20 61 20  ill halt with a 
dea0: 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a 20 20  popup message.  
deb0: 20 2a 20 74 68 61 74 20 77 65 20 68 61 76 65 20   * that we have 
dec0: 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20 62 65  to click away be
ded0: 66 6f 72 65 20 74 68 65 20 74 65 73 74 20 77 69  fore the test wi
dee0: 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20  ll continue..   
def0: 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f  */.  _set_abort_
df00: 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f 43 41  behavior( 0, _CA
df10: 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54 20 29  LL_REPORTFAULT )
df20: 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69 74 28  ;.#endif.  exit(
df30: 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20  255);.  assert( 
df40: 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f  interp==0 );   /
df50: 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61  * This will alwa
df60: 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74  ys fail */.  ret
df70: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
df80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
df90: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ng routine is a 
dfa0: 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c  user-defined SQL
dfb0: 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20   function whose 
dfc0: 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f  purpose.** is to
dfd0: 20 74 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   test the sqlite
dfe0: 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50  _set_result() AP
dff0: 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  I..*/.static voi
e000: 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74  d testFunc(sqlit
e010: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
e020: 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73  ext, int argc, s
e030: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
e040: 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61  rgv){.  while( a
e050: 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f  rgc>=2 ){.    co
e060: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20  nst char *zArg0 
e070: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
e080: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
e090: 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41  [0]);.    if( zA
e0a0: 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rg0 ){.      if(
e0b0: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
e0c0: 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29  mp(zArg0, "int")
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e0e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
e0f0: 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f  ontext, sqlite3_
e100: 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31  value_int(argv[1
e110: 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ]));.      }else
e120: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e130: 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34  Cmp(zArg0,"int64
e140: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e150: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e160: 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73  int64(context, s
e170: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
e180: 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20  64(argv[1]));.  
e190: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
e1a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72  lite3StrICmp(zAr
e1b0: 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20  g0,"string")==0 
e1c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
e1d0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
e1e0: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
e1f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e200: 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a  t(argv[1]), -1,.
e210: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e220: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
e230: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
e240: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
e250: 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30  rg0,"double")==0
e260: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e270: 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c  te3_result_doubl
e280: 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  e(context, sqlit
e290: 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28  e3_value_double(
e2a0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e2b0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e2c0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e2d0: 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
e2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e2f0: 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78  sult_null(contex
e300: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  t);.      }else 
e310: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e320: 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22  mp(zArg0,"value"
e330: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
e340: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
e350: 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72  alue(context, ar
e360: 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  gv[sqlite3_value
e370: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b  _int(argv[1])]);
e380: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e390: 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72        goto error
e3a0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
e3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
e3c0: 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
e3d0: 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d     }.    argc -=
e3e0: 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20   2;.    argv += 
e3f0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  2;.  }.  return;
e400: 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
e410: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
e420: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72  ror(context,"fir
e430: 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  st argument shou
e440: 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a  ld be one of: ".
e450: 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34        "int int64
e460: 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e   string double n
e470: 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b  ull value", -1);
e480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e490: 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74     sqlite_regist
e4a0: 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  er_test_function
e4b0: 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a    DB  NAME.**.**
e4c0: 20 52 65 67 69 73 74 65 72 20 74 68 65 20 74 65   Register the te
e4d0: 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  st SQL function 
e4e0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e4f0: 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d  DB under the nam
e500: 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69  e NAME..*/.stati
e510: 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73  c int test_regis
e520: 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64  ter_func(.  void
e530: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
e540: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e550: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e560: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e570: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e580: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
e590: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
e5a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e5b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
e5c0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
e5d0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
e5e0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
e5f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
e600: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
e610: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
e620: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e630: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e640: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e650: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
e660: 20 0a 20 20 20 20 20 20 20 22 20 44 42 20 46 55   .       " DB FU
e670: 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29  NCTION-NAME", 0)
e680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
e690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
e6a0: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
e6b0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
e6c0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
e6d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
e6e0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
e6f0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76  unction(db, argv
e700: 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  [2], -1, SQLITE_
e710: 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20 20  UTF8, 0, .      
e720: 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b  testFunc, 0, 0);
e730: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
e740: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e750: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
e760: 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c 20  ite3ErrStr(rc), 
e770: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
e780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
e790: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
e7a0: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
e7b0: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
e7c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
e7d0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
e7e0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
e7f0: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 20 53  ite3_finalize  S
e800: 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  TMT .**.** Final
e810: 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ize a statement 
e820: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
e830: 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e 61 6c  c int test_final
e840: 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
e850: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
e860: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
e870: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
e880: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
e890: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
e8a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
e8b0: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
e8c0: 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20 69 66  3 *db = 0;..  if
e8d0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
e8e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e8f0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
e900: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
e910: 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
e920: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
e930: 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
e940: 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
e950: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
e960: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
e970: 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
e980: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
e990: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
e9a0: 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
e9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
e9c0: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
e9d0: 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62 28 70   db = StmtToDb(p
e9e0: 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  Stmt);.  }.  rc 
e9f0: 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
ea00: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ze(pStmt);.  Tcl
ea10: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
ea20: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
ea30: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
ea40: 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 64  STATIC);.  if( d
ea50: 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74  b && sqlite3Test
ea60: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
ea70: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
ea80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
ea90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
eaa0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
eab0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
eac0: 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20 20 52  s  STMT  CODE  R
ead0: 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47  ESETFLAG.**.** G
eae0: 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
eaf0: 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74 65 72  a status counter
eb00: 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d 65 6e   from a statemen
eb10: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
eb20: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
eb30: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
eb40: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
eb50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
eb60: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
eb70: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
eb80: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eb90: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eba0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
ebb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
ebc0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
ebd0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
ebe0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ebf0: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ec00: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ec10: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ec20: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ec30: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ec40: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ec50: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ec60: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ec70: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ec80: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ec90: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
eca0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ecb0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
ecc0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
ecd0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ece0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
ecf0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ed00: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
ed10: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
ed20: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ed30: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
ed40: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ed50: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
ed60: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
ed70: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
ed80: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ed90: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
eda0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
edb0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
edc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
edd0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ede0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
edf0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
ee00: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
ee10: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
ee20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
ee30: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
ee40: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
ee50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
ee60: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
ee70: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
ee80: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
ee90: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
eea0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
eeb0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
eec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
eed0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
eee0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
eef0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
ef00: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
ef10: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
ef20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
ef30: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
ef40: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
ef50: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
ef60: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
ef70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
ef80: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
ef90: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
efa0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
efb0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
efc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
efd0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
efe0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
eff0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f000: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f010: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f020: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f030: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f040: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
f060: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a  tmt_scanstatus(.
f070: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
f080: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
f090: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
f0a0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
f0b0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
f0c0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f0d0: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
f0e0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
f0f0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ument */.  int i
f100: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
f110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
f120: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f  cond argument */
f130: 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ..  const char *
f140: 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zName;.  const c
f150: 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20  har *zExplain;. 
f160: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
f170: 4c 6f 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Loop;.  sqlite3_
f180: 69 6e 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20  int64 nVisit;.  
f190: 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69  double rEst;.  i
f1a0: 6e 74 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f  nt res;..  if( o
f1b0: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
f1c0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f1d0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f1e0: 22 53 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20  "STMT IDX");.   
f1f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f200: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f210: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f220: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f230: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f240: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f250: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
f260: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f270: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f280: 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
f290: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65  TCL_ERROR;..  re
f2a0: 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  s = sqlite3_stmt
f2b0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f2c0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f2d0: 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28  CANSTAT_NLOOP, (
f2e0: 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20  void*)&nLoop);. 
f2f0: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
f300: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74     Tcl_Obj *pRet
f310: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
f320: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f330: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f340: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
f350: 72 69 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c  ringObj("nLoop",
f360: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
f370: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f380: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f390: 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e  _NewWideIntObj(n
f3a0: 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69  Loop));.    sqli
f3b0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f3c0: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f3d0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f3e0: 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26  NVISIT, (void*)&
f3f0: 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c  nVisit);.    Tcl
f400: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f410: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
f420: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f430: 22 6e 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a  "nVisit", -1));.
f440: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f450: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f460: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64  pRet, Tcl_NewWid
f470: 65 49 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29  eIntObj(nVisit))
f480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f490: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f4a0: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f4b0: 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28  _SCANSTAT_EST, (
f4c0: 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20  void*)&rEst);.  
f4d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f4e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f4f0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f500: 67 4f 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29  gObj("nEst", -1)
f510: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
f520: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f530: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
f540: 44 6f 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29  DoubleObj(rEst))
f550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f560: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f570: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f580: 5f 53 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20  _SCANSTAT_NAME, 
f590: 28 76 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a  (void*)&zName);.
f5a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f5b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
f5c0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pRet, Tcl_NewStr
f5d0: 69 6e 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20  ingObj("zName", 
f5e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
f5f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f600: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f610: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61  NewStringObj(zNa
f620: 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71  me, -1));.    sq
f630: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f640: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f650: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f660: 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64  T_EXPLAIN, (void
f670: 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20  *)&zExplain);.  
f680: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f690: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f6a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f6b0: 67 4f 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c  gObj("zExplain",
f6c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
f6d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f6e0: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f6f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
f700: 78 70 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20  xplain, -1));.  
f710: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
f720: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
f730: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
f740: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
f750: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65  nterp);.  }.  re
f760: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f770: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
f780: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f790: 74 61 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d  tatus_reset  STM
f7a0: 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
f7b0: 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
f7c0: 61 74 75 73 5f 72 65 73 65 74 28 0a 20 20 76 6f  atus_reset(.  vo
f7d0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
f7e0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f7f0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
f800: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
f810: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
f820: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
f830: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
f840: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
f850: 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 6a 63 21  t */.  if( objc!
f860: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
f870: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
f880: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
f890: 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
f8a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f8b0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f8c0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f8d0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f8e0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f8f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f900: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
f910: 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28  canstatus_reset(
f920: 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
f930: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
f940: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
f950: 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
f960: 6d 74 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a  mt  DB  STMT.**.
f970: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  ** Return the ne
f980: 78 74 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73  xt statment in s
f990: 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 53 54  equence after ST
f9a0: 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
f9b0: 74 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74  t test_next_stmt
f9c0: 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
f9d0: 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
f9e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
f9f0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
fa00: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
fa10: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
fa20: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71 6c  mt *pStmt;.  sql
fa30: 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20 20  ite3 *db = 0;.  
fa40: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a  char zBuf[50];..
fa50: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
fa60: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
fa70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
fa80: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
fa90: 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
faa0: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
fab0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
fac0: 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54 22  , 0), " DB STMT"
fad0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
fae0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
faf0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
fb00: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
fb10: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
fb20: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
fb30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
fb40: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
fb50: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
fb60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
fb70: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
fb80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fb90: 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f  pStmt = sqlite3_
fba0: 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70 53  next_stmt(db, pS
fbb0: 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  tmt);.  if( pStm
fbc0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
fbd0: 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
fbe0: 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
fbf0: 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
fc00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fc10: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fc20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
fc30: 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
fc40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
fc50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
fc60: 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
fc70: 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  ly  STMT.**.** R
fc80: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54  eturn true if ST
fc90: 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  MT is a NULL poi
fca0: 6e 74 65 72 20 6f 72 20 61 20 70 6f 69 6e 74 65  nter or a pointe
fcb0: 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74  r to a statement
fcc0: 0a 2a 2a 20 74 68 61 74 20 69 73 20 67 75 61 72  .** that is guar
fcd0: 61 6e 74 65 65 64 20 74 6f 20 6c 65 61 76 65 20  anteed to leave 
fce0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 6e 6d  the database unm
fcf0: 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74  odified..*/.stat
fd00: 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
fd10: 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69  _readonly(.  voi
fd20: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
fd30: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
fd40: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
fd50: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
fd60: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
fd70: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
fd80: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
fd90: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
fda0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
fdb0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
fdc0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
fdd0: 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
fde0: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
fdf0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
fe00: 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29   0), " STMT", 0)
fe10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
fe20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
fe30: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
fe40: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
fe50: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
fe60: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
fe70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fe80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  rc = sqlite3_stm
fe90: 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74  t_readonly(pStmt
fea0: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
feb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
fec0: 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
fed0: 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  rc));.  return T
fee0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
fef0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
ff00: 73 74 6d 74 5f 62 75 73 79 20 20 53 54 4d 54 0a  stmt_busy  STMT.
ff10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
ff20: 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20 6e  e if STMT is a n
ff30: 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20  on-NULL pointer 
ff40: 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a  to a statement.*
ff50: 2a 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  * that has been 
ff60: 73 74 65 70 70 65 64 20 62 75 74 20 6e 6f 74 20  stepped but not 
ff70: 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a  to completion..*
ff80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
ff90: 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a 20 20 76  t_stmt_busy(.  v
ffa0: 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
ffb0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
ffc0: 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
ffd0: 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
ffe0: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
fff0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
10000 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
10010 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10020 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10030 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10040 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10050 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10060 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10070 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10080 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
10090 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
100a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
100b0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
100c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
100d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
100e0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
100f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10100 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10110 74 6d 74 5f 62 75 73 79 28 70 53 74 6d 74 29 3b  tmt_busy(pStmt);
10120 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
10130 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
10140 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63  NewBooleanObj(rc
10150 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
10160 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10170 61 67 65 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f  age:  uses_stmt_
10180 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a  journal  STMT.**
10190 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
101a0 69 66 20 53 54 4d 54 20 75 73 65 73 20 61 20 73  if STMT uses a s
101b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
101c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
101d0 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61  uses_stmt_journa
101e0 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
101f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
10200 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
10210 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
10220 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
10230 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
10240 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
10250 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
10260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
10270 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
10280 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
10290 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
102a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
102b0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
102c0 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a  ), " STMT", 0);.
102d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
102e0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
102f0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10300 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10310 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10320 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
10330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
10340 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
10350 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63  nly(pStmt);.  Tc
10360 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10370 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
10380 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64 62 65 20  oleanObj(((Vdbe 
10390 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65 73 53 74  *)pStmt)->usesSt
103a0 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72  mtJournal));.  r
103b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
103c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
103d0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53  sqlite3_reset  S
103e0 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74  TMT .**.** Reset
103f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e   a statement han
10400 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
10410 6e 74 20 74 65 73 74 5f 72 65 73 65 74 28 0a 20  nt test_reset(. 
10420 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10430 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
10440 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
10450 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
10460 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10470 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
10480 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
10490 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
104a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
104b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
104c0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
104d0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
104e0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
104f0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
10500 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
10510 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
10520 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10530 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
10540 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10550 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10560 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
10570 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10580 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
10590 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29  te3_reset(pStmt)
105a0 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 26 26  ;.  if( pStmt &&
105b0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
105c0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
105d0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
105e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
105f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10600 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
10610 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
10620 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
10630 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a 0a 20  CL_STATIC);./*. 
10640 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
10650 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10660 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75 72 6e  .  }.*/.  return
10670 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
10680 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
10690 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54 20 0a  3_expired STMT .
106a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  **.** Return TRU
106b0 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69 6c 61  E if a recompila
106c0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74  tion of the stat
106d0 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d 6d 65  ement is recomme
106e0 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nded..*/.static 
106f0 69 6e 74 20 74 65 73 74 5f 65 78 70 69 72 65 64  int test_expired
10700 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10710 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10720 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10730 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10740 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10750 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
10760 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
10770 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
10780 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20  t *pStmt;.  if( 
10790 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
107a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
107b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
107c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
107d0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
107e0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
107f0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
10800 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
10810 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10820 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10830 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
10840 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10850 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
10860 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
10880 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10890 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
108a0 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  eanObj(sqlite3_e
108b0 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b  xpired(pStmt)));
108c0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
108d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
108e0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
108f0 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
10900 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53  ngs FROMSTMT TOS
10910 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  TMT.**.** Transf
10920 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20  er all bindings 
10930 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76  from FROMSTMT ov
10940 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a  er to TOSTMT.*/.
10950 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10960 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20  transfer_bind(. 
10970 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10980 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
10990 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
109a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
109b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
109c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
109d0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
109e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
109f0 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b  pStmt1, *pStmt2;
10a00 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
10a10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
10a20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10a30 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
10a40 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
10a50 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
10a60 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
10a70 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54  ], 0), " FROM-ST
10a80 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b  MT TO-STMT", 0);
10a90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10aa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
10ab0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
10ac0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10ad0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10ae0 26 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e  &pStmt1)) return
10af0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
10b00 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
10b10 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10b20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
10b30 20 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72   &pStmt2)) retur
10b40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
10b50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10b60 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
10b70 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
10b80 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
10b90 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74  dings(pStmt1,pSt
10ba0 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  mt2)));.#endif. 
10bb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10bc0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
10bd0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
10be0 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
10bf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
10c00 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
10c10 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
10c20 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
10c30 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
10c40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 68 61  tic int test_cha
10c50 6e 67 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  nges(.  void * c
10c60 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10c70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10c80 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10c90 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10ca0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10cb0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
10cc0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
10cd0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10ce0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
10cf0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
10d00 22 2c 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ",.       Tcl_Ge
10d10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
10d20 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
10d30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10d40 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
10d50 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
10d60 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
10d70 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
10d80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10d90 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
10da0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
10db0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
10dc0 74 65 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29  te3_changes(db))
10dd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
10de0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
10df0 73 20 69 73 20 74 68 65 20 22 73 74 61 74 69 63  s is the "static
10e00 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61  _bind_value" tha
10e10 74 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  t variables are 
10e20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a  bound to when.**
10e30 20 74 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e   the FLAG option
10e40 20 6f 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   of sqlite3_bind
10e50 20 69 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a   is "static".*/.
10e60 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c  static char *sql
10e70 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
10e80 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69  value = 0;.stati
10e90 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61  c int sqlite_sta
10ea0 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d  tic_bind_nbyte =
10eb0 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   0;../*.** Usage
10ec0 3a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20  :  sqlite3_bind 
10ed0 20 56 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20   VM  IDX  VALUE 
10ee0 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74   FLAGS.**.** Set
10ef0 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  s the value of t
10f00 68 65 20 49 44 58 2d 74 68 20 6f 63 63 75 72 72  he IDX-th occurr
10f10 65 6e 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74  ence of "?" in t
10f20 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a  he original SQL.
10f30 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55  ** string.  VALU
10f40 45 20 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c  E is the new val
10f50 75 65 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  ue.  If FLAGS=="
10f60 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45  null" then VALUE
10f70 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61   is.** ignored a
10f80 6e 64 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  nd the value is 
10f90 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66  set to NULL.  If
10fa0 20 46 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22   FLAGS=="static"
10fb0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c   then.** the val
10fc0 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ue is set to the
10fd0 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74   value of a stat
10fe0 69 63 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  ic variable name
10ff0 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61  d.** "sqlite_sta
11000 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e  tic_bind_value".
11010 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72    If FLAGS=="nor
11020 6d 61 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79  mal" then a copy
11030 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45  .** of the VALUE
11040 20 69 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c   is made.  If FL
11050 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68  AGS=="blob10" th
11060 65 6e 20 61 20 56 41 4c 55 45 20 69 73 20 69 67  en a VALUE is ig
11070 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30  nored.** an a 10
11080 2d 62 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c  -byte blob "abc\
11090 30 30 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73  000xyz\000pq" is
110a0 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74   inserted..*/.st
110b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
110c0 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nd(.  void *NotU
110d0 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
110e0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
110f0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
11100 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
11110 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
11120 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
11130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
11140 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
11150 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
11160 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
11170 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
11180 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
11190 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
111a0 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
111b0 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20 61  int idx;.  if( a
111c0 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
111d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
111e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
111f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
11200 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
11210 20 20 20 20 20 20 22 20 56 4d 20 49 44 58 20 56        " VM IDX V
11220 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74 69  ALUE (null|stati
11230 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30 29  c|normal)\"", 0)
11240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11250 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
11260 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11270 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
11280 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
11290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
112a0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
112b0 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
112c0 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
112d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
112e0 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
112f0 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  null")==0 ){.   
11300 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
11310 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
11320 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dx);.  }else if(
11330 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
11340 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b 0a  "static")==0 ){.
11350 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11360 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
11370 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74  , idx, sqlite_st
11380 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c  atic_bind_value,
11390 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65   -1, 0);.  }else
113a0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
113b0 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79 74  [4],"static-nbyt
113c0 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  es")==0 ){.    r
113d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
113e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78  _text(pStmt, idx
113f0 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  , sqlite_static_
11400 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20 20  bind_value,.    
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63     sqlite_static
11440 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29 3b  _bind_nbyte, 0);
11450 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
11460 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f 72  cmp(argv[4],"nor
11470 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mal")==0 ){.    
11480 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
11490 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
114a0 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c 20  x, argv[3], -1, 
114b0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
114c0 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
114d0 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 62  trcmp(argv[4],"b
114e0 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20 20  lob10")==0 ){.  
114f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
11500 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
11510 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79 7a  idx, "abc\000xyz
11520 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51 4c  \000pq", 10, SQL
11530 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d  ITE_STATIC);.  }
11540 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
11550 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11560 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e 74  p, "4th argument
11570 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
11580 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f       "\"null\" o
11590 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72 20  r \"static\" or 
115a0 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29 3b  \"normal\"", 0);
115b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
115c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
115d0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
115e0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
115f0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
11600 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
11610 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
11620 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35  .    char zBuf[5
11630 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
11640 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
11650 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25  zBuf), zBuf, "(%
11660 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54  d) ", rc);.    T
11670 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11680 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71  interp, zBuf, sq
11690 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29 2c  lite3ErrStr(rc),
116a0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
116b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
116c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
116d0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
116e0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
116f0 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
11700 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70  st_collate <db p
11710 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
11720 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
11730 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
11740 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
11750 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
11760 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
11770 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  ct collation.** 
11780 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61 63  sequence callbac
11790 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
117a0 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
117b0 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
117c0 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
117d0 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
117e0 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
117f0 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 74  tine registers t
11800 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
11810 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c 6c  uence "test_coll
11820 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61 74  ate".** with dat
11830 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62  abase handle <db
11840 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  >. The second ar
11850 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 61  gument must be a
11860 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a 2a   list of three.*
11870 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
11880 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 69  . If the first i
11890 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76  s true, then a v
118a0 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 63  ersion of test_c
118b0 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65 67  ollate is.** reg
118c0 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
118d0 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  8, if the second
118e0 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72 73   is true, a vers
118f0 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
11900 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36 6c  d for.** UTF-16l
11910 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  e, if the third 
11920 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31  is true, a UTF-1
11930 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61  6be version is a
11940 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72 65  vailable..** Pre
11950 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
11960 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 61  f test_collate a
11970 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  re deleted..**.*
11980 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  * The collation 
11990 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63 6f  sequence test_co
119a0 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d 65  llate is impleme
119b0 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20  nted by calling 
119c0 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
119d0 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a 0a   TCL script:.**.
119e0 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c 61  **   "test_colla
119f0 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c  te <enc> <lhs> <
11a00 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rhs>".**.** The 
11a10 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e 20  <lhs> and <rhs> 
11a20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
11a30 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72 65  es being compare
11a40 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  d, encoded in UT
11a50 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e 63  F-8..** The <enc
11a60 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  > parameter is t
11a70 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 74  he encoding of t
11a80 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
11a90 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53 51  ction that.** SQ
11aa0 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74 6f  Lite selected to
11ab0 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20 74   call. The TCL t
11ac0 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c 65  est script imple
11ad0 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74 65  ments the.** "te
11ae0 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f 63  st_collate" proc
11af0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
11b00 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c 79  t this will only
11b10 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20 69   work with one i
11b20 6e 74 65 72 70 72 65 74 65 72 20 61 74 20 61 20  nterpreter at a 
11b30 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a 20  time, as the.** 
11b40 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20 74  interp pointer t
11b50 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c 75  o use when evalu
11b60 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73 63  ating the TCL sc
11b70 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20 69  ript is stored i
11b80 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74  n.** pTestCollat
11b90 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61 74  eInterp..*/.stat
11ba0 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20 70  ic Tcl_Interp* p
11bb0 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
11bc0 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  p;.static int te
11bd0 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28  st_collate_func(
11be0 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
11bf0 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20    int nA, const 
11c00 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20  void *zA,.  int 
11c10 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nB, const void *
11c20 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  zB.){.  Tcl_Inte
11c30 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f 6c  rp *i = pTestCol
11c40 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69 6e  lateInterp;.  in
11c50 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54 45  t encin = SQLITE
11c60 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74 78  _PTR_TO_INT(pCtx
11c70 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  );.  int res;.  
11c80 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74 65  int n;..  sqlite
11c90 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
11ca0 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20   Tcl_Obj *pX;.. 
11cb0 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
11cc0 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f 6c  ingObj("test_col
11cd0 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54 63  late", -1);.  Tc
11ce0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
11cf0 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 65  X);..  switch( e
11d00 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73 65  ncin ){.    case
11d10 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20 20   SQLITE_UTF8:.  
11d20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11d30 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
11d40 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
11d50 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29 3b  bj("UTF-8",-1));
11d60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11d70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
11d80 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16LE:.      Tcl
11d90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
11da0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
11db0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
11dc0 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16LE",-1));.   
11dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11de0 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  se SQLITE_UTF16B
11df0 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
11e00 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11e10 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
11e20 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42  ringObj("UTF-16B
11e30 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
11e40 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
11e50 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
11e60 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  0);.  }..  sqlit
11e70 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
11e80 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d 20  loc();.  pVal = 
11e90 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
11ea0 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20 29  0);.  if( pVal )
11eb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
11ec0 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
11ed0 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53 51  A, zA, encin, SQ
11ee0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
11ef0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
11f00 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
11f10 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
11f20 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
11f30 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  pX,.        Tcl_
11f40 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
11f50 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
11f60 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29  e_text(pVal),n))
11f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
11f80 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 6e  ueSetStr(pVal, n
11f90 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53 51  B, zB, encin, SQ
11fa0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
11fb0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    n = sqlite3_va
11fc0 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29 3b  lue_bytes(pVal);
11fd0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
11fe0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
11ff0 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  pX,.        Tcl_
12000 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
12010 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
12020 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29 29  e_text(pVal),n))
12030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
12040 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20  ueFree(pVal);.  
12050 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  }.  sqlite3EndBe
12060 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
12070 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
12080 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
12090 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
120a0 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  ;.  Tcl_GetIntFr
120b0 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65 74  omObj(i, Tcl_Get
120c0 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26 72  ObjResult(i), &r
120d0 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  es);.  return re
120e0 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  s;.}.static int 
120f0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20  test_collate(.  
12100 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12110 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12120 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12130 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12140 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12150 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
12160 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69   int val;.  sqli
12170 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
12180 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12190 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f  ( objc!=5 ) goto
121a0 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65   bad_args;.  pTe
121b0 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20  stCollateInterp 
121c0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20  = interp;.  if( 
121d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
121e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
121f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
12200 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12210 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
12220 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
12230 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
12240 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
12250 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12260 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
12270 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
12280 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f  ation(db, "test_
12290 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45  collate", SQLITE
122a0 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20  _UTF8, .        
122b0 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
122c0 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f  _UTF8, val?test_
122d0 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
122e0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
122f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
12300 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a  t void *zUtf16;.
12310 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
12320 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12330 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12340 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
12350 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12360 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
12370 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12380 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c  on(db, "test_col
12390 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  late", SQLITE_UT
123a0 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20  F16LE, .        
123b0 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
123c0 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f  TE_UTF16LE, val?
123d0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e  test_collate_fun
123e0 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43  c:0);.    if( TC
123f0 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
12400 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
12410 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61  rp, objv[4], &va
12420 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
12430 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20  ERROR;..#if 0.  
12440 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d    if( sqlite3_iM
12450 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20  allocFail>0 ){. 
12460 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61       sqlite3_iMa
12470 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20  llocFail++;.    
12480 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
12490 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
124a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
124b0 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
124c0 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20  alueNew(db);.   
124d0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
124e0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74  Str(pVal, -1, "t
124f0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51  est_collate", SQ
12500 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
12510 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a  E_STATIC);.    z
12520 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56  Utf16 = sqlite3V
12530 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53  alueText(pVal, S
12540 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
12550 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
12560 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
12570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12580 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
12590 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
125a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
125b0 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55  llation16(db, zU
125c0 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46  tf16, SQLITE_UTF
125d0 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16BE, .         
125e0 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
125f0 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73  UTF16BE, val?tes
12600 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
12610 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
12620 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
12630 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
12640 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
12650 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69  >mutex);.  }.  i
12660 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
12670 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
12680 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
12690 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69  CL_ERROR;.  .  i
126a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
126b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
126c0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
126d0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
126e0 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
126f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12700 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
12710 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20  OK;..bad_args:. 
12720 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12730 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
12740 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12750 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
12760 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12770 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12780 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
12790 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
127a0 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  >", 0);.  return
127b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
127c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f  *.** Usage: add_
127d0 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
127e0 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a 2a  llate <db ptr>.*
127f0 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d 31  *.** Add a utf-1
12800 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  6 collation sequ
12810 65 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66 31  ence named "utf1
12820 36 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61 74  6bin" to the dat
12830 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e  abase.** handle.
12840 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20   This collation 
12850 73 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72 65  sequence compare
12860 73 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74  s arguments in t
12870 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74  he same way as t
12880 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63  he.** built-in c
12890 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72 79  ollation "binary
128a0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
128b0 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63   test_utf16bin_c
128c0 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76  ollate_func(.  v
128d0 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  oid *pCtx, .  in
128e0 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nA, const void
128f0 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20   *zA,.  int nB, 
12900 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
12910 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 28  {.  int nCmp = (
12920 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41 29  nA>nB ? nB : nA)
12930 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
12940 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d  mcmp(zA, zB, nCm
12950 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  p);.  if( res==0
12960 20 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e 42   ) res = nA - nB
12970 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
12980 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  }.static int tes
12990 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
129a0 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  te(.  void * cli
129b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
129c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
129d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
129e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
129f0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
12a00 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
12a10 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
12a20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
12a30 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
12a40 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
12a50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12a60 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
12a70 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
12a80 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
12a90 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
12aa0 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c 49  "utf16bin", SQLI
12ab0 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20 20  TE_UTF16, 0, .  
12ac0 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69      test_utf16bi
12ad0 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20  n_collate_func. 
12ae0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
12af0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
12b00 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
12b10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12b20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12b30 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
12b40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12b50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12b60 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e   "DB");.  return
12b70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
12b80 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f  *.** When the co
12b90 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63  llation needed c
12ba0 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
12bb0 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e  ed, record the n
12bc0 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72  ame of .** the r
12bd0 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
12be0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  ng function here
12bf0 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64 20  .  The recorded 
12c00 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a  name is linked.*
12c10 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61  * to a TCL varia
12c20 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20  ble and used to 
12c30 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
12c40 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
12c50 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69  lation.** name i
12c60 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  s correct..*/.st
12c70 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65  atic char zNeede
12c80 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b  dCollation[200];
12c90 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a  .static char *pz
12ca0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20  NeededCollation 
12cb0 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  = zNeededCollati
12cc0 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  on;.../*.** Call
12cd0 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74  ed when a collat
12ce0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
12cf0 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74 65  needed.  Registe
12d00 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  red using.** sql
12d10 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
12d20 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74  eeded16()..*/.st
12d30 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63  atic void test_c
12d40 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
12d50 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
12d60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
12d70 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
12d80 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e    const void *pN
12d90 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63  ame.){.  int enc
12da0 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e   = ENC(db);.  in
12db0 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
12dc0 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a    for(z = (char*
12dd0 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20  )pName, i=0; *z 
12de0 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20  || z[1]; z++){. 
12df0 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65     if( *z ) zNee
12e00 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b  dedCollation[i++
12e10 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e  ] = *z;.  }.  zN
12e20 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69  eededCollation[i
12e30 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
12e40 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
12e50 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65  n(.      db, "te
12e60 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43  st_collate", ENC
12e70 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54  (db), SQLITE_INT
12e80 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74 65  _TO_PTR(enc), te
12e90 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29  st_collate_func)
12ea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
12eb0 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61  : add_test_colla
12ec0 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a  te_needed DB.*/.
12ed0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
12ee0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a  collate_needed(.
12ef0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12f00 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12f10 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12f20 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12f30 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12f40 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
12f50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12f60 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f  ( objc!=2 ) goto
12f70 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28   bad_args;.  if(
12f80 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12f90 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12fa0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12fb0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12fc0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
12fd0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12fe0 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20  needed16(db, 0, 
12ff0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
13000 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64  ded_cb);.  zNeed
13010 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d  edCollation[0] =
13020 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
13030 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13040 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
13050 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13060 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
13070 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
13080 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
13090 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
130a0 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e   "DB");.  return
130b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
130c0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61  *.** tclcmd:   a
130d0 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
130e0 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42  t_collations  DB
130f0 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e  .**.** Add two n
13100 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  ew collating seq
13110 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61  uences to the da
13120 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20  tabase DB.**.** 
13130 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65      utf16_aligne
13140 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75  d.**     utf16_u
13150 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42  naligned.**.** B
13160 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  oth collating se
13170 71 75 65 6e 63 65 73 20 75 73 65 20 74 68 65 20  quences use the 
13180 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20  same sort order 
13190 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68  as BINARY..** Th
131a0 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63  e only differenc
131b0 65 20 69 73 20 74 68 61 74 20 74 68 65 20 75 74  e is that the ut
131c0 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c  f16_aligned coll
131d0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
131e0 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 77 69  e is declared wi
131f0 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54  th the SQLITE_UT
13200 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67  F16_ALIGNED flag
13210 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  ..** Both collat
13220 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ing functions in
13230 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c  crement the unal
13240 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e  igned utf16 coun
13250 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20  ter.** whenever 
13260 74 68 65 79 20 73 65 65 20 61 20 73 74 72 69 6e  they see a strin
13270 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e  g that begins on
13280 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75   an odd byte bou
13290 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndary..*/.static
132a0 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73   int unaligned_s
132b0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20  tring_counter = 
132c0 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  0;.static int al
132d0 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28  ignmentCollFunc(
132e0 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
132f0 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
13300 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
13310 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
13320 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
13330 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
13340 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
13350 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
13360 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e  y2;.  if( nKey1>
13370 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49  0 && 1==(1&(SQLI
13380 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b  TE_PTR_TO_INT(pK
13390 65 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e  ey1))) ) unalign
133a0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
133b0 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32  r++;.  if( nKey2
133c0 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c  >0 && 1==(1&(SQL
133d0 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
133e0 4b 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67  Key2))) ) unalig
133f0 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
13400 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d  er++;.  rc = mem
13410 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
13420 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
13430 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b  0 ){.    rc = nK
13440 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d  ey1 - nKey2;.  }
13450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13460 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f 61  static int add_a
13470 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f  lignment_test_co
13480 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69 64  llations(.  void
13490 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
134a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
134b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
134c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
134d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
134e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
134f0 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20 20   objc>=2 ){.    
13500 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
13510 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13520 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13530 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
13540 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  CL_ERROR;.    sq
13550 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13560 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31  lation(db, "utf1
13570 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53 51  6_unaligned", SQ
13580 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20 20  LITE_UTF16, .   
13590 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65 6e       0, alignmen
135a0 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20 20  tCollFunc);.    
135b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
135c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
135d0 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53 51  f16_aligned", SQ
135e0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
135f0 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c 20  ED, .        0, 
13600 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e  alignmentCollFun
13610 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
13620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
13630 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
13640 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46  (SQLITE_OMIT_UTF
13650 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73  16) */../*.** Us
13660 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66 75  age: add_test_fu
13670 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e 20  nction <db ptr> 
13680 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
13690 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
136a0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
136b0 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
136c0 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
136d0 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 75  ts the correct u
136e0 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  ser.** function 
136f0 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75  callback when mu
13700 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73 20  ltiple versions 
13710 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 74  (for different t
13720 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a  ext encodings).*
13730 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  * are available.
13740 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
13750 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67 69  his routine regi
13760 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72 65  sters up to thre
13770 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  e versions of th
13780 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 0a  e user function.
13790 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  ** "test_functio
137a0 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73 65  n" with database
137b0 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20 49   handle <db>.  I
137c0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
137d0 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75 65  ument is.** true
137e0 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
137f0 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69 6f   of test_functio
13800 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
13810 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74 68  for UTF-8, if th
13820 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74 72  e.** third is tr
13830 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
13840 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
13850 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68 65  UTF-16le, if the
13860 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74 72   fourth is.** tr
13870 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76  ue, a UTF-16be v
13880 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61  ersion is availa
13890 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20 76  ble.  Previous v
138a0 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65  ersions of.** te
138b0 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  st_function are 
138c0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
138d0 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
138e0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
138f0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 66  by calling the f
13900 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63 72  ollowing TCL scr
13910 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65  ipt:.**.**   "te
13920 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e 63  st_function <enc
13930 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57  > <arg>".**.** W
13940 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f 6e  here <enc> is on
13950 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46 2d  e of UTF-8, UTF-
13960 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45 2c  16LE or UTF16BE,
13970 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74 68   and <arg> is th
13980 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75  e.** single argu
13990 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
139a0 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e  he SQL function.
139b0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
139c0 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54 43  ned by.** the TC
139d0 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65 64  L script is used
139e0 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20 76   as the return v
139f0 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c 20  alue of the SQL 
13a00 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20  function. It.** 
13a10 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51 4c  is passed to SQL
13a20 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31 36  ite using UTF-16
13a30 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20 74  BE for a UTF-8 t
13a40 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  est_function(), 
13a50 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20 55  UTF-8.** for a U
13a60 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75 6e  TF-16LE test_fun
13a70 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54 46  ction(), and UTF
13a80 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d 70  -16LE for an imp
13a90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
13aa0 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46 2d  .** prefers UTF-
13ab0 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  16BE..*/.#ifndef
13ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
13ad0 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  16.static void t
13ae0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
13af0 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  8(.  sqlite3_con
13b00 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
13b10 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
13b20 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
13b30 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
13b40 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
13b50 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
13b60 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
13b70 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
13b80 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
13b90 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
13ba0 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
13bb0 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
13bc0 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
13bd0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
13be0 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
13bf0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13c00 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
13c10 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13c20 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20 20  UTF-8", -1));.  
13c30 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13c40 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13c50 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f   pX, .      Tcl_
13c60 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
13c70 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
13c80 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c  e_text(argv[0]),
13c90 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61   -1));.  Tcl_Eva
13ca0 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70  lObjEx(interp, p
13cb0 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63  X, 0);.  Tcl_Dec
13cc0 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
13cd0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
13ce0 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f 47  text(pCtx, Tcl_G
13cf0 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
13d00 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c 49  nterp), -1, SQLI
13d10 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
13d20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
13d30 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
13d40 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
13d50 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47  (pVal, -1, Tcl_G
13d60 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
13d70 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53  nterp), .      S
13d80 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
13d90 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71  TE_STATIC);.  sq
13da0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
13db0 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69  t16be(pCtx, sqli
13dc0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
13dd0 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  be(pVal),.      
13de0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
13df0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
13e00 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
13e10 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
13e20 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
13e30 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16le(.  sqlite3_
13e40 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
13e50 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
13e60 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
13e70 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
13e80 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
13e90 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
13ea0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
13eb0 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
13ec0 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
13ed0 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
13ee0 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
13ef0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
13f00 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
13f10 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
13f20 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
13f30 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13f40 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
13f50 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13f60 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d 31  j("UTF-16LE", -1
13f70 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
13f80 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
13f90 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
13fa0 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
13fb0 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
13fc0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
13fd0 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
13fe0 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
13ff0 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
14000 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14010 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
14020 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
14030 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
14040 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
14050 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
14060 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
14070 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
14080 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14090 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
140a0 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63 68  lt_text(pCtx,(ch
140b0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
140c0 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31 2c  e_text(pVal),-1,
140d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
140e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
140f0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
14100 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
14110 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62 65  function_utf16be
14120 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
14130 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
14140 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
14150 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
14160 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
14170 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
14180 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
14190 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
141a0 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
141b0 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
141c0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
141d0 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
141e0 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
141f0 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
14200 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
14210 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
14220 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14230 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
14240 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
14250 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b 0a  TF-16BE", -1));.
14260 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14270 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
14280 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
14290 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
142a0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
142b0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
142c0 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
142d0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
142e0 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
142f0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
14300 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
14310 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
14320 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14330 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
14340 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
14350 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
14360 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
14370 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14380 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
14390 65 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c 69  ext16(pCtx, sqli
143a0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
143b0 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20  le(pVal),.      
143c0 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
143d0 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
143e0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
143f0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
14400 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
14410 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
14420 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14430 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14440 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74 78  lt_text16le(pCtx
14450 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
14460 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
14470 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
14480 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
14490 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
144a0 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pVal);.}.#endif 
144b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
144c0 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20 69  TF16 */.static i
144d0 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  nt test_function
144e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
144f0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
14500 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14510 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14520 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14530 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
14540 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
14550 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
14560 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  nt val;..  if( o
14570 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61  bjc!=5 ) goto ba
14580 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
14590 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
145a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
145b0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
145c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
145d0 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
145e0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
145f0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
14600 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
14610 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
14620 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
14630 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
14640 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
14650 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
14660 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
14670 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
14680 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
14690 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20  _utf8, 0, 0);.  
146a0 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
146b0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
146c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
146d0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
146e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
146f0 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
14700 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
14710 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
14720 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
14730 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
14740 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
14750 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
14760 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b  _utf16le, 0, 0);
14770 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
14780 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
14790 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
147a0 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
147b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
147c0 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
147d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
147e0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
147f0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
14800 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
14810 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6BE, .        in
14820 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
14830 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20  ion_utf16be, 0, 
14840 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
14850 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72  n TCL_OK;.bad_ar
14860 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
14870 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
14880 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
14890 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
148a0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
148b0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
148c0 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
148d0 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
148e0 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e  f16be>", 0);.#en
148f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
14900 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
14910 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14920 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
14930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14940 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72  test_errstr <err
14950 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73   code>.**.** Tes
14960 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69  t that the engli
14970 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69  sh language stri
14980 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66  ng equivalents f
14990 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  or sqlite error 
149a0 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e  codes.** are san
149b0 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
149c0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72   is an integer r
149d0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73  epresenting an s
149e0 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
149f0 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
14a00 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f  is a list of two
14a10 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73   elements, the s
14a20 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
14a30 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65  tion of the.** e
14a40 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68  rror code and th
14a50 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
14a60 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a  ge explanation..
14a70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14a80 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69  st_errstr(.  voi
14a90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
14aa0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
14ab0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
14ac0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
14ad0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
14ae0 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e  har *zCode;.  in
14af0 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  t i;.  if( objc!
14b00 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
14b10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14b20 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72  p, 1, objv, "<er
14b30 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d  ror code>");.  }
14b40 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f  ..  zCode = Tcl_
14b50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14b60 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
14b70 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <200; i++){.    
14b80 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31  if( 0==strcmp(t1
14b90 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43  ErrorName(i), zC
14ba0 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ode) ) break;.  
14bb0 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
14bc0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
14bd0 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
14be0 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  i), 0);.  return
14bf0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
14c00 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61  * Usage:    brea
14c10 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69  kpoint.**.** Thi
14c20 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73  s routine exists
14c30 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65   for one purpose
14c40 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20   - to provide a 
14c50 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a  place to put a.*
14c60 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74  * breakpoint wit
14c70 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62  h GDB that can b
14c80 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e  e triggered usin
14c90 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65  g TCL code.  The
14ca0 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73   use.** for this
14cb0 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69   is when a parti
14cc0 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73  cular test fails
14cd0 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34   on (say) the 14
14ce0 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a  85th iteration..
14cf0 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65  ** In the TCL te
14d00 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61  st script, we ca
14d10 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20  n add code like 
14d20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
14d30 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72  if {$i==1485} br
14d40 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
14d50 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74  hen run testfixt
14d60 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67  ure in the debug
14d70 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72  ger and wait for
14d80 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20   the breakpoint 
14d90 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65  to.** fire.  The
14da0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65  n additional bre
14db0 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20  akpoints can be 
14dc0 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77  set to trace dow
14dd0 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74  n the bug..*/.st
14de0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 72  atic int test_br
14df0 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64  eakpoint(.  void
14e00 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
14e10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14e20 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
14e30 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
14e40 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
14e50 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
14e60 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
14e70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
14e80 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
14e90 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
14ea0 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
14eb0 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
14ec0 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
14ed0 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  OK;         /* D
14ee0 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a  o nothing */.}..
14ef0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
14f00 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
14f10 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e  blob  STMT IDX N
14f20 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
14f30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
14f40 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  oblob interface.
14f50 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
14f60 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
14f70 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69 6e  ** IDX is the in
14f80 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
14f90 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
14fa0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
14fb0 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
14fc0 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72  nds a N-byte zer
14fd0 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f  o-filled BLOB to
14fe0 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a   the wildcard..*
14ff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
15000 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28  t_bind_zeroblob(
15010 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15020 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15030 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15040 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15050 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15060 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
15070 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
15080 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  idx;.  int n;.  
15090 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
150a0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
150b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
150c0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
150d0 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20  "STMT IDX N");. 
150e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
150f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
15100 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15110 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15120 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15130 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15150 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15160 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15170 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15180 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15190 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
151a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
151b0 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74  jv[3], &n) ) ret
151c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
151d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
151e0 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53 74  ind_zeroblob(pSt
151f0 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69  mt, idx, n);.  i
15200 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
15210 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
15220 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
15230 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15240 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
15250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15260 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15270 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
15280 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
15290 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
152a0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
152b0 62 36 34 20 20 53 54 4d 54 20 49 44 58 20 4e 0a  b64  STMT IDX N.
152c0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
152d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
152e0 62 6c 6f 62 36 34 20 69 6e 74 65 72 66 61 63 65  blob64 interface
152f0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
15300 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
15310 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69  .** IDX is the i
15320 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
15330 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
15340 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
15350 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
15360 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65  inds a N-byte ze
15370 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74  ro-filled BLOB t
15380 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
15390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
153a0 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
153b0 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  64(.  void * cli
153c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
153d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
153e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
153f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
15400 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
15410 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
15420 6e 74 20 69 64 78 3b 0a 20 20 69 36 34 20 6e 3b  nt idx;.  i64 n;
15430 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
15440 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
15450 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
15460 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
15470 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29  v, "STMT IDX N")
15480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
15490 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
154a0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
154b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
154c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
154d0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
154e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
154f0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15500 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15510 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
15520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15530 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69  .  if( Tcl_GetWi
15540 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
15550 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
15560 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15570 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
15580 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
15590 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69 64 78  lob64(pStmt, idx
155a0 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , n);.  if( sqli
155b0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
155c0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
155d0 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
155e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
155f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15600 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
15610 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15620 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
15630 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
15640 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15650 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
15660 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
15670 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
15680 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54  3_bind_int  STMT
15690 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
156a0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
156b0 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61  bind_int interfa
156c0 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
156d0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
156e0 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
156f0 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
15700 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
15710 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
15720 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
15730 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e  inds a 32-bit in
15740 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
15750 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
15760 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
15770 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69  _bind_int(.  voi
15780 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15790 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
157a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
157b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
157c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
157d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
157e0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
157f0 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e   int value;.  in
15800 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
15810 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
15820 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
15830 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
15840 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
15850 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
15860 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
15870 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
15880 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
15890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
158a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
158b0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
158c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
158d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
158e0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
158f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15900 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
15910 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
15920 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
15930 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15940 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
15950 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
15960 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
15970 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15980 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
15990 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
159a0 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
159b0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
159c0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
159d0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
159e0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
159f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15a00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15a10 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
15a20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
15a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15a40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
15a50 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
15a60 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41  int64  STMT N VA
15a70 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
15a80 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
15a90 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e  int64 interface.
15aa0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
15ab0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
15ac0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
15ad0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
15ae0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
15af0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
15b00 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
15b10 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
15b20 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
15b30 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
15b40 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
15b50 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  nd_int64(.  void
15b60 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15b70 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15b80 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15b90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15ba0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15bb0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15bc0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
15bd0 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c 75  Tcl_WideInt valu
15be0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
15bf0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
15c00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
15c10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15c20 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15c30 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
15c40 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
15c50 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
15c60 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
15c70 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
15c80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15c90 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
15ca0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
15cb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
15cc0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
15cd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15ce0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15cf0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
15d00 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
15d10 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
15d20 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15d30 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
15d40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15d50 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72  [3], &value) ) r
15d60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15d70 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15d80 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d  _bind_int64(pStm
15d90 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
15da0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15db0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
15dc0 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
15dd0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
15de0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15df0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15e00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15e10 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
15e20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15e30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
15e40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
15e50 62 6c 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55  ble  STMT N VALU
15e60 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  E.**.** Test the
15e70 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
15e80 75 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20  uble interface. 
15e90 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
15ea0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
15eb0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
15ec0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
15ed0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
15ee0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
15ef0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
15f00 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
15f10 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20  r VALUE to that 
15f20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
15f30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
15f40 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64  d_double(.  void
15f50 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
15f60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
15f70 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
15f80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
15f90 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
15fa0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
15fb0 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
15fc0 64 6f 75 62 6c 65 20 76 61 6c 75 65 20 3d 20 30  double value = 0
15fd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f  ;.  int rc;.  co
15fe0 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a  nst char *zVal;.
15ff0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
16000 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
16010 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
16020 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e  *zName;     /* N
16030 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  ame of the speci
16040 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  al floating poin
16050 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75  t value */.    u
16060 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70  nsigned int iUpp
16070 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33  er;   /* Upper 3
16080 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e  2 bits */.    un
16090 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65  signed int iLowe
160a0 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32  r;   /* Lower 32
160b0 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70   bits */.  } aSp
160c0 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20  ecialFp[] = {.  
160d0 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20    {  "NaN",     
160e0 20 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66   0x7fffffff, 0xf
160f0 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
16100 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78    "SNaN",     0x
16110 37 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66  7ff7ffff, 0xffff
16120 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22  ffff },.    {  "
16130 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66  -NaN",     0xfff
16140 66 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66  fffff, 0xfffffff
16150 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e  f },.    {  "-SN
16160 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66  aN",    0xfff7ff
16170 66 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d  ff, 0xffffffff }
16180 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c  ,.    {  "+Inf",
16190 20 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c       0x7ff00000,
161a0 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
161b0 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20     {  "-Inf",   
161c0 20 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78    0xfff00000, 0x
161d0 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
161e0 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30  {  "Epsilon",  0
161f0 78 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30  x00000000, 0x000
16200 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20  00001 },.    {  
16210 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30  "-Epsilon", 0x80
16220 30 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30  000000, 0x000000
16230 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61  01 },.    {  "Na
16240 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30  N0",     0x7ff80
16250 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
16260 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30  },.    {  "-NaN0
16270 22 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30  ",    0xfff80000
16280 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
16290 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
162a0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
162b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
162c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
162d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
162e0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
162f0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16300 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16310 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b  MT N VALUE", 0);
16320 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
16330 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
16340 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
16350 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
16360 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
16370 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
16380 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16390 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
163a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
163b0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
163c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
163d0 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20  .  /* Intercept 
163e0 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22  the string "NaN"
163f0 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20   and generate a 
16400 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74  NaN value for it
16410 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  ..  ** All other
16420 20 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73   strings are pas
16430 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54  sed through to T
16440 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16450 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f  Obj()..  ** Tcl_
16460 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a  GetDoubleFromObj
16470 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73  () should unders
16480 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73  tand "NaN" but s
16490 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a  ome versions.  *
164a0 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e  * contain a bug.
164b0 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54  .  */.  zVal = T
164c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
164d0 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[3]);.  for(i=0
164e0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63  ; i<sizeof(aSpec
164f0 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53  ialFp)/sizeof(aS
16500 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b  pecialFp[0]); i+
16510 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
16520 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  mp(aSpecialFp[i]
16530 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30  .zName, zVal)==0
16540 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16550 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20  3_uint64 x;.    
16560 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70    x = aSpecialFp
16570 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20  [i].iUpper;.    
16580 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20    x <<= 32;.    
16590 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46    x |= aSpecialF
165a0 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20  p[i].iLower;.   
165b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
165c0 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20  f(value)==8 );. 
165d0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
165e0 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20  eof(x)==8 );.   
165f0 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65     memcpy(&value
16600 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20  , &x, 8);.      
16610 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
16620 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66  .  if( i>=sizeof
16630 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a  (aSpecialFp)/siz
16640 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30  eof(aSpecialFp[0
16650 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54  ]) &&.         T
16660 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d  cl_GetDoubleFrom
16670 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16680 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a  [3], &value) ){.
16690 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
166a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
166b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f   sqlite3_bind_do
166c0 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c  uble(pStmt, idx,
166d0 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73   value);.  if( s
166e0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
166f0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
16700 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
16710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16720 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16740 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16750 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
16760 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16770 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
16780 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20  bind_null  STMT 
16790 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
167a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
167b0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ll interface.  S
167c0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
167d0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
167e0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
167f0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16800 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16810 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16820 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16830 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c   NULL to the wil
16840 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
16850 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e   int test_bind_n
16860 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ull(.  void * cl
16870 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
16880 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
16890 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
168a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
168b0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
168c0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
168d0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
168e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
168f0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
16900 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
16910 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
16920 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
16930 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
16940 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
16950 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
16960 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74   N", 0);.    ret
16970 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16980 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
16990 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
169a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
169b0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
169c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
169d0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
169e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
169f0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
16a00 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16a10 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16a20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
16a30 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
16a40 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16a50 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16a60 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
16a70 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
16a80 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
16a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16ab0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
16ac0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
16ad0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
16ae0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
16af0 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
16b00 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
16b10 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
16b20 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e  _text interface.
16b30 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
16b40 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
16b50 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
16b60 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
16b70 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
16b80 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
16b90 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
16ba0 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  s a UTF-8 string
16bb0 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
16bc0 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
16bd0 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
16be0 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
16bf0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16c00 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
16c10 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16c20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16c30 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16c40 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16c50 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16c60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16c70 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
16c80 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
16c90 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
16ca0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
16cb0 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
16cc0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16cd0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
16ce0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
16cf0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
16d00 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
16d10 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
16d20 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
16d30 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
16d40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16d50 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
16d60 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
16d70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
16d80 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
16d90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16da0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
16db0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
16dc0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
16dd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16de0 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
16df0 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
16e00 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
16e10 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
16e20 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16e30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16e40 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
16e50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16e60 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
16e70 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
16e80 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
16e90 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
16ea0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
16eb0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
16ec0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
16ed0 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
16ee0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
16ef0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
16f00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16f10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16f20 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
16f30 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
16f40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16f50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
16f60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16f70 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
16f80 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
16f90 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
16fa0 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
16fb0 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
16fc0 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
16fd0 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
16fe0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
16ff0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
17000 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
17010 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
17020 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
17030 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
17040 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
17050 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
17060 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
17070 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
17080 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
17090 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
170a0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
170b0 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20  _bind_text16(.  
170c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
170d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
170e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
170f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17100 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
17110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17120 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
17130 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
17140 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
17150 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20  t bytes;.  char 
17160 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63  *value;.  int rc
17170 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c  ;..  void (*xDel
17180 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63  )(void*) = (objc
17190 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49  ==6?SQLITE_STATI
171a0 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  C:SQLITE_TRANSIE
171b0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  NT);.  Tcl_Obj *
171c0 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b  oStmt    = objv[
171d0 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-4];.  Tcl_O
171e0 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f  bj *oN       = o
171f0 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54  bjv[objc-3];.  T
17200 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20  cl_Obj *oString 
17210 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b   = objv[objc-2];
17220 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74  .  Tcl_Obj *oByt
17230 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  es   = objv[objc
17240 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  -1];..  if( objc
17250 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b  !=5 && objc!=6){
17260 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17280 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17290 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
172a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
172b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
172c0 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56  , 0), " STMT N V
172d0 41 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b  ALUE BYTES", 0);
172e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
172f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
17300 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17310 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17320 53 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26  String(oStmt), &
17330 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
17340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17350 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17360 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26  bj(interp, oN, &
17370 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
17380 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
17390 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65   = (char*)Tcl_Ge
173a0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
173b0 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20  j(oString, 0);. 
173c0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
173d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
173e0 42 79 74 65 73 2c 20 26 62 79 74 65 73 29 20 29  Bytes, &bytes) )
173f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17400 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
17410 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70  e3_bind_text16(p
17420 53 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64  Stmt, idx, (void
17430 20 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c   *)value, bytes,
17440 20 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71   xDel);.  if( sq
17450 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17460 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
17470 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
17480 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17490 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
174a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
174b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
174c0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
174d0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
174e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
174f0 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20  OR;.  }..#endif 
17500 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
17510 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
17520 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17530 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17540 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73  e3_bind_blob ?-s
17550 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41  tatic? STMT N DA
17560 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54  TA BYTES.**.** T
17570 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
17580 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66  bind_blob interf
17590 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20  ace.  STMT is a 
175a0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
175b0 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20  nt..** N is the 
175c0 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
175d0 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
175e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
175f0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
17600 62 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20  binds a BLOB to 
17610 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54  the wildcard.  T
17620 68 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53  he BLOB is BYTES
17630 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
17640 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17650 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20  st_bind_blob(.  
17660 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17670 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17680 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17690 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
176a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
176b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
176c0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
176d0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
176e0 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
176f0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
17700 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70  3_destructor_typ
17710 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20  e xDestructor = 
17720 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
17730 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
17740 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20   && objc!=6 ){. 
17750 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
17760 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
17770 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
17780 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
17790 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
177a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
177b0 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54  0), " STMT N DAT
177c0 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20  A BYTES", 0);.  
177d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
177e0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
177f0 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44  bjc==6 ){.    xD
17800 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49  estructor = SQLI
17810 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f  TE_STATIC;.    o
17820 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66  bjv++;.  }..  if
17830 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
17840 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
17850 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
17860 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
17870 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
17880 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
17890 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
178a0 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65  v[2], &idx) ) re
178b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
178c0 20 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65    value = Tcl_Ge
178d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
178e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
178f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17900 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65  , objv[4], &byte
17910 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
17920 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17930 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
17940 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
17950 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74  ue, bytes, xDest
17960 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73  ructor);.  if( s
17970 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
17980 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
17990 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
179a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
179b0 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
179c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
179d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
179e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
179f0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
17a00 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
17a10 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
17a20 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  ount  STMT.**.**
17a30 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17a40 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20  er of wildcards 
17a50 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61  in the given sta
17a60 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  tement..*/.stati
17a70 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
17a80 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28  parameter_count(
17a90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
17aa0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
17ab0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
17ac0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
17ad0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
17ae0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
17af0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
17b00 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
17b10 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
17b20 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
17b30 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
17b40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17b50 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
17b60 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17b70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
17b80 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
17b90 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17ba0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
17bb0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
17bc0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
17bd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
17be0 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d  meter_count(pStm
17bf0 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
17c00 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17c10 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
17c20 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
17c30 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a  name  STMT  N.**
17c40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
17c50 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77  ame of the Nth w
17c60 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69  ildcard.  The fi
17c70 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20  rst wildcard is 
17c80 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73  1..** An empty s
17c90 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65  tring is returne
17ca0 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66  d if N is out of
17cb0 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65   range or if the
17cc0 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20   wildcard.** is 
17cd0 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61  nameless..*/.sta
17ce0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
17cf0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
17d00 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17d10 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17d20 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17d30 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17d40 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
17d50 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
17d60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
17d70 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   i;..  if( objc!
17d80 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
17d90 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
17da0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
17db0 54 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  T N");.    retur
17dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17dd0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
17de0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17df0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17e00 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17e10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17e20 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
17e30 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17e40 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29  , objv[2], &i) )
17e50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17e60 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
17e70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
17e80 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
17e90 67 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  gObj(sqlite3_bin
17ea0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
17eb0 28 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20  (pStmt,i),-1).  
17ec0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
17ed0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
17ee0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17ef0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
17f00 65 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a  ex  STMT  NAME.*
17f10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17f20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c  index of the wil
17f30 64 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d  dcard called NAM
17f40 45 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20  E.  Return 0 if 
17f50 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73  there is.** no s
17f60 75 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  uch wildcard..*/
17f70 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
17f80 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
17f90 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20  index(.  void * 
17fa0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
17fb0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17fc0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
17fd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
17fe0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
17ff0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18000 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
18010 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
18020 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
18030 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41  , objv, "STMT NA
18040 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
18050 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18060 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
18070 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
18080 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18090 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
180a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
180b0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
180c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
180d0 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28    Tcl_NewIntObj(
180e0 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
180f0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
18100 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47  ndex(pStmt,Tcl_G
18110 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
18120 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20  )).     ).  );. 
18130 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
18140 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18150 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f    sqlite3_clear_
18160 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a  bindings STMT.**
18170 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18180 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
18190 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  gs(.  void * cli
181a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
181b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
181c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
181d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
181e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
181f0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
18200 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
18210 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
18220 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
18230 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
18240 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18250 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18260 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
18270 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18280 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
18290 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
182a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
182b0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
182c0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
182d0 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f  j(sqlite3_clear_
182e0 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29  bindings(pStmt))
182f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18300 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
18310 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  ge:   sqlite3_sl
18320 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  eep MILLISECONDS
18330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
18340 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69  est_sleep(.  voi
18350 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18360 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18370 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18380 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18390 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
183a0 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62  nt ms;..  if( ob
183b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
183c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
183d0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
183e0 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a  MILLISECONDS");.
183f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18400 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18410 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
18420 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
18430 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72  ], &ms) ){.    r
18440 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18450 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
18460 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
18470 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
18480 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29  lite3_sleep(ms))
18490 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
184a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
184b0 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65  ge: sqlite3_exte
184c0 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42 0a  nded_errcode DB.
184d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
184e0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
184f0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
18500 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
18510 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
18520 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
18530 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
18540 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
18550 78 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  x_errcode(.  voi
18560 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18570 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18580 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18590 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
185a0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
185b0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
185c0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
185d0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
185e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
185f0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
18600 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
18610 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
18620 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
18630 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
18640 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18650 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18660 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18670 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18680 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18690 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
186a0 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
186b0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
186c0 6f 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41  ode(db);.  Tcl_A
186d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
186e0 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
186f0 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  rorName(rc), 0);
18700 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18710 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
18720 65 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  e: sqlite3_errco
18730 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  de DB.**.** Retu
18740 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  rn the string re
18750 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
18760 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
18770 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a  sqlite3_* API.**
18780 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67   error code. e.g
18790 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  . "SQLITE_ERROR"
187a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
187b0 74 65 73 74 5f 65 72 72 63 6f 64 65 28 0a 20 20  test_errcode(.  
187c0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
187d0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
187e0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
187f0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18800 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18810 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
18820 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
18830 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
18840 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18850 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
18860 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
18870 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
18880 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18890 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
188a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
188b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
188c0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
188d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
188e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
188f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
18900 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
18910 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
18920 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
18930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
18940 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
18950 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
18960 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18970 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
18980 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 44 42 0a  lite3_errmsg DB.
18990 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
189a0 65 20 55 54 46 2d 38 20 72 65 70 72 65 73 65 6e  e UTF-8 represen
189b0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
189c0 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
189d0 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
189e0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
189f0 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f  3_* API call..*/
18a00 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
18a10 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64 20  _errmsg(.  void 
18a20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18a30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18a40 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18a50 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18a60 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
18a70 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
18a80 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a 20  t char *zErr;.. 
18a90 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
18aa0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18ab0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
18ac0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
18ad0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
18ae0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
18af0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
18b00 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18b20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
18b30 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
18b40 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
18b50 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
18b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
18b70 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
18b80 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c 5f  rmsg(db);.  Tcl_
18b90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
18ba0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
18bb0 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29 29  ngObj(zErr, -1))
18bc0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18bd0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
18be0 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67  e:   test_errmsg
18bf0 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  16 DB.**.** Retu
18c00 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20 72  rns the UTF-16 r
18c10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
18c20 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
18c30 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68  ge string for th
18c40 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
18c50 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63   sqlite3_* API c
18c60 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20 62  all. This is a b
18c70 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63 74  yte array object
18c80 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a 20   at the TCL .** 
18c90 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69 6e  level, and it in
18ca0 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30 20  cludes the 0x00 
18cb0 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  0x00 terminator 
18cc0 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e 64  bytes at the end
18cd0 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d 31   of the.** UTF-1
18ce0 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  6 string..*/.sta
18cf0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72  tic int test_err
18d00 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  msg16(.  void * 
18d10 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18d20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18d30 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18d40 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18d50 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
18d60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
18d70 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
18d80 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
18d90 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zErr;.  const ch
18da0 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74  ar *z;.  int byt
18db0 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  es = 0;..  if( o
18dc0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18dd0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18de0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18df0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18e00 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18e10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18e20 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18e30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18e40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18e50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18e60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18e70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18e80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18e90 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
18ea0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
18eb0 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  (db);.  if( zErr
18ec0 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72   ){.    z = zErr
18ed0 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d  ;.    for(bytes=
18ee0 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a  0; z[bytes] || z
18ef0 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73  [bytes+1]; bytes
18f00 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c  +=2){}.  }.  Tcl
18f10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
18f20 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
18f30 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20  eArrayObj(zErr, 
18f40 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20  bytes));.#endif 
18f50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
18f60 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
18f70 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
18f80 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
18f90 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20  _prepare DB sql 
18fa0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
18fb0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
18fc0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
18fd0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
18fe0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
18ff0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
19000 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
19010 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
19020 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19030 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19040 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19050 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19060 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19070 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
19080 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
19090 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
190a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
190b0 65 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76  est_prepare(.  v
190c0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
190d0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
190e0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
190f0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19100 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19110 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
19120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
19130 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
19140 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
19150 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
19160 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19170 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19180 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19190 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
191a0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
191b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
191c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
191d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
191e0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
191f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19200 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
19210 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c  ytes ?tailvar?",
19220 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
19230 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
19240 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
19250 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
19260 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19270 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
19280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
19290 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
192a0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
192b0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
192c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
192d0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
192e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
192f0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
19300 5f 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71  _prepare(db, zSq
19310 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74  l, bytes, &pStmt
19320 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61  , objc>=5 ? &zTa
19330 69 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52  il : 0);.  Tcl_R
19340 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
19350 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
19360 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
19370 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
19380 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19390 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20  .  if( zTail && 
193a0 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
193b0 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
193c0 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
193d0 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
193e0 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
193f0 20 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65    if( (int)strle
19400 6e 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29  n(zTail)<bytes )
19410 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
19420 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69  (int)strlen(zTai
19430 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
19440 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
19450 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
19460 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
19470 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
19480 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
19490 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
194a0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
194b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
194c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
194d0 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
194e0 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
194f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19500 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
19510 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
19520 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
19530 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19540 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
19550 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
19560 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
19570 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
19580 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
19590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
195a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
195b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
195c0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
195d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
195e0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
195f0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42  e3_prepare_v2 DB
19600 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
19610 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
19620 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
19630 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
19640 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
19650 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
19660 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
19670 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
19680 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
19690 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
196a0 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
196b0 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
196c0 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
196d0 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
196e0 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
196f0 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
19700 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
19710 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19720 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
19730 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19740 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19750 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19760 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19770 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19780 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
19790 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72  ar *zSql;.  char
197a0 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20 20 20 20   *zCopy = 0;    
197b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
197c0 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20 6f 66 20  alloc() copy of 
197d0 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 79  zSql */.  int by
197e0 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tes;.  const cha
197f0 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
19800 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19810 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
19820 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
19830 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
19840 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
19850 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
19860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
19870 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
19880 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
19890 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
198a0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
198b0 20 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76   sql bytes tailv
198c0 61 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  ar", 0);.    ret
198d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
198e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
198f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
19900 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19910 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
19920 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19930 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
19940 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
19950 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19960 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19970 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
19980 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19990 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 65  ROR;..  /* Inste
199a0 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53 71 6c  ad of using zSql
199b0 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b 65 20   directly, make 
199c0 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20 62 75  a copy into a bu
199d0 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a 20 20  ffer obtained.  
199e0 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ** directly from
199f0 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65 20 69   malloc(). The i
19a00 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65 20 69  dea is to make i
19a10 74 20 65 61 73 69 65 72 20 66 6f 72 20 76 61 6c  t easier for val
19a20 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20 73 70  grind.  ** to sp
19a30 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ot buffer overre
19a40 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 62  ads.  */.  if( b
19a50 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 7a  ytes>=0 ){.    z
19a60 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 62 79  Copy = malloc(by
19a70 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  tes);.    memcpy
19a80 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 62 79  (zCopy, zSql, by
19a90 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
19aa0 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
19ab0 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b 20 31  strlen(zSql) + 1
19ac0 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61  ;.    zCopy = ma
19ad0 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d 65 6d  lloc(n);.    mem
19ae0 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
19af0 20 6e 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   n);.  }.  rc = 
19b00 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19b10 76 32 28 64 62 2c 20 7a 43 6f 70 79 2c 20 62 79  v2(db, zCopy, by
19b20 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
19b30 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
19b40 30 29 3b 0a 20 20 66 72 65 65 28 7a 43 6f 70 79  0);.  free(zCopy
19b50 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20 26 7a 53  );.  zTail = &zS
19b60 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a 43 6f 70  ql[(zTail - zCop
19b70 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 72  y)];..  assert(r
19b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
19b90 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c  pStmt==0);.  Tcl
19ba0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
19bb0 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  erp);.  if( sqli
19bc0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19bd0 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19be0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19bf0 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  R;.  if( rc==SQL
19c00 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61 69 6c 20  ITE_OK && zTail 
19c10 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20  && objc>=5 ){.  
19c20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20 29    if( bytes>=0 )
19c30 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20  {.      bytes = 
19c40 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a 54  bytes - (int)(zT
19c50 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ail-zSql);.    }
19c60 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
19c70 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
19c80 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
19c90 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
19ca0 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
19cb0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19cc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
19cd0 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
19ce0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
19cf0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
19d00 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
19d10 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
19d20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19d30 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
19d40 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
19d50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
19d60 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
19d70 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
19d80 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
19d90 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
19da0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
19db0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19dc0 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
19dd0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
19de0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
19df0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
19e00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
19e10 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
19e20 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a  e_tkt3134 DB.**.
19e30 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 70 72  ** Generate a pr
19e40 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
19e50 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79 74 65   for a zero-byte
19e60 20 73 74 72 69 6e 67 20 61 73 20 61 20 74 65 73   string as a tes
19e70 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65 74 20  t.** for ticket 
19e80 23 33 31 33 34 2e 20 20 54 68 65 20 73 74 72 69  #3134.  The stri
19e90 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70 72 65  ng should be pre
19ea0 63 65 64 65 64 20 62 79 20 61 20 7a 65 72 6f 20  ceded by a zero 
19eb0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
19ec0 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72 65  int test_prepare
19ed0 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
19ee0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19ef0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19f00 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19f10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19f20 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19f30 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
19f40 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
19f50 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
19f60 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
19f70 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19f80 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19f90 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
19fa0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
19fb0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19fc0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19fd0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19fe0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
19ff0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1a000 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
1a010 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
1a020 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 0);.    retu
1a030 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a040 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1a050 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1a060 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a070 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1a080 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a090 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1a0a0 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
1a0b0 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
1a0c0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
1a0d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1a0e0 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
1a0f0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1a100 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1a110 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1a120 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
1a130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a140 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1a150 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1a160 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1a170 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1a180 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1a190 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a1a0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a1b0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1a1c0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1a1d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a1e0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1a1f0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1a200 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1a210 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1a220 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1a230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1a240 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a250 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1a260 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1a270 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1a280 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1a290 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71  _prepare16 DB sq
1a2a0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
1a2b0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1a2c0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1a2d0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1a2e0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1a2f0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1a300 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1a310 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1a320 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1a330 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1a340 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1a350 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1a360 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1a370 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1a380 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1a390 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1a3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1a3b0 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20  est_prepare16(. 
1a3c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a3d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a3e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a3f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a400 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a410 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a420 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
1a430 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
1a440 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
1a450 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
1a460 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
1a470 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
1a480 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1a490 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
1a4a0 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
1a4b0 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
1a4e0 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
1a4f0 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
1a500 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1a510 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
1a520 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
1a530 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
1a540 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
1a550 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a560 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a570 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1a580 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1a590 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1a5a0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1a5b0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
1a5c0 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
1a5d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a5e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1a5f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1a600 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1a610 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1a620 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a630 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
1a640 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1a650 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
1a660 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
1a670 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a680 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1a690 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1a6a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
1a6b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1a6c0 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20  are16(db, zSql, 
1a6d0 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
1a6e0 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
1a6f0 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  : 0);.  if( sqli
1a700 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a710 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
1a720 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a730 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  R;.  if( rc ){. 
1a740 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a750 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1a760 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
1a770 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
1a780 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65    objlen = objle
1a790 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29  n - (int)((u8 *)
1a7a0 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
1a7b0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a7c0 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a      objlen = 0;.
1a7d0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20      }.    pTail 
1a7e0 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
1a7f0 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69  ayObj((u8 *)zTai
1a800 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20  l, objlen);.    
1a810 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1a820 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c  (pTail);.    Tcl
1a830 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
1a840 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
1a850 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54  pTail, 0);.    T
1a860 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1a870 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69  pTail);.  }..  i
1a880 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1a890 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1a8a0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1a8b0 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
1a8c0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a8d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
1a8e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1a8f0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
1a900 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1a910 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
1a920 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1a930 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1a940 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1a950 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  6_v2 DB sql byte
1a960 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
1a970 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
1a980 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
1a990 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
1a9a0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
1a9b0 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
1a9c0 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
1a9d0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
1a9e0 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
1a9f0 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
1aa00 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
1aa10 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
1aa20 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
1aa30 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
1aa40 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
1aa50 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1aa60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1aa70 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20  prepare16_v2(.  
1aa80 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1aa90 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1aaa0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1aab0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1aac0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1aad0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aae0 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1aaf0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1ab00 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
1ab10 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
1ab20 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1ab30 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
1ab40 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ab50 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1ab60 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
1ab70 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
1ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ab90 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
1aba0 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
1abb0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
1abc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1abd0 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
1abe0 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
1abf0 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
1ac00 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1ac10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ac20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ac30 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ac40 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1ac50 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1ac60 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1ac70 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1ac80 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1ac90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1aca0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1acb0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1acc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1acd0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1ace0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1acf0 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1ad00 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1ad10 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1ad20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1ad30 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1ad40 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1ad50 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1ad60 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1ad70 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1ad80 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
1ad90 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1ada0 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1adb0 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1adc0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1add0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1ade0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1adf0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1ae00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ae10 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1ae20 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1ae30 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1ae40 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1ae50 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1ae60 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1ae70 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1ae80 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1ae90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1aea0 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1aeb0 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1aec0 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1aed0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1aee0 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1aef0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1af00 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1af10 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1af20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1af30 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1af40 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1af50 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1af60 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1af70 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1af80 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1af90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1afa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1afb0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1afc0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1afd0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1afe0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1aff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b000 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66  : sqlite3_open f
1b010 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73  ilename ?options
1b020 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63  -list?.*/.static
1b030 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a   int test_open(.
1b040 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b050 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b060 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b070 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b080 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b090 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1b0a0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1b0b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1b0c0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1b0d0 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
1b0e0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31  jc!=2 && objc!=1
1b0f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b100 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b110 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b120 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b130 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b140 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b150 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1b160 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1b170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b180 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1b190 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54  ame = objc>1 ? T
1b1a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b1b0 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c  v[1]) : 0;.  sql
1b1c0 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
1b1d0 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
1b1e0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1b1f0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1b200 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1b210 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b220 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1b230 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1b240 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1b250 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b260 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1b270 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41  3_open_v2 FILENA
1b280 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a  ME FLAGS VFS.*/.
1b290 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b2a0 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20  open_v2(.  void 
1b2b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b2c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b2d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b2e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b2f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1b300 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1b310 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
1b320 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c   *zVfs;.  int fl
1b330 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ags = 0;.  sqlit
1b340 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1b350 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1b360 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67  0];..  int nFlag
1b370 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  ;.  Tcl_Obj **ap
1b380 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Flag;.  int i;..
1b390 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
1b3a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1b3b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1b3c0 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
1b3d0 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20   FLAGS VFS");.  
1b3e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1b3f0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e  OR;.  }.  zFilen
1b400 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1b410 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
1b420 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1b430 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
1b440 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78   if( zVfs[0]==0x
1b450 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a  00 ) zVfs = 0;..
1b460 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
1b470 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
1b480 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1b490 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b  nFlag, &apFlag);
1b4a0 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1b4b0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b4c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61   for(i=0; i<nFla
1b4d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
1b4e0 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75   iFlag;.    stru
1b4f0 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20  ct OpenFlag {.  
1b500 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b510 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74  zFlag;.      int
1b520 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c   flag;.    } aFl
1b530 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ag[] = {.      {
1b540 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   "SQLITE_OPEN_RE
1b550 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f  ADONLY", SQLITE_
1b560 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
1b570 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b580 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22  _OPEN_READWRITE"
1b590 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1b5a0 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20  ADWRITE },.     
1b5b0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b5c0 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f  CREATE", SQLITE_
1b5d0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
1b5e0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b5f0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1b600 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b610 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c  DELETEONCLOSE },
1b620 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b630 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22  _OPEN_EXCLUSIVE"
1b640 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  , SQLITE_OPEN_EX
1b650 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20  CLUSIVE },.     
1b660 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b670 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49  AUTOPROXY", SQLI
1b680 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
1b690 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1b6a0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1b6b0 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1b6c0 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20  MAIN_DB },.     
1b6d0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b6e0 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45  TEMP_DB", SQLITE
1b6f0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c  _OPEN_TEMP_DB },
1b700 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b710 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1b720 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1b730 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c  _TRANSIENT_DB },
1b740 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b750 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1b760 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1b770 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _MAIN_JOURNAL },
1b780 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b790 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1b7a0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1b7b0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _TEMP_JOURNAL },
1b7c0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b7d0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1b7e0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
1b7f0 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  UBJOURNAL },.   
1b800 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b810 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1b820 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1b830 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  ASTER_JOURNAL },
1b840 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b850 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20  _OPEN_NOMUTEX", 
1b860 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1b870 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1b880 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1b890 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f  MUTEX", SQLITE_O
1b8a0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c  PEN_FULLMUTEX },
1b8b0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b8c0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1b8d0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1b8e0 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
1b8f0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b900 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
1b910 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
1b920 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
1b930 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b940 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45  PEN_WAL", SQLITE
1b950 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20  _OPEN_WAL },.   
1b960 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1b970 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f  N_URI", SQLITE_O
1b980 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20  PEN_URI },.     
1b990 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
1b9a0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
1b9b0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
1b9c0 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c  uct(interp, apFl
1b9d0 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69  ag[i], aFlag, si
1b9e0 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20  zeof(aFlag[0]), 
1b9f0 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c  .        "flag",
1ba00 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29   0, &iFlag.    )
1ba10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  ;.    if( rc!=TC
1ba20 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1ba30 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61  ;.    flags |= a
1ba40 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67  Flag[iFlag].flag
1ba50 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1ba60 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46  lite3_open_v2(zF
1ba70 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  ilename, &db, fl
1ba80 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66  ags, zVfs);.  if
1ba90 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1baa0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1bab0 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1bac0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bad0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1bae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1baf0 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1bb00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1bb10 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1bb20 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
1bb30 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
1bb40 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31  c int test_open1
1bb50 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1bb60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1bb70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1bb80 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1bb90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1bba0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1bbb0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1bbc0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1bbd0 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1bbe0 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
1bbf0 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1bc00 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1bc10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bc20 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1bc30 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1bc40 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1bc50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bc60 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1bc70 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
1bc80 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1bc90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1bca0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
1bcb0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1bcc0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1bcd0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
1bce0 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  16(zFilename, &d
1bcf0 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1bd00 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1bd10 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1bd20 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1bd30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1bd40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bd50 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1bd60 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1bd70 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1bd80 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bd90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bda0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  : sqlite3_comple
1bdb0 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72  te16 <UTF-16 str
1bdc0 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ing>.**.** Retur
1bdd0 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c  n 1 if the suppl
1bde0 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ied argument is 
1bdf0 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
1be00 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72  tatement, or zer
1be10 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  o.** otherwise..
1be20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1be30 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20  st_complete16(. 
1be40 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1be50 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1be60 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1be70 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1be80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1be90 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1bea0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
1beb0 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  TE) && !defined(
1bec0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1bed0 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  6).  char *zBuf;
1bee0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bef0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1bf00 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1bf10 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31  1, objv, "<utf-1
1bf20 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65  6 sql>");.    re
1bf30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bf40 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63    }..  zBuf = (c
1bf50 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
1bf60 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1bf70 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
1bf80 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1bf90 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1bfa0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  bj(sqlite3_compl
1bfb0 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23  ete16(zBuf)));.#
1bfc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1bfd0 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26  OMIT_COMPLETE &&
1bfe0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1bff0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1c000 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c010 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
1c020 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
1c030 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
1c040 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
1c050 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1c060 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20  int test_step(. 
1c070 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c080 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c090 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c0a0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c0b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c0c0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c0d0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
1c0e0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1c0f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c100 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c110 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c120 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c130 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c140 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c150 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
1c160 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c170 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c180 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c190 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c1a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c1b0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c1c0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1c1d0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1c1e0 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
1c1f0 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
1c200 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1c210 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c220 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
1c230 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1c240 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1c250 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
1c260 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c270 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c280 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
1c290 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c2a0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c2b0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c2c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c2d0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c2e0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1c2f0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c300 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1c310 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1c320 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
1c330 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c340 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1c350 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1c360 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c370 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c380 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1c390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1c3a0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1c3b0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
1c3c0 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54  e3_sql(pStmt), T
1c3d0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
1c3e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c400 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1c410 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
1c420 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1c430 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1c440 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
1c450 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
1c460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1c470 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
1c480 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c490 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c4a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c4b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c4c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1c4d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1c4e0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1c4f0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c500 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c510 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c520 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c530 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c540 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c550 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1c560 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1c570 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c580 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c590 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c5a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c5b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c5c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c5d0 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1c5e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1c5f0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1c600 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
1c610 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1c620 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c630 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1c640 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1c650 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _type STMT colum
1c660 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1c670 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64  he type of the d
1c680 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1c690 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1c6a0 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74  rrent row..*/.st
1c6b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1c6c0 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69  lumn_type(.  voi
1c6d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c6e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c6f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c700 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c710 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c720 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c730 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1c740 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20   int tp;..  if( 
1c750 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1c760 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c770 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c780 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c790 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1c7a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c7b0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1c7c0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1c7d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c7e0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1c7f0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1c800 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c810 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1c820 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1c830 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1c840 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1c850 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1c860 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1c870 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d  L_ERROR;..  tp =
1c880 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c890 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  type(pStmt, col)
1c8a0 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29  ;.  switch( tp )
1c8b0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1c8c0 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20  E_INTEGER: .    
1c8d0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1c8e0 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52  interp, "INTEGER
1c8f0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1c900 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c910 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
1c920 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  LL:.      Tcl_Se
1c930 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1c940 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54  "NULL", TCL_STAT
1c950 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c960 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1c970 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
1c980 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1c990 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54  terp, "FLOAT", T
1c9a0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1c9b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1c9c0 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
1c9d0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1c9e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58  ult(interp, "TEX
1c9f0 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1ca00 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1ca10 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
1ca20 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  LOB:.      Tcl_S
1ca30 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1ca40 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41   "BLOB", TCL_STA
1ca50 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1ca60 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1ca70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
1ca80 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1ca90 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1caa0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1cab0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d  column_int64 STM
1cac0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1cad0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1cae0 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1caf0 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1cb00 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a   row cast as an.
1cb10 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29  ** wide (64-bit)
1cb20 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1cb30 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1cb40 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  umn_int64(.  voi
1cb50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1cb60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cb70 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cb80 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cb90 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1cba0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1cbb0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1cbc0 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66   i64 iVal;..  if
1cbd0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1cbe0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1cbf0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1cc00 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1cc10 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1cc20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1cc30 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1cc40 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1cc50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cc60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1cc70 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1cc80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1cc90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1cca0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1ccb0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1ccc0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1ccd0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1cce0 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1ccf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56  TCL_ERROR;..  iV
1cd00 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1cd10 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1cd20 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1cd30 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1cd40 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
1cd50 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(iVal));.  re
1cd60 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1cd70 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1cd80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1cd90 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1cda0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1cdb0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
1cdc0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1cdd0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1cde0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1cdf0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1ce00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1ce10 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ce20 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1ce30 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
1ce40 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
1ce50 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1ce60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ce70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ce80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ce90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1cea0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1ceb0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1cec0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1ced0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cee0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1cef0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1cf00 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1cf10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1cf20 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1cf30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cf40 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1cf50 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1cf60 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1cf70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cf80 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
1cf90 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1cfa0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
1cfb0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
1cfc0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1cfd0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1cfe0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1cff0 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
1d000 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
1d010 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
1d020 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1d030 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1d040 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
1d050 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1d060 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1d070 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1d080 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1d090 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
1d0a0 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
1d0b0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1d0c0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
1d0d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1d0e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d0f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d100 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d110 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1d120 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1d130 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
1d140 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
1d150 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1d160 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d170 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1d180 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1d190 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1d1a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d1b0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1d1c0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1d1d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d1e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1d1f0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1d200 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1d210 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1d220 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1d230 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1d240 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1d250 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1d260 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1d270 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
1d280 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1d290 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
1d2a0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1d2b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1d2c0 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
1d2d0 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
1d2e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d2f0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d300 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
1d310 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
1d320 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1d330 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
1d340 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
1d350 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
1d360 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1d370 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  data_count(.  vo
1d380 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d390 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d3a0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d3b0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d3c0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d3d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d3e0 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1d3f0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1d400 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d410 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d420 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d430 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d440 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d450 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d460 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d470 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d480 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d490 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d4a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d4b0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d4c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d4d0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1d4e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1d4f0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1d500 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
1d510 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
1d520 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d530 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d540 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
1d550 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1d560 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1d570 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
1d580 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1d590 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1d5a0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
1d5b0 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1d5c0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1d5d0 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
1d5e0 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1d5f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d600 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1d610 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1d620 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1d630 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1d640 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1d650 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1d660 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1d670 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1d680 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1d690 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
1d6a0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20  3_stmt*, int);. 
1d6b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1d6c0 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  t;..  xFunc = (c
1d6d0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73  onst char *(*)(s
1d6e0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1d6f0 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1d700 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1d710 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1d720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1d730 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1d740 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1d750 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1d760 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1d770 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1d780 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d790 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1d7a0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1d7b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d7c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d7d0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1d7e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1d7f0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d800 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d810 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1d820 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d830 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
1d840 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
1d850 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
1d860 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1d870 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
1d880 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1d890 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1d8a0 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62  ic int test_glob
1d8b0 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f  al_recover(.  vo
1d8c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d8d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d8e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d8f0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d900 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1d910 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d920 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69  T_DEPRECATED.  i
1d930 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
1d940 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1d950 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1d960 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1d970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d980 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1d990 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  c = sqlite3_glob
1d9a0 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20  al_recover();.  
1d9b0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1d9c0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1d9d0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1d9e0 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64  CL_STATIC);.#end
1d9f0 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1da00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1da10 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1da20 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1da30 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1da40 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1da50 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1da60 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1da70 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1da80 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1da90 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1daa0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28  test_stmt_utf16(
1dab0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1dac0 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69  Data,     /* Poi
1dad0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1dae0 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1daf0 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1db00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1db10 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1db20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1db30 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1db40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1db50 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  F16.  sqlite3_st
1db60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1db70 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   col;.  Tcl_Obj 
1db80 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76  *pRet;.  const v
1db90 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20  oid *zName16;.  
1dba0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46  const void *(*xF
1dbb0 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1dbc0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
1dbd0 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  nc = (const void
1dbe0 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1dbf0 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1dc00 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1dc10 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1dc20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1dc30 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1dc40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1dc50 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1dc60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1dc70 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1dc80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1dc90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1dca0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1dcb0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1dcc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1dcd0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1dce0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dcf0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1dd00 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1dd10 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1dd20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1dd30 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
1dd40 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1dd50 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
1dd60 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  16 ){.    int n;
1dd70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1dd80 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20  *z = zName16;.  
1dd90 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
1dda0 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29  || z[n+1]; n+=2)
1ddb0 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  {}.    pRet = Tc
1ddc0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1ddd0 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b  j(zName16, n+2);
1dde0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1ddf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1de00 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  et);.  }.#endif 
1de10 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1de20 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72  TF16 */..  retur
1de30 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1de40 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1de50 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
1de60 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1de70 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1de80 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
1de90 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1dea0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1deb0 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
1dec0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
1ded0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1dee0 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
1def0 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
1df00 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1df10 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1df20 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
1df30 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1df40 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1df50 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1df60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1df70 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1df80 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1df90 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
1dfa0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1dfb0 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1dfc0 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33  (int (*)(sqlite3
1dfd0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1dfe0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1dff0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1e000 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e010 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e020 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e030 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1e040 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e050 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1e060 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1e070 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e080 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1e090 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1e0a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e0b0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1e0c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e0d0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1e0e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1e0f0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1e100 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1e110 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1e120 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e130 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e140 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  j(xFunc(pStmt, c
1e150 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ol)));.  return 
1e160 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1e170 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
1e180 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
1e190 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
1e1a0 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
1e1b0 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
1e1c0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1e1d0 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
1e1e0 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
1e1f0 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
1e200 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
1e210 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e220 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e230 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1e240 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1e250 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e260 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1e270 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e280 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e290 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e2a0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1e2b0 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
1e2c0 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
1e2d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e2e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1e2f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1e300 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1e310 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e320 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
1e330 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1e340 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
1e350 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1e360 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1e370 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
1e380 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1e390 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1e3a0 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
1e3b0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1e3c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
1e3d0 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
1e3e0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1e3f0 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1e400 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
1e410 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1e420 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
1e430 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1e440 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1e450 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
1e460 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1e470 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1e480 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
1e490 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
1e4a0 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1e4b0 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d  2], (int*)&db->m
1e4c0 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74  agic) ){.    ret
1e4d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e4e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1e4f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e500 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ge:  sqlite3_int
1e510 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a  errupt  DB .**.*
1e520 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74  * Trigger an int
1e530 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a  errupt on DB.*/.
1e540 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1e550 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
1e560 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1e570 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1e580 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1e590 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1e5a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1e5b0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1e5c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1e5d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e5e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1e5f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1e600 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
1e610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1e620 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1e630 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1e640 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1e650 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1e660 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
1e670 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
1e680 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1e690 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
1e6a0 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
1e6b0 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
1e6c0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
1e6d0 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
1e6e0 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
1e6f0 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
1e700 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
1e710 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
1e720 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
1e730 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
1e740 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67  gBuf)/sizeof(big
1e750 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69  Buf[0]); i++) bi
1e760 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
1e770 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
1e780 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1e790 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
1e7a0 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
1e7b0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
1e7c0 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
1e7d0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
1e7e0 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
1e7f0 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
1e800 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
1e810 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
1e820 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1e830 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
1e840 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1e850 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
1e860 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
1e870 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
1e880 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
1e890 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
1e8a0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
1e8b0 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
1e8c0 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
1e8d0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
1e8e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e8f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e900 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1e910 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1e920 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1e930 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
1e940 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e950 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e960 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e970 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1e980 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1e990 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
1e9a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e9b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1e9c0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1e9d0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1e9e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e9f0 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
1ea00 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
1ea10 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
1ea20 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
1ea30 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
1ea40 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
1ea50 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1ea60 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
1ea70 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
1ea80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1ea90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1eaa0 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
1eab0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1eac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ead0 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
1eae0 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
1eaf0 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1eb00 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
1eb10 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
1eb20 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1eb30 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
1eb40 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
1eb50 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
1eb60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
1eb70 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
1eb80 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
1eb90 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
1eba0 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1ebb0 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1ebc0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1ebd0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
1ebe0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ebf0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ec00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1ec10 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1ec20 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1ec30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1ec40 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1ec50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ec60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ec70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ec80 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1ec90 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1eca0 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1ecb0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1ecc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1ecd0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1ece0 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1ecf0 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1ed00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1ed10 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1ed20 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
1ed30 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
1ed40 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
1ed50 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1ed60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1ed70 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1ed80 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1ed90 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1eda0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1edb0 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1edc0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
1edd0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
1ede0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1edf0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1ee00 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
1ee10 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1ee20 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
1ee30 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1ee40 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
1ee50 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
1ee60 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
1ee70 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
1ee80 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1ee90 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1eea0 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
1eeb0 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
1eec0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1eed0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1eee0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1eef0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1ef00 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1ef10 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1ef20 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1ef30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1ef40 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1ef50 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1ef60 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1ef70 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1ef80 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1ef90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1efa0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1efb0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1efc0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1efd0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1efe0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1eff0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1f000 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
1f010 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
1f020 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1f030 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1f040 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1f050 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1f060 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1f070 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f080 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
1f090 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
1f0a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1f0b0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
1f0c0 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
1f0d0 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
1f0e0 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
1f0f0 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
1f100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1f110 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
1f120 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f130 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f140 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1f150 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1f160 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
1f170 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
1f180 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1f190 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1f1a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f1b0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f1c0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f1d0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f1e0 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1f1f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f200 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1f210 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1f220 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1f230 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f240 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
1f250 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1f260 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64  zBuf), zBuf, "%d
1f270 22 2c 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  ", sqlite3_get_a
1f280 75 74 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a  utocommit(db));.
1f290 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f2a0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1f2b0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1f2c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f2d0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75  sage: sqlite3_bu
1f2e0 73 79 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53  sy_timeout DB MS
1f2f0 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  .**.** Set the b
1f300 75 73 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68  usy timeout.  Th
1f310 69 73 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c  is is more easil
1f320 79 20 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65  y done using the
1f330 20 74 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68   timeout.** meth
1f340 6f 64 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e  od of the TCL in
1f350 74 65 72 66 61 63 65 2e 20 20 42 75 74 20 77 65  terface.  But we
1f360 20 6e 65 65 64 20 61 20 77 61 79 20 74 6f 20 74   need a way to t
1f370 65 73 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20  est the case.** 
1f380 77 68 65 72 65 20 69 74 20 72 65 74 75 72 6e 73  where it returns
1f390 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a   SQLITE_MISUSE..
1f3a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f3b0 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  st_busy_timeout(
1f3c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f3d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f3e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f3f0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1f400 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
1f410 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69 74 65 33  c, ms;.  sqlite3
1f420 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1f430 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1f440 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f450 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f460 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f470 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f480 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1f490 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f4a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1f4b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1f4c0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1f4d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f4e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1f4f0 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1f500 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
1f510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f520 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f530 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 64 62 2c  busy_timeout(db,
1f540 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   ms);.  Tcl_Appe
1f550 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f560 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1f570 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1f580 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f590 2a 2a 20 55 73 61 67 65 3a 20 20 74 63 6c 5f 76  ** Usage:  tcl_v
1f5a0 61 72 69 61 62 6c 65 5f 74 79 70 65 20 56 41 52  ariable_type VAR
1f5b0 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  IABLENAME.**.** 
1f5c0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1f5d0 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  of the internal 
1f5e0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 66  representation f
1f5f0 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20  or the.** value 
1f600 6f 66 20 74 68 65 20 67 69 76 65 6e 20 76 61 72  of the given var
1f610 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
1f620 20 69 6e 74 20 74 63 6c 5f 76 61 72 69 61 62 6c   int tcl_variabl
1f630 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20 2a  e_type(.  void *
1f640 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f650 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f660 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1f670 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1f680 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f  objv[].){.  Tcl_
1f690 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66 28  Obj *pVar;.  if(
1f6a0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1f6b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1f6c0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1f6d0 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a 20  , "VARIABLE");. 
1f6e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f6f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72 20  ROR;.  }.  pVar 
1f700 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78 28  = Tcl_GetVar2Ex(
1f710 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1f720 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1f730 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52 52  0, TCL_LEAVE_ERR
1f740 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56 61  _MSG);.  if( pVa
1f750 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  r==0 ) return TC
1f760 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70  L_ERROR;.  if( p
1f770 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b 0a  Var->typePtr ){.
1f780 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1f790 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1f7a0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56  _NewStringObj(pV
1f7b0 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61 6d  ar->typePtr->nam
1f7c0 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72  e, -1));.  }.  r
1f7d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f7e0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1f7f0 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1f800 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20  emory ?N?.**.** 
1f810 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61  Attempt to relea
1f820 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  se memory curren
1f830 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f 74  tly held but not
1f840 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
1f850 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65 67  ed..** The integ
1f860 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  er N is the numb
1f870 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20 61  er of bytes we a
1f880 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65 6c  re trying to rel
1f890 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20 72  ease.  The .** r
1f8a0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1f8b0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
1f8c0 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  ory actually rel
1f8d0 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eased..*/.static
1f8e0 20 69 6e 74 20 74 65 73 74 5f 72 65 6c 65 61 73   int test_releas
1f8f0 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64  e_memory(.  void
1f900 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f910 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f920 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f930 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f940 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
1f950 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1f960 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
1f970 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
1f980 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1f990 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e  _DISKIO).  int N
1f9a0 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69  ;.  int amt;.  i
1f9b0 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62  f( objc!=1 && ob
1f9c0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1f9d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f9e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f9f0 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ?N?");.    retur
1fa00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1fa10 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29  .  if( objc==2 )
1fa20 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
1fa30 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1fa40 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
1fa50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fa60 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
1fa70 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20    N = -1;.  }.  
1fa80 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  amt = sqlite3_re
1fa90 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b  lease_memory(N);
1faa0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1fab0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1fac0 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b  NewIntObj(amt));
1fad0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1fae0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1faf0 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1fb00 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
1fb10 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74  mory DB.**.** At
1fb20 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65  tempt to release
1fb30 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c   memory currentl
1fb40 79 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61  y held by databa
1fb50 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74  se DB.  Return t
1fb60 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64  he.** result cod
1fb70 65 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20  e (which in the 
1fb80 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e  current implemen
1fb90 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73  tation is always
1fba0 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69   zero)..*/.stati
1fbb0 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65  c int test_db_re
1fbc0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20  lease_memory(.  
1fbd0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1fbe0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1fbf0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1fc00 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1fc10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1fc20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1fc30 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f   int rc;.  if( o
1fc40 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1fc50 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1fc60 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1fc70 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  "DB");.    retur
1fc80 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1fc90 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1fca0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1fcb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1fcc0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1fcd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
1fce0 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  c = sqlite3_db_r
1fcf0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62  elease_memory(db
1fd00 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1fd10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1fd20 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
1fd30 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1fd40 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1fd50 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e:  sqlite3_db_f
1fd60 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d  ilename DB DBNAM
1fd70 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
1fd80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
1fd90 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
1fda0 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  h a database..*/
1fdb0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1fdc0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20  _db_filename(.  
1fdd0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1fde0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1fdf0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1fe00 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1fe10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1fe20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1fe30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1fe40 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Name;.  if( objc
1fe50 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
1fe60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1fe70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
1fe80 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
1fe90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fea0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1feb0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1fec0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1fed0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1fee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fef0 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c  .  zDbName = Tcl
1ff00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ff10 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
1ff20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ff30 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
1ff40 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
1ff50 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72  , (void*)0);.  r
1ff60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ff70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1ff80 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
1ff90 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a  ly DB DBNAME.**.
1ffa0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  ** Return 1 or 0
1ffb0 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65   if DBNAME is re
1ffc0 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20  adonly or not.  
1ffd0 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e  Return -1 if DBN
1ffe0 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  AME does.** not 
1fff0 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  exist..*/.static
20000 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 72 65 61   int test_db_rea
20010 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20  donly(.  void * 
20020 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20030 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20040 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20050 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20060 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20070 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
20080 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
20090 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
200a0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
200b0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
200c0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
200d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
200e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
200f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
20100 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
20110 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
20120 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
20130 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
20140 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
20150 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
20160 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
20170 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
20180 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64  IntObj(sqlite3_d
20190 62 5f 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a  b_readonly(db, z
201a0 44 62 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74  DbName)));.  ret
201b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
201c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
201d0 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  ite3_soft_heap_l
201e0 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51  imit ?N?.**.** Q
201f0 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
20200 73 6f 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20  soft heap limit 
20210 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
20220 74 68 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20  thread.  The.** 
20230 6c 69 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68  limit is only ch
20240 61 6e 67 65 64 20 69 66 20 74 68 65 20 4e 20 69  anged if the N i
20250 73 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  s present.  The 
20260 70 72 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a  previous limit.*
20270 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
20280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20290 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  t_soft_heap_limi
202a0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
202b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
202c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
202d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
202e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
202f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ].){.  sqlite3_i
20300 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63 6c 5f  nt64 amt;.  Tcl_
20310 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a  WideInt N = -1;.
20320 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26    if( objc!=1 &&
20330 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20340 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20350 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20360 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65  , "?N?");.    re
20370 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20380 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d    }.  if( objc==
20390 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  2 ){.    if( Tcl
203a0 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
203b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
203c0 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
203d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
203e0 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f    amt = sqlite3_
203f0 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 36  soft_heap_limit6
20400 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  4(N);.  Tcl_SetO
20410 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
20420 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
20430 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65 74 75  bj(amt));.  retu
20440 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20450 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
20460 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
20470 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  nup.**.** Call t
20480 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  he sqlite3_threa
20490 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e 0a 2a  d_cleanup API..*
204a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
204b0 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
204c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
204d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
204e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
204f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
20500 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20510 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
20520 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
20530 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
20540 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
20550 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
20560 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20570 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
20580 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
20590 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
205a0 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
205b0 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
205c0 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
205d0 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
205e0 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
205f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
20600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
20610 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
20620 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
20630 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20640 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
20650 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20660 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20670 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
20680 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
20690 6e 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f  nt v, *a;.  Tcl_
206a0 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20  Obj *pResult;.. 
206b0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
206c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
206d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
206e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
206f0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
20700 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
20710 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
20720 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
20730 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20740 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
20750 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
20760 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
20770 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
20780 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20790 52 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20  RROR;.  pResult 
207a0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
207b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
207c0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
207d0 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
207e0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  Bt==0 ){.      v
207f0 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
20800 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20810 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
20820 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20  mutex);.      a 
20830 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
20840 61 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65  ats(sqlite3Btree
20850 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d  Pager(db->aDb[i]
20860 2e 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20  .pBt));.      v 
20870 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71  = a[0];.      sq
20880 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20890 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
208a0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
208b0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
208c0 28 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c  (0, pResult, Tcl
208d0 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a  _NewIntObj(v));.
208e0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
208f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
20900 52 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72  Result);.  retur
20910 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
20920 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f  .** tclcmd:   wo
20930 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a  rking_64bit_int.
20940 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62  **.** Some TCL b
20950 75 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69  uilds (ex: cygwi
20960 6e 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72  n) do not suppor
20970 74 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  t 64-bit integer
20980 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64  s.  This.** lead
20990 73 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66  s to a number of
209a0 20 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20   test failures. 
209b0 20 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d   The present com
209c0 6d 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a  mand checks the.
209d0 2a 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20  ** TCL build to 
209e0 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
209f0 6f 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36  ot it supports 6
20a00 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20  4-bit integers. 
20a10 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54   It.** returns T
20a20 52 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61  RUE if it does a
20a30 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
20a40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d  .**.** This comm
20a50 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77  and is used to w
20a60 61 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74  arn users that t
20a70 68 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69  heir TCL build i
20a80 73 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61  s defective.** a
20a90 6e 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f  nd that the erro
20aa0 72 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69  rs they are seei
20ab0 6e 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73  ng in the test s
20ac0 63 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a  cripts might be.
20ad0 2a 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  ** a result of t
20ae0 68 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54  heir defective T
20af0 43 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  CL rather than p
20b00 72 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74  roblems in SQLit
20b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20b20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69   working_64bit_i
20b30 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  nt(.  ClientData
20b40 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
20b50 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
20b60 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
20b70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
20b80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
20b90 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
20ba0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
20bb0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
20bc0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
20bd0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
20be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
20bf0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
20c00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20c10 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
20c20 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
20c30 54 63 6c 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62  Tcl_Obj *pTestOb
20c40 6a 3b 0a 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67  j;.  int working
20c50 20 3d 20 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62   = 0;..  pTestOb
20c60 6a 20 3d 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  j = Tcl_NewWideI
20c70 6e 74 4f 62 6a 28 31 30 30 30 30 30 30 2a 28 69  ntObj(1000000*(i
20c80 36 34 29 31 32 33 34 35 36 37 38 39 30 29 3b 0a  64)1234567890);.
20c90 20 20 77 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63    working = strc
20ca0 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
20cb0 28 70 54 65 73 74 4f 62 6a 29 2c 20 22 31 32 33  (pTestObj), "123
20cc0 34 35 36 37 38 39 30 30 30 30 30 30 30 22 29 3d  4567890000000")=
20cd0 3d 30 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  =0;.  Tcl_DecrRe
20ce0 66 43 6f 75 6e 74 28 70 54 65 73 74 4f 62 6a 29  fCount(pTestObj)
20cf0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
20d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
20d10 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77  _NewBooleanObj(w
20d20 6f 72 6b 69 6e 67 29 29 3b 0a 20 20 72 65 74 75  orking));.  retu
20d30 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
20d40 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76  *.** tclcmd:   v
20d50 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a  fs_unlink_test.*
20d60 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
20d70 6d 6d 61 6e 64 20 75 6e 72 65 67 69 73 74 65 72  mmand unregister
20d80 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 56 46  s the primary VF
20d90 53 20 61 6e 64 20 74 68 65 6e 20 72 65 67 69 73  S and then regis
20da0 74 65 72 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20  ters.** it back 
20db0 61 67 61 69 6e 2e 20 20 54 68 69 73 20 69 73 20  again.  This is 
20dc0 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
20dd0 20 61 62 69 6c 69 74 79 20 74 6f 20 72 65 67 69   ability to regi
20de0 73 74 65 72 20 61 0a 2a 2a 20 56 46 53 20 77 68  ster a.** VFS wh
20df0 65 6e 20 6e 6f 6e 65 20 61 72 65 20 70 72 65 76  en none are prev
20e00 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
20e10 64 2c 20 61 6e 64 20 74 68 65 20 61 62 69 6c 69  d, and the abili
20e20 74 79 20 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69  ty to .** unregi
20e30 73 74 65 72 20 74 68 65 20 6f 6e 6c 79 20 61 76  ster the only av
20e40 61 69 6c 61 62 6c 65 20 56 46 53 2e 20 20 54 69  ailable VFS.  Ti
20e50 63 6b 65 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74  cket #2738.*/.st
20e60 61 74 69 63 20 69 6e 74 20 76 66 73 5f 75 6e 6c  atic int vfs_unl
20e70 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ink_test(.  Clie
20e80 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
20e90 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
20ea0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
20eb0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
20ec0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20ed0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
20ee0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
20ef0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
20f00 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
20f10 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
20f20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20f30 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
20f40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20f50 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
20f60 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
20f70 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  .){.  int i;.  s
20f80 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d 61 69  qlite3_vfs *pMai
20f90 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n;.  sqlite3_vfs
20fa0 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20 20 73   *apVfs[20];.  s
20fb0 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 2c 20  qlite3_vfs one, 
20fc0 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  two;..  sqlite3_
20fd0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 30  vfs_unregister(0
20fe0 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  );   /* Unregist
20ff0 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20 68 61  er of NULL is ha
21000 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e  rmless */.  one.
21010 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b  zName = "__one";
21020 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22  .  two.zName = "
21030 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61  __two";..  /* Ca
21040 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 76 66  lling sqlite3_vf
21050 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20  s_register with 
21060 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  2nd argument of 
21070 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  0 does not.  ** 
21080 63 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  change the defau
21090 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20 70 4d  lt VFS.  */.  pM
210a0 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  ain = sqlite3_vf
210b0 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73 71 6c  s_find(0);.  sql
210c0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
210d0 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 61 73  r(&one, 0);.  as
210e0 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
210f0 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
21100 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21110 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
21120 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30 29 3b  gister(&two, 0);
21130 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e  .  assert( pMain
21140 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71  ==0 || pMain==sq
21150 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21160 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 63 61  ) );..  /* We ca
21170 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62 79 20  n find a VFS by 
21180 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 73  its name */.  as
21190 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
211a0 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
211b0 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
211c0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
211d0 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
211e0 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  wo );..  /* Call
211f0 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73 5f 72  ing sqlite_vfs_r
21200 65 67 69 73 74 65 72 20 77 69 74 68 20 6e 6f 6e  egister with non
21210 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70 61 72  -zero second par
21220 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73 20 74  ameter changes t
21230 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  he.  ** default 
21240 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74 68 65  VFS, even if the
21250 20 31 73 74 20 70 61 72 61 6d 65 74 65 72 20 69   1st parameter i
21260 73 20 61 6e 20 65 78 69 73 74 69 67 20 56 46 53  s an existig VFS
21270 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 70 72   that is.  ** pr
21280 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
21290 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e 2d 64  red as the non-d
212a0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73  efault..  */.  s
212b0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
212c0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
212d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
212e0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
212f0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
21300 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
21310 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
21320 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  &two );.  assert
21330 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21340 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  nd(0)==&one );. 
21350 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
21360 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29 3b 0a  ister(&two, 1);.
21370 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21380 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
21390 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
213a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
213b0 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
213c0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
213d0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
213e0 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20 29 3b  find(0)==&two );
213f0 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a  .  if( pMain ){.
21400 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
21410 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
21420 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
21430 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21440 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
21450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
21460 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21470 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
21480 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
21490 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
214a0 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a  )==pMain );.  }.
214b0 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74    .  /* Unlink t
214c0 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 2e 20  he default VFS. 
214d0 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
214e0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
214f0 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67 69 73  VFSes.  ** regis
21500 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  tered..  */.  fo
21510 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
21520 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
21530 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Vfs[0]); i++){. 
21540 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
21550 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
21560 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
21570 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61 73 73  [i] ){.      ass
21580 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
21590 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
215a0 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
215b0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
215c0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
215d0 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20 20 20  (apVfs[i]);.    
215e0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
215f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70  ite3_vfs_find(ap
21600 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29  Vfs[i]->zName) )
21610 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
21620 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
21630 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
21640 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72    .  /* Register
21650 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 73   the main VFS as
21660 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28 77 69   non-default (wi
21670 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66 61 75  ll be made defau
21680 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a 20 69  lt, since.  ** i
21690 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e 6c 79  t'll be the only
216a0 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65 6e 63   one in existenc
216b0 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  e)..  */.  sqlit
216c0 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
216d0 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61 73 73  pMain, 0);.  ass
216e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
216f0 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20  _find(0)==pMain 
21700 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d 72 65  );.  .  /* Un-re
21710 67 69 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20  gister the main 
21720 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72 65 73  VFS again to res
21730 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20 56 46  tore an empty VF
21740 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69  S list */.  sqli
21750 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
21760 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61 73 73  er(pMain);.  ass
21770 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
21780 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
21790 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c 6c 20    /* Relink all 
217a0 56 46 53 65 73 20 69 6e 20 72 65 76 65 72 73 65  VFSes in reverse
217b0 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20 20 66   order. */  .  f
217c0 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70 56 66  or(i=sizeof(apVf
217d0 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
217e0 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  0])-1; i>=0; i--
217f0 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  ){.    if( apVfs
21800 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  [i] ){.      sql
21810 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21820 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29 3b 0a  r(apVfs[i], 1);.
21830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
21840 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
21850 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20  vfs_find(0) );. 
21860 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
21870 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
21880 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
21890 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
218a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65  }.  }..  /* Unre
218b0 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d 70 6c  gister out sampl
218c0 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20 73 71  e VFSes. */.  sq
218d0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
218e0 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71  ster(&one);.  sq
218f0 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21900 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20 20 2f  ster(&two);..  /
21910 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e 67 20  * Unregistering 
21920 61 20 56 46 53 20 74 68 61 74 20 69 73 20 6e 6f  a VFS that is no
21930 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 67 69  t currently regi
21940 73 74 65 72 65 64 20 69 73 20 68 61 72 6d 6c 65  stered is harmle
21950 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ss */.  sqlite3_
21960 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
21970 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
21980 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
21990 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  two);.  assert( 
219a0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
219b0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a  ("__one")==0 );.
219c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
219d0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
219e0 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  o")==0 );..  /* 
219f0 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c 65 66  We should be lef
21a00 74 20 77 69 74 68 20 74 68 65 20 6f 72 69 67 69  t with the origi
21a10 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46 53 20  nal default VFS 
21a20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20 2a 2a  back as the.  **
21a30 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20 20 61   original */.  a
21a40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
21a50 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
21a60 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  n );..  return T
21a70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
21a80 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 69 6e  tclcmd:   vfs_in
21a90 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a  itfail_test.**.*
21aa0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
21ab0 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 76  nd attempts to v
21ac0 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66 73 5f  fs_find and vfs_
21ad0 72 65 67 69 73 74 65 72 20 77 68 65 6e 20 74 68  register when th
21ae0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69  e.** sqlite3_ini
21af0 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65 72 66  tialize() interf
21b00 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67 2e 20  ace is failing. 
21b10 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f 75 6c   All calls shoul
21b20 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69  d fail..*/.stati
21b30 63 20 69 6e 74 20 76 66 73 5f 69 6e 69 74 66 61  c int vfs_initfa
21b40 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
21b50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
21b60 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
21b70 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
21b80 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
21b90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21ba0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
21bb0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
21bc0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
21bd0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
21be0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
21bf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21c00 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
21c10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21c20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
21c30 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
21c40 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
21c50 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
21c60 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
21c70 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
21c80 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
21c90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
21ca0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
21cb0 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
21cc0 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
21cd0 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
21ce0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
21cf0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21d00 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
21d10 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21d20 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
21d30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
21d40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
21d50 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
21d60 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
21d70 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
21d80 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
21d90 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
21da0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
21db0 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
21dc0 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
21dd0 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
21de0 20 69 6e 74 20 76 66 73 5f 75 6e 72 65 67 69 73   int vfs_unregis
21df0 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
21e00 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
21e10 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
21e20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
21e30 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
21e40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21e50 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
21e60 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
21e70 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
21e80 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
21e90 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
21ea0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21eb0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
21ec0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21ed0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
21ee0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
21ef0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
21f00 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
21f10 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
21f20 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
21f30 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21f40 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
21f50 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
21f60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
21f70 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
21f80 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
21f90 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
21fa0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
21fb0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
21fc0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
21fd0 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
21fe0 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
21ff0 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
22000 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
22010 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
22020 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c  fs_reregister_al
22030 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  l(.  ClientData 
22040 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
22050 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
22060 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
22070 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
22080 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
22090 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
220a0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
220b0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
220c0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
220d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
220e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
220f0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22100 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22110 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22120 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22130 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
22140 20 69 3c 6e 56 66 73 3b 20 69 2b 2b 29 7b 0a 20   i<nVfs; i++){. 
22150 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72     sqlite3_vfs_r
22160 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d  egister(apVfs[i]
22170 2c 20 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72  , i==0);.  }.  r
22180 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22190 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
221a0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
221b0 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69  est DB.**.** Thi
221c0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
221d0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
221e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
221f0 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72  rface and.** ver
22200 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70  ifies correct op
22210 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  eration of the s
22220 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
22230 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
22240 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
22250 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
22260 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
22270 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
22280 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
22290 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
222a0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
222b0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
222c0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
222d0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
222e0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
222f0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22300 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
22310 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22320 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
22330 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
22340 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
22350 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
22360 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
22370 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
22380 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22390 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
223a0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
223b0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
223c0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
223d0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
223e0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
223f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22400 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22410 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22420 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22430 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
22440 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22450 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
22460 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
22470 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
22480 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
22490 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
224a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
224b0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
224c0 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
224d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
224e0 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
224f0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
22500 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
22510 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22520 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
22530 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
22540 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
22550 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
22560 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
22570 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
22580 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
22590 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
225a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
225b0 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OUND || rc==SQLI
225c0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72  TE_ERROR );..  r
225d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
225e0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
225f0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
22600 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42  asterrno_test DB
22610 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
22620 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
22630 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
22640 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
22650 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
22660 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
22670 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
22680 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e  LAST_ERRNO verb.
22690 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
226a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74  ile_control_last
226b0 65 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c  errno_test(.  Cl
226c0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
226d0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
226e0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
226f0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22700 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22710 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22720 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22730 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22740 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22750 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
22760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22770 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22780 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
22790 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
227a0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
227b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67  */.){.  int iArg
227c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
227d0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
227e0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
227f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
22800 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
22810 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
22820 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
22830 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
22840 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
22850 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  , 0), " DB", 0);
22860 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22870 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
22880 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
22890 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
228a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
228b0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
228c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
228d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
228e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
228f0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53  NULL, SQLITE_LAS
22900 54 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b  T_ERRNO, &iArg);
22910 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20  .  if( rc ){ .  
22920 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22930 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22940 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a  ewIntObj(rc)); .
22950 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22960 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28  RROR; .  }.  if(
22970 20 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20   iArg!=0 ) {.   
22980 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22990 74 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70  t(interp, "Unexp
229a0 65 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65  ected non-zero e
229b0 72 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20  rrno: ",.       
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
229d0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
229e0 62 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  bj(Tcl_NewIntObj
229f0 28 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c  (iArg), 0), " ",
22a00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
22a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
22a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
22a30 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
22a40 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
22a50 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74  l_chunksize_test
22a60 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a   DB DBNAME SIZE.
22a70 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
22a80 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
22a90 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
22aa0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
22ab0 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
22ac0 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
22ad0 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47   of the SQLITE_G
22ae0 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
22af0 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53   and.** SQLITE_S
22b00 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
22b10 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69   verbs..*/.stati
22b20 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72  c int file_contr
22b30 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
22b40 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
22b50 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
22b60 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
22b70 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
22b80 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
22b90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
22ba0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
22bb0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
22bc0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
22bd0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
22be0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22bf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
22c00 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
22c10 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22c20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
22c30 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
22c40 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20  nt nSize;       
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22c60 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73 69 7a 65  * New chunk size
22c70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b   */.  char *zDb;
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65        /* Db name
22ca0 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
22cb0 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69   etc.) */.  sqli
22cc0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22ce0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
22cf0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74      /* file_cont
22d20 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64  rol() return cod
22d30 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  e */..  if( objc
22d40 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
22d50 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
22d60 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
22d70 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a   DBNAME SIZE");.
22d80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22d90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
22da0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
22db0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
22dc0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
22dd0 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74  ) .   || Tcl_Get
22de0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
22df0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53 69  p, objv[3], &nSi
22e00 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74 75  ze).  ){.   retu
22e10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22e20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
22e30 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
22e40 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d 3d  ;.  if( zDb[0]==
22e50 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55 4c  '\0' ) zDb = NUL
22e60 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  L;..  rc = sqlit
22e70 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22e80 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
22e90 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45  FCNTL_CHUNK_SIZE
22ea0 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65  , (void *)&nSize
22eb0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
22ec0 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
22ed0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
22ee0 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
22ef0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
22f00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
22f10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
22f20 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
22f30 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
22f40 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
22f50 65 68 69 6e 74 5f 74 65 73 74 20 44 42 20 44 42  ehint_test DB DB
22f60 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20  NAME SIZE.**.** 
22f70 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
22f80 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
22f90 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
22fa0 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20 77 69 74  nterface .** wit
22fb0 68 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  h SQLITE_FCNTL_S
22fc0 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73 74 61 74  IZE_HINT.*/.stat
22fd0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
22fe0 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
22ff0 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
23000 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
23010 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
23020 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
23030 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
23040 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
23050 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
23060 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
23070 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
23080 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
23090 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
230a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
230b0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
230c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
230d0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
230e0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  uments */.){.  T
230f0 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a 65  cl_WideInt nSize
23100 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
23110 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a 2f  * Hinted size */
23120 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  .  char *zDb;   
23130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23140 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22     /* Db name ("
23150 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
23160 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  c.) */.  sqlite3
23170 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
23180 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23190 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
231a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231c0 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   /* file_control
231d0 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  () return code *
231e0 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  /..  if( objc!=4
231f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23200 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23210 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
23220 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20  NAME SIZE");.   
23230 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23240 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23250 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23260 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23270 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a  objv[1]), &db) .
23280 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69 64     || Tcl_GetWid
23290 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
232a0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  rp, objv[3], &nS
232b0 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65 74  ize).  ){.   ret
232c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
232d0 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47   }.  zDb = Tcl_G
232e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
232f0 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d 3d  );.  if( zDb[0]=
23300 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e 55  ='\0' ) zDb = NU
23310 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  LL;..  rc = sqli
23320 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
23330 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45  (db, zDb, SQLITE
23340 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
23350 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a 65  , (void *)&nSize
23360 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23370 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
23380 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23390 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
233a0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
233b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
233c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
233d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
233e0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
233f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63  file_control_loc
23400 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20 50  kproxy_test DB P
23410 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  WD.**.** This TC
23420 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23430 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23440 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23450 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
23460 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
23470 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
23480 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
23490 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  ILE and.** SQLIT
234a0 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
234b0 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73 74  ILE verbs..*/.st
234c0 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
234d0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
234e0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
234f0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
23500 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
23510 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
23520 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
23530 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
23540 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
23550 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
23560 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
23570 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
23580 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
23590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
235a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
235b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
235c0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
235d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
235e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
235f0 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
23600 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23610 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23620 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23630 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
23660 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
23670 20 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20   0), " DB PWD", 
23680 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23690 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
236a0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
236b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
236c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
236d0 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
236e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
236f0 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
23700 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
23710 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
23720 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
23730 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
23740 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
23750 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
23760 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
23770 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
23780 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
23790 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
237a0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
237b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
237c0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
237d0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
237e0 20 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68    char *testPath
237f0 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
23800 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20    int nPwd;.    
23810 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64  const char *zPwd
23820 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79  ;.    char proxy
23830 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a  Path[400];.    .
23840 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47      zPwd = Tcl_G
23850 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23860 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b  objv[2], &nPwd);
23870 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28  .    if( sizeof(
23880 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b  proxyPath)<nPwd+
23890 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  20 ){.      Tcl_
238a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
238b0 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69  erp, "PWD too bi
238c0 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  g", (void*)0);. 
238d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
238e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
238f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
23900 66 28 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  f(sizeof(proxyPa
23910 74 68 29 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  th), proxyPath, 
23920 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c  "%s/test.proxy",
23930 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d   zPwd);.    rc =
23940 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23950 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
23960 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
23970 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
23980 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
23990 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
239a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
239b0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
239c0 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65  (rc)); .      re
239d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
239e0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
239f0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23a00 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
23a10 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
23a20 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74  XYFILE, &testPat
23a30 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  h);.    if( strn
23a40 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65  cmp(proxyPath,te
23a50 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20  stPath,11) ){.  
23a60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
23a70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f  sult(interp, "Lo
23a80 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69  ck proxy file di
23a90 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  d not match the 
23aa0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
23ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ac0 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73   "previously ass
23ad0 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29  igned value", 0)
23ae0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
23af0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
23b00 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
23b10 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
23b20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
23b30 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
23b40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23b50 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
23b60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23b70 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
23b80 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45   NULL, SQLITE_SE
23b90 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
23ba0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
23bb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23bc0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
23bd0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
23be0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
23bf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23c00 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
23c10 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
23c20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66  TCL_OK;  .}..#if
23c30 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
23c40 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
23c50 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
23c60 32 5f 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e  2_av_retry DB  N
23c70 52 45 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a  RETRY  DELAY.**.
23c80 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
23c90 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
23ca0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
23cb0 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
23cc0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
23cd0 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
23ce0 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  TRY opcode..*/.s
23cf0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
23d00 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
23d10 72 65 74 72 79 28 0a 20 20 43 6c 69 65 6e 74 44  retry(.  ClientD
23d20 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
23d30 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
23d40 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
23d50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
23d60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23d70 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
23d80 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
23d90 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
23da0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
23db0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
23dc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
23dd0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
23de0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
23df0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
23e00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
23e10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23e20 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
23e30 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31  a[2];.  char z[1
23e40 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
23e50 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
23e60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23e70 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23e80 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23e90 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
23ea0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
23eb0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
23ec0 20 4e 52 45 54 52 59 20 44 45 4c 41 59 22 2c 20   NRETRY DELAY", 
23ed0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23ef0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23f00 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
23f10 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
23f20 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
23f30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23f40 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
23f50 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
23f60 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30  p, objv[2], &a[0
23f70 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
23f80 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
23f90 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
23fa0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
23fb0 26 61 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 20  &a[1]) ) return 
23fc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
23fd0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
23fe0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
23ff0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
24000 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c 20 28 76  N32_AV_RETRY, (v
24010 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74  oid*)a);.  sqlit
24020 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
24030 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
24040 20 25 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20   %d", rc, a[0], 
24050 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[1]);.  Tcl_App
24060 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24070 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
24080 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24090 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
240a0 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
240b0 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e  ol_win32_set_han
240c0 64 6c 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a  dle DB HANDLE.**
240d0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
240e0 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
240f0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24100 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
24110 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
24120 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f  FCNTL_WIN32_SET_
24130 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a  HANDLE opcode..*
24140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
24150 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
24160 73 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c  set_handle(.  Cl
24170 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
24180 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
24190 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
241a0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
241b0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
241c0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
241d0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
241e0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
241f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
24200 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
24210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
24220 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
24230 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
24240 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
24250 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24260 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
24270 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
24280 20 48 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20   HANDLE hFile = 
24290 4e 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31  NULL;.  char z[1
242a0 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
242b0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
242c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
242d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
242e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
242f0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
24300 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
24310 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
24320 20 48 41 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20   HANDLE", 0);.  
24330 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
24340 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
24350 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24360 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
24370 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
24380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
24390 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
243a0 66 28 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  f( getWin32Handl
243b0 65 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  e(interp, Tcl_Ge
243c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
243d0 2c 20 26 68 46 69 6c 65 29 20 29 7b 0a 20 20 20  , &hFile) ){.   
243e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
243f0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
24400 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24410 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
24420 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
24430 53 45 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20  SET_HANDLE,.    
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26          (void*)&
24460 68 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  hFile);.  sqlite
24470 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
24480 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22  f(z), z, "%d %p"
24490 2c 20 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69  , rc, (void*)hFi
244a0 6c 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  le);.  Tcl_Appen
244b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
244c0 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
244d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
244e0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
244f0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
24500 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
24510 77 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46  wal DB PERSIST-F
24520 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAG.**.** This T
24530 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
24540 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
24550 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
24560 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
24570 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
24580 49 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a  IST_WAL opcode..
24590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
245a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
245b0 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74  st_wal(.  Client
245c0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
245d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
245e0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
245f0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24600 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24610 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24620 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24630 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24640 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24650 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24660 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24670 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24680 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
24690 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
246a0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
246b0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
246c0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
246d0 20 62 50 65 72 73 69 73 74 3b 0a 20 20 63 68 61   bPersist;.  cha
246e0 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  r z[100];..  if(
246f0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
24700 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24710 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24720 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
24730 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
24740 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
24750 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
24760 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b   " DB FLAG", 0);
24770 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24780 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24790 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
247a0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
247b0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
247c0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
247d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
247e0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
247f0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
24800 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65 72 73 69  objv[2], &bPersi
24810 73 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  st) ) return TCL
24820 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
24830 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24840 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24850 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
24860 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26  ST_WAL, (void*)&
24870 62 50 65 72 73 69 73 74 29 3b 0a 20 20 73 71 6c  bPersist);.  sql
24880 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
24890 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20  zeof(z), z, "%d 
248a0 25 64 22 2c 20 72 63 2c 20 62 50 65 72 73 69 73  %d", rc, bPersis
248b0 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  t);.  Tcl_Append
248c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
248d0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
248e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
248f0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
24900 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24910 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
24920 69 74 65 20 44 42 20 50 53 4f 57 2d 46 4c 41 47  ite DB PSOW-FLAG
24930 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
24940 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
24950 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24960 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
24970 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
24980 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
24990 46 45 5f 4f 56 45 52 57 52 49 54 45 20 6f 70 63  FE_OVERWRITE opc
249a0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
249b0 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
249c0 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77 72  powersafe_overwr
249d0 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ite(.  ClientDat
249e0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
249f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24a00 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24a10 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24a20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24a30 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24a40 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24a50 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24a60 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
24a70 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
24a80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
24a90 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
24aa0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24ab0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24ac0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
24ad0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24ae0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 3b  int rc;.  int b;
24af0 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
24b00 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
24b10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
24b20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24b30 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
24b40 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
24b50 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
24b60 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24b70 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
24b80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
24b90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
24ba0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
24bb0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
24bc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
24bd0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
24be0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
24c00 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
24c10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
24c20 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
24c30 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
24c40 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
24c50 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54  ol(db,NULL,SQLIT
24c60 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
24c70 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f 69  E_OVERWRITE,(voi
24c80 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74 65  d*)&b);.  sqlite
24c90 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
24ca0 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
24cb0 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c 5f  , rc, b);.  Tcl_
24cc0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
24cd0 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
24ce0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24cf0 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  OK;  .}.../*.** 
24d00 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
24d10 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20 44  ontrol_vfsname D
24d20 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20  B ?AUXDB?.**.** 
24d30 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
24d40 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
24d50 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53 65  he stack of VFSe
24d60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24d70 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66   file_control_vf
24d80 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44  sname(.  ClientD
24d90 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24da0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24db0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
24dc0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
24dd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
24de0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
24df0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
24e00 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
24e10 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
24e20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
24e30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24e40 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24e50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24e60 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24e70 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24e80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24e90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
24ea0 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  bName = "main";.
24eb0 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65    char *zVfsName
24ec0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
24ed0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
24ee0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
24ef0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24f00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
24f10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
24f20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24f30 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
24f40 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55  0], 0), " DB ?AU
24f50 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  XDB?", 0);.    r
24f60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24f70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24f80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
24f90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24fa0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
24fb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
24fc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
24fd0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  objc==3 ){.    z
24fe0 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
24ff0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
25000 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
25010 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
25020 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  zDbName, SQLITE_
25030 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76  FCNTL_VFSNAME,(v
25040 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b  oid*)&zVfsName);
25050 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
25060 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73  ult(interp, zVfs
25070 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
25080 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25090 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74  zVfsName);.  ret
250a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
250b0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
250c0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
250d0 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41  mpfilename DB ?A
250e0 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75  UXDB?.**.** Retu
250f0 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
25100 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
25110 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74  filename.*/.stat
25120 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
25130 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
25140 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
25150 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
25160 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
25170 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
25180 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25190 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
251a0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
251b0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
251c0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
251d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
251f0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
25200 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
25210 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25220 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
25230 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
25240 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
25250 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
25260 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61   = "main";.  cha
25270 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a  r *zTName = 0;..
25280 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
25290 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
252a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
252b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
252c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
252d0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
252e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
252f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
25300 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20   " DB ?AUXDB?", 
25310 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
25320 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25330 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
25340 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
25350 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
25360 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
25370 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25380 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
25390 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20   ){.    zDbName 
253a0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
253b0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
253c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
253d0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65  trol(db, zDbName
253e0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  , SQLITE_FCNTL_T
253f0 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f  EMPFILENAME, (vo
25400 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20  id*)&zTName);.  
25410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
25420 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c  (interp, zTName,
25430 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71   (char*)0);.  sq
25440 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d  lite3_free(zTNam
25450 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
25460 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
25470 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
25480 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a  e3_vfs_list.**.*
25490 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c  *   Return a tcl
254a0 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
254b0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
254c0 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73  l registered vfs
254d0 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  's..*/.static in
254e0 74 20 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c  t vfs_list(.  Cl
254f0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
25500 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
25510 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
25520 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
25530 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
25540 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
25550 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
25560 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
25570 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
25580 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
25590 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
255a0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
255b0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
255c0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
255d0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
255e0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
255f0 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c  vfs *pVfs;.  Tcl
25600 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c  _Obj *pRet = Tcl
25610 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28  _NewObj();.  if(
25620 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
25630 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
25640 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
25650 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
25660 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25670 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69  .  for(pVfs=sqli
25680 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
25690 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73   pVfs; pVfs=pVfs
256a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63  ->pNext){.    Tc
256b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
256c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
256d0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
256e0 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d  ngObj(pVfs->zNam
256f0 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54  e, -1));.  }.  T
25700 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
25710 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
25720 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25730 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
25740 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d  d:   sqlite3_lim
25750 69 74 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a  it DB ID VALUE.*
25760 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
25770 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
25780 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74  qlite3_limit int
25790 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
257a0 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
257b0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
257c0 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  same..*/.static 
257d0 69 6e 74 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a  int test_limit(.
257e0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
257f0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
25800 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25810 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25820 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25830 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25840 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25850 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25860 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25870 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25890 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
258a0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
258b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
258c0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
258d0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
258e0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
258f0 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  c;.  static cons
25900 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
25910 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
25920 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49    int id;.  } aI
25930 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  d[] = {.    { "S
25940 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
25950 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
25960 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
25970 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
25980 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
25990 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
259a0 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
259b0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
259c0 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
259d0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
259e0 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
259f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
25a00 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
25a10 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  UMN             
25a20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
25a30 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
25a40 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  PTH",          S
25a50 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
25a60 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
25a70 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
25a80 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
25a90 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51  _SELECT",     SQ
25aa0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
25ab0 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
25ac0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
25ad0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c  _LIMIT_VDBE_OP",
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
25af0 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
25b00 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  P              }
25b10 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25b20 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
25b30 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  RG",        SQLI
25b40 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
25b50 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c  N_ARG         },
25b60 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
25b70 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20  IMIT_ATTACHED", 
25b80 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
25b90 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
25bb0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
25bc0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
25bd0 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45  _LENGTH", SQLITE
25be0 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
25bf0 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20  ERN_LENGTH  },. 
25c00 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
25c10 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
25c20 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ER",     SQLITE_
25c30 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
25c40 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20  UMBER      },.  
25c50 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
25c60 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22  T_TRIGGER_DEPTH"
25c70 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
25c80 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
25c90 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  TH        },.   
25ca0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
25cb0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 22  _WORKER_THREADS"
25cc0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ,      SQLITE_LI
25cd0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
25ce0 44 53 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  DS       },.    
25cf0 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72  .    /* Out of r
25d00 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20  ange test cases 
25d10 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  */.    { "SQLITE
25d20 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22  _LIMIT_TOOSMALL"
25d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
25d60 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
25d70 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20  LIMIT_TOOBIG",  
25d80 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
25d90 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
25da0 54 48 52 45 41 44 53 2b 31 20 20 20 20 20 7d 2c  THREADS+1     },
25db0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69  .  };.  int i, i
25dc0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c  d = 0;.  int val
25dd0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25de0 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  zId;..  if( objc
25df0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
25e00 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
25e10 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
25e20 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
25e30 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
25e40 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
25e50 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
25e60 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a   ID VALUE", 0);.
25e70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25e80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25e90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
25ea0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
25eb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
25ec0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
25ed0 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63  RROR;.  zId = Tc
25ee0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
25ef0 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
25f00 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73   i<sizeof(aId)/s
25f10 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69  izeof(aId[0]); i
25f20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
25f30 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e  cmp(zId, aId[i].
25f40 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
25f50 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69     id = aId[i].i
25f60 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  d;.      break;.
25f70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
25f80 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73  i>=sizeof(aId)/s
25f90 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b  izeof(aId[0]) ){
25fa0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
25fb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
25fc0 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70  nknown limit typ
25fd0 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72  e: ", zId, (char
25fe0 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
25ff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
26000 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
26010 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
26020 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
26030 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26040 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
26050 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20  3_limit(db, id, 
26060 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  val);.  Tcl_SetO
26070 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
26080 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
26090 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
260a0 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
260b0 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70   tclcmd:  save_p
260c0 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20  rng_state.**.** 
260d0 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  Save the state o
260e0 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e  f the pseudo-ran
260f0 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
26100 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20  ator..** At the 
26110 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66  same time, verif
26120 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74  y that sqlite3_t
26130 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b  est_control work
26140 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63  s even when.** c
26150 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75  alled with an ou
26160 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64  t-of-range opcod
26170 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26180 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65   save_prng_state
26190 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
261a0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
261b0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
261c0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
261d0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
261e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
261f0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26200 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26210 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26220 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26240 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26250 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26260 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26270 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26280 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
26290 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74  t rc = sqlite3_t
262a0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39  est_control(9999
262b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
262c0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
262d0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
262e0 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28  l(-1);.  assert(
262f0 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69   rc==0 );.  sqli
26300 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
26310 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
26320 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72  _PRNG_SAVE);.  r
26330 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26340 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72  /*.** tclcmd:  r
26350 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
26360 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
26370 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
26380 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
26390 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
263a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
263b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
263c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
263d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
263e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
263f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26400 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26410 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26420 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26430 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26440 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26450 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26460 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26470 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26480 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
26490 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
264a0 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
264b0 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
264c0 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
264d0 63 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67  cmd:  reset_prng
264e0 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63  _state.*/.static
264f0 20 69 6e 74 20 72 65 73 65 74 5f 70 72 6e 67 5f   int reset_prng_
26500 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
26510 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
26520 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
26530 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
26540 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
26550 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
26560 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
26570 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
26580 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
26590 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
265a0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
265b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
265c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
265d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
265e0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
265f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
26600 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
26610 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
26620 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
26630 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ET);.  return TC
26640 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
26650 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73 65  clcmd:  database
26660 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 0a  _may_be_corrupt.
26670 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  **.** Indicate t
26680 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
26690 65 73 20 6d 69 67 68 74 20 62 65 20 63 6f 72 72  es might be corr
266a0 75 70 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  upt.  In other w
266b0 6f 72 64 73 2c 20 73 65 74 20 74 68 65 20 6e 6f  ords, set the no
266c0 72 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20 6f 66  rmal.** state of
266d0 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73   operation..*/.s
266e0 74 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61  tatic int databa
266f0 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  se_may_be_corrup
26700 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
26710 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
26720 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
26730 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
26740 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
26750 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
26760 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
26770 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
26780 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
26790 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
267a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
267b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
267c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
267d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
267e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
267f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
26800 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
26810 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
26820 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
26830 54 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  T, 0);.  return 
26840 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
26850 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73  tclcmd:  databas
26860 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a  e_never_corrupt.
26870 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  **.** Indicate t
26880 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
26890 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65  es are always we
268a0 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 54 68 69 73  ll-formed.  This
268b0 20 65 6e 61 62 6c 65 73 20 65 78 74 72 61 20 61   enables extra a
268c0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
268d0 6d 65 6e 74 73 20 74 68 61 74 20 74 65 73 74 20  ments that test 
268e0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20  conditions that 
268f0 61 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 20  are always true 
26900 66 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  for well-formed 
26910 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a 73 74  databases..*/.st
26920 61 74 69 63 20 69 6e 74 20 64 61 74 61 62 61 73  atic int databas
26930 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28  e_never_corrupt(
26940 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26950 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
26960 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
26970 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
26980 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
26990 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
269a0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
269b0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
269c0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
269d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
269e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
269f0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
26a00 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
26a10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
26a20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
26a30 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
26a40 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
26a50 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
26a60 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
26a70 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   1);.  return TC
26a80 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
26a90 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73  clcmd:  pcache_s
26aa0 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tats.*/.static i
26ab0 6e 74 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73  nt test_pcache_s
26ac0 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  tats(.  ClientDa
26ad0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26ae0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26af0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26b00 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26b10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26b20 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26b30 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26b40 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26b50 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26b60 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26b70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26b80 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26b90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26ba0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26bb0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26bc0 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e    int nMin;.  in
26bd0 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43  t nMax;.  int nC
26be0 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52  urrent;.  int nR
26bf0 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c  ecyclable;.  Tcl
26c00 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73  _Obj *pRet;..  s
26c10 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61 74  qlite3PcacheStat
26c20 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d  s(&nCurrent, &nM
26c30 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63  ax, &nMin, &nRec
26c40 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65  yclable);..  pRe
26c50 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
26c60 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
26c70 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
26c80 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
26c90 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72  ewStringObj("cur
26ca0 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54  rent", -1));.  T
26cb0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26cc0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26cd0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
26ce0 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a  Obj(nCurrent));.
26cf0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26d00 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
26d10 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
26d20 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c  StringObj("max",
26d30 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
26d40 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
26d50 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
26d60 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
26d70 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ax));.  Tcl_List
26d80 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
26d90 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
26da0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
26db0 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "min", -1));.  T
26dc0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
26dd0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
26de0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
26df0 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63  Obj(nMin));.  Tc
26e00 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
26e10 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
26e20 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
26e30 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c  ngObj("recyclabl
26e40 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  e", -1));.  Tcl_
26e50 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26e60 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
26e70 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
26e80 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a  (nRecyclable));.
26e90 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
26ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
26eb0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
26ec0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
26ed0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
26ee0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
26ef0 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f  c void test_unlo
26f00 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69  ck_notify_cb(voi
26f10 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41  d **aArg, int nA
26f20 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  rg){.  int ii;. 
26f30 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41   for(ii=0; ii<nA
26f40 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54  rg; ii++){.    T
26f50 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49  cl_EvalEx((Tcl_I
26f60 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d  nterp *)aArg[ii]
26f70 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
26f80 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
26f90 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  GLOBAL);.  }.}.#
26fa0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
26fb0 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
26fc0 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74  TIFY */../*.** t
26fd0 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
26fe0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62  unlock_notify db
26ff0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
27000 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
27010 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e  NOTIFY.static in
27020 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  t test_unlock_no
27030 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61  tify(.  ClientDa
27040 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27050 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
27060 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27070 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27080 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27090 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
270a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
270b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
270c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
270d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
270e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
270f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27100 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
27120 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
27130 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
27140 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
27150 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
27160 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
27170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27180 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
27190 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
271a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
271b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
271c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
271d0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
271e0 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f  qlite3_unlock_no
271f0 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e  tify(db, test_un
27200 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20  lock_notify_cb, 
27210 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b  (void *)interp);
27220 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
27230 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
27240 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
27250 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
27260 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27270 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
27280 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
27290 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
272a0 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61  db ?NAME?.*/.sta
272b0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c  tic int test_wal
272c0 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  _checkpoint(.  C
272d0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
272e0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
272f0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27300 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27310 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27320 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27330 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27340 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27350 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27360 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27370 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27380 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27390 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
273a0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
273b0 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
273c0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
273d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
273e0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
273f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
27400 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
27410 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29  jv, "DB ?NAME?")
27420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
27430 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
27440 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
27450 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
27460 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
27470 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
27480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27490 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
274a0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
274b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
274c0 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  2]);.  }.  rc = 
274d0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
274e0 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
274f0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
27500 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
27510 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
27520 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
27530 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27540 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
27550 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
27560 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d  eckpoint_v2 db M
27570 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a  ODE ?NAME?.**.**
27580 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61   This command ca
27590 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63  lls the wal_chec
275a0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63  kpoint_v2() func
275b0 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70  tion with the sp
275c0 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20  ecified.** mode 
275d0 61 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76  argument (passiv
275e0 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61  e, full or resta
275f0 72 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c  rt). If present,
27600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
27610 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61  me.** NAME is pa
27620 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
27630 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77  nd argument to w
27640 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
27650 28 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a  (). If it the.**
27660 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69   NAME argument i
27670 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61  s not present, a
27680 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73   NULL pointer is
27690 20 70 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e   passed instead.
276a0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68  .**.** If wal_ch
276b0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65  eckpoint_v2() re
276c0 74 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20  turns any value 
276d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
276e0 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c  E_BUSY or.** SQL
276f0 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69  ITE_OK, then thi
27700 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  s command return
27710 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65  s TCL_ERROR. The
27720 20 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73   Tcl result is s
27730 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72  et.** to the err
27740 6f 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69  or message obtai
27750 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
27760 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a  _errmsg()..**.**
27770 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
27780 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
27790 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65   a list of three
277a0 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
277b0 69 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  irst integer.** 
277c0 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42  is 1 if SQLITE_B
277d0 55 53 59 20 77 61 73 20 72 65 74 75 72 6e 65 64  USY was returned
277e0 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
277f0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
27800 74 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  two integers.** 
27810 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 72  are the values r
27820 65 74 75 72 6e 65 64 20 76 69 61 20 74 68 65 20  eturned via the 
27830 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
27840 73 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f  s by wal_checkpo
27850 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68  int_v2() -.** th
27860 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
27870 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e  es in the log an
27880 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
27890 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
278a0 67 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62  g.** that have b
278b0 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  een checkpointed
278c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
278d0 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  test_wal_checkpo
278e0 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74  int_v2(.  Client
278f0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
27900 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
27910 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
27920 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
27930 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
27940 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
27950 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
27960 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
27970 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27980 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
27990 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
279a0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
279b0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
279c0 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  {.  char *zDb = 
279d0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
279e0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
279f0 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20  nt eMode;.  int 
27a00 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69  nLog = -555;.  i
27a10 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b  nt nCkpt = -555;
27a20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
27a30 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
27a40 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70  * aMode[] = { "p
27a50 61 73 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c  assive", "full",
27a60 20 22 72 65 73 74 61 72 74 22 2c 20 22 74 72 75   "restart", "tru
27a70 6e 63 61 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61  ncate", 0 };.  a
27a80 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48  ssert( SQLITE_CH
27a90 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45  ECKPOINT_PASSIVE
27aa0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
27ab0 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
27ac0 4e 54 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20  NT_FULL==1 );.  
27ad0 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
27ae0 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52  HECKPOINT_RESTAR
27af0 54 3d 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74  T==2 );.  assert
27b00 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
27b10 49 4e 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20  INT_TRUNCATE==3 
27b20 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  );..  if( objc!=
27b30 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a  3 && objc!=4 ){.
27b40 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27b50 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27b60 6f 62 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f  objv, "DB MODE ?
27b70 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74  NAME?");.    ret
27b80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27b90 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d   }..  if( objc==
27ba0 34 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54  4 ){.    zDb = T
27bb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27bc0 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  v[3]);.  }.  if(
27bd0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27be0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27bf0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27c00 62 29 20 7c 7c 20 28 0a 20 20 20 20 20 20 54 43  b) || (.      TC
27c10 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74  L_OK!=Tcl_GetInt
27c20 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b  FromObj(0, objv[
27c30 32 5d 2c 20 26 65 4d 6f 64 65 29 0a 20 20 20 26  2], &eMode).   &
27c40 26 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  & TCL_OK!=Tcl_Ge
27c50 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
27c60 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61  terp, objv[2], a
27c70 4d 6f 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c  Mode, "mode", 0,
27c80 20 26 65 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a   &eMode) .  )){.
27c90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27ca0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
27cb0 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  = sqlite3_wal_ch
27cc0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
27cd0 7a 44 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f  zDb, eMode, &nLo
27ce0 67 2c 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66  g, &nCkpt);.  if
27cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
27d00 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  && rc!=SQLITE_BU
27d10 53 59 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  SY ){.    const 
27d20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d  char *zErrCode =
27d30 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
27d40 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73  rc);.    Tcl_Res
27d50 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
27d60 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
27d70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
27d80 45 72 72 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20  ErrCode, " - ", 
27d90 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
27da0 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
27db0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27dc0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65  RROR;.  }..  pRe
27dd0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
27de0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27df0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27e00 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27e10 65 77 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c  ewIntObj(rc==SQL
27e20 49 54 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a  ITE_BUSY?1:0));.
27e30 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
27e40 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
27e50 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
27e60 49 6e 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20  IntObj(nLog));. 
27e70 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27e80 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27e90 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27ea0 6e 74 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20  ntObj(nCkpt));. 
27eb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27ec0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
27ed0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
27ee0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
27ef0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
27f00 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20  _autocheckpoint 
27f10 64 62 20 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74  db VALUE.*/.stat
27f20 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f  ic int test_wal_
27f30 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 0a  autocheckpoint(.
27f40 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27f50 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
27f60 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
27f70 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
27f80 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
27f90 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
27fa0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
27fb0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
27fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27fd0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27fe0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27ff0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
28000 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
28010 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
28020 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
28030 63 3b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 0a  c;.  int iVal;..
28040 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
28050 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
28060 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
28070 2c 20 6f 62 6a 76 2c 20 22 44 42 20 56 41 4c 55  , objv, "DB VALU
28080 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
28090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
280a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
280b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
280c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
280d0 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54  ), &db) .   || T
280e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
280f0 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 56  (0, objv[2], &iV
28100 61 6c 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  al).  ){.    ret
28110 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28120 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
28130 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
28140 70 6f 69 6e 74 28 64 62 2c 20 69 56 61 6c 29 3b  point(db, iVal);
28150 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
28160 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
28170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28180 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
28190 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71  r *zErrCode = sq
281a0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
281b0 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
281c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
281d0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
281e0 7a 45 72 72 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  zErrCode, -1));.
281f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28200 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
28210 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
28220 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74  /*.** tclcmd:  t
28230 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20  est_sqlite3_log 
28240 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74  ?SCRIPT?.*/.stat
28250 69 63 20 73 74 72 75 63 74 20 4c 6f 67 43 61 6c  ic struct LogCal
28260 6c 62 61 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e  lback {.  Tcl_In
28270 74 65 72 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20  terp *pInterp;. 
28280 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a   Tcl_Obj *pObj;.
28290 7d 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20  } logcallback = 
282a0 7b 30 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 76  {0, 0};.static v
282b0 6f 69 64 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b  oid xLogcallback
282c0 28 76 6f 69 64 20 2a 75 6e 75 73 65 64 2c 20 69  (void *unused, i
282d0 6e 74 20 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d  nt err, char *zM
282e0 73 67 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  sg){.  Tcl_Obj *
282f0 70 4e 65 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pNew = Tcl_Dupli
28300 63 61 74 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62  cateObj(logcallb
28310 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c  ack.pObj);.  Tcl
28320 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4e  _IncrRefCount(pN
28330 65 77 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  ew);.  Tcl_ListO
28340 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
28350 0a 20 20 20 20 20 20 30 2c 20 70 4e 65 77 2c 20  .      0, pNew, 
28360 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
28370 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  (sqlite3ErrName(
28380 65 72 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20  err), -1).  );. 
28390 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
283a0 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65  ndElement(0, pNe
283b0 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  w, Tcl_NewString
283c0 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a  Obj(zMsg, -1));.
283d0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
283e0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74  logcallback.pInt
283f0 65 72 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45  erp, pNew, TCL_E
28400 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
28410 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
28420 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
28430 70 4e 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pNew);.}.static 
28440 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
28450 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44 61  _log(.  ClientDa
28460 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  ta clientData,. 
28470 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28480 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28490 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
284a0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
284b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
284c0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
284d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
284e0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
284f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28500 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28510 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28520 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32 20  ){.  if( objc>2 
28530 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
28540 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
28550 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54  1, objv, "SCRIPT
28560 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
28570 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
28580 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  if( logcallback.
28590 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f  pObj ){.    Tcl_
285a0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67  DecrRefCount(log
285b0 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
285c0 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
285d0 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  pObj = 0;.    lo
285e0 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72  gcallback.pInter
285f0 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  p = 0;.    sqlit
28600 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
28610 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c 20  _CONFIG_LOG, 0, 
28620 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  0);.  }.  if( ob
28630 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63  jc>1 ){.    logc
28640 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f  allback.pObj = o
28650 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f  bjv[1];.    Tcl_
28660 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67  IncrRefCount(log
28670 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
28680 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
28690 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  pInterp = interp
286a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
286b0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
286c0 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c  IG_LOG, xLogcall
286d0 62 61 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  back, 0);.  }.  
286e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
286f0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f  ../*.**     tcl_
28700 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e  objproc COMMANDN
28710 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a  AME ARGS....**.*
28720 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d  * Run a TCL comm
28730 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62  and using its ob
28740 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
28750 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72    Throw an error
28760 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61   if.** the comma
28770 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
28780 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  c interface..*/.
28790 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 41 73  static int runAs
287a0 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20  ObjProc(.  void 
287b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
287c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
287d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
287e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
287f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c   objv[].){.  Tcl
28800 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
28810 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ;.  if( objc<2 )
28820 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
28830 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
28840 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44  , objv, "COMMAND
28850 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
28860 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28870 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  }.  if( !Tcl_Get
28880 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
28890 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
288a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64  g(objv[1]), &cmd
288b0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
288c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
288d0 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
288e0 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20  ot found: ",.   
288f0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
28900 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28910 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
28920 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28930 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e  .  }.  if( cmdIn
28940 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b  fo.objProc==0 ){
28950 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28960 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
28970 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
28980 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20  jProc: ",.      
28990 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
289a0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
289b0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
289c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
289d0 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e  }.  return cmdIn
289e0 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e  fo.objProc(cmdIn
289f0 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
28a00 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31  , interp, objc-1
28a10 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69  , objv+1);.}..#i
28a20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28a30 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
28a40 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c  WARNING: The fol
28a50 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c  lowing function,
28a60 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
28a70 72 79 50 6c 61 6e 28 29 20 69 73 20 61 6e 20 65  ryPlan() is an e
28a80 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  xact.** copy of 
28a90 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f  example code fro
28aa0 6d 20 65 71 70 2e 69 6e 20 28 65 71 70 2e 68 74  m eqp.in (eqp.ht
28ab0 6d 6c 29 2e 20 49 66 20 74 68 69 73 20 63 6f 64  ml). If this cod
28ac0 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a  e is modified,.*
28ad0 2a 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75 6d  * then the docum
28ae0 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65  entation copy ne
28af0 65 64 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  eds to be modifi
28b00 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f  ed as well..*/./
28b10 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53  *.** Argument pS
28b20 74 6d 74 20 69 73 20 61 20 70 72 65 70 61 72 65  tmt is a prepare
28b30 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
28b40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
28b50 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58  ompiles.** an EX
28b60 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
28b70 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f   command to repo
28b80 72 74 20 6f 6e 20 74 68 65 20 70 72 65 70 61 72  rt on the prepar
28b90 65 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  ed statement,.**
28ba0 20 61 6e 64 20 70 72 69 6e 74 73 20 74 68 65 20   and prints the 
28bb0 72 65 70 6f 72 74 20 74 6f 20 73 74 64 6f 75 74  report to stdout
28bc0 20 75 73 69 6e 67 20 70 72 69 6e 74 66 28 29 2e   using printf().
28bd0 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78 70  .*/.int printExp
28be0 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 73 71  lainQueryPlan(sq
28bf0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
28c00 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
28c10 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
28c20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 53        /* Input S
28c30 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  QL */.  char *zE
28c40 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20  xplain;         
28c50 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 77          /* SQL w
28c60 69 74 68 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ith EXPLAIN QUER
28c70 59 20 50 4c 41 4e 20 70 72 65 70 65 6e 64 65 64  Y PLAN prepended
28c80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
28c90 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20  mt *pExplain;   
28ca0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
28cb0 64 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  d EXPLAIN QUERY 
28cc0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  PLAN command */.
28cd0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cf0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
28d00 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72   from sqlite3_pr
28d10 65 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20  epare_v2() */.. 
28d20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
28d30 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  sql(pStmt);.  if
28d40 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
28d50 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
28d60 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73  ..  zExplain = s
28d70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
28d80 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
28d90 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20  AN %s", zSql);. 
28da0 20 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30   if( zExplain==0
28db0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
28dc0 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20  _NOMEM;..  rc = 
28dd0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
28de0 76 32 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61  v2(sqlite3_db_ha
28df0 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45 78  ndle(pStmt), zEx
28e00 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70  plain, -1, &pExp
28e10 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  lain, 0);.  sqli
28e20 74 65 33 5f 66 72 65 65 28 7a 45 78 70 6c 61 69  te3_free(zExplai
28e30 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
28e40 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
28e50 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53   rc;..  while( S
28e60 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
28e70 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
28e80 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  ) ){.    int iSe
28e90 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33  lectid = sqlite3
28ea0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
28eb0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e  lain, 0);.    in
28ec0 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  t iOrder = sqlit
28ed0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
28ee0 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20  xplain, 1);.    
28ef0 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69  int iFrom = sqli
28f00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
28f10 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20  Explain, 2);.   
28f20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
28f30 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  tail = (const ch
28f40 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
28f50 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69  umn_text(pExplai
28f60 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e  n, 3);..    prin
28f70 74 66 28 22 25 64 20 25 64 20 25 64 20 25 73 5c  tf("%d %d %d %s\
28f80 6e 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69  n", iSelectid, i
28f90 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44  Order, iFrom, zD
28fa0 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  etail);.  }..  r
28fb0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
28fc0 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
28fd0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
28fe0 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 28 0a  test_print_eqp(.
28ff0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
29000 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
29010 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
29020 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
29030 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
29040 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
29050 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
29060 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
29070 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29080 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29090 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
290a0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
290b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
290c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
290d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
290e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
290f0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
29100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29110 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70 6c 61   rc = printExpla
29120 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53 74 6d  inQueryPlan(pStm
29130 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  t);.  /* This is
29140 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 64 6f   needed on Windo
29150 77 73 20 73 6f 20 74 68 61 74 20 61 20 74 65 73  ws so that a tes
29160 74 20 63 61 73 65 20 75 73 69 6e 67 20 74 68 69  t case using thi
29170 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  s .  ** function
29180 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65 61 64   can open a read
29190 20 70 69 70 65 20 61 6e 64 20 67 65 74 20 74 68   pipe and get th
291a0 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20 2a 2a  e output of.  **
291b0 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
291c0 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64 69 61  ryPlan() immedia
291d0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c  tely..  */.  ffl
291e0 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 54  ush(stdout);.  T
291f0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
29200 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
29210 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
29220 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29230 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
29240 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
29250 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  IN */../*.** sql
29260 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
29270 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e 0a 2a  l VERB ARGS....*
29280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
29290 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a  t_test_control(.
292a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
292b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
292c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
292d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
292e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
292f0 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72 62 20  {.  struct Verb 
29300 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29310 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
29320 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20   i;.  } aVerb[] 
29330 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
29340 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
29350 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c  TIME_FAULT", SQL
29360 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
29370 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20  ALTIME_FAULT }, 
29380 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54  .    { "SQLITE_T
29390 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
293a0 4d 41 50 22 2c 20 20 20 20 20 53 51 4c 49 54 45  MAP",     SQLITE
293b0 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52  _TESTCTRL_SORTER
293c0 5f 4d 4d 41 50 20 20 20 20 20 7d 2c 20 0a 20 20  _MMAP     }, .  
293d0 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54    { "SQLITE_TEST
293e0 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20  CTRL_IMPOSTER", 
293f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
29400 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20  STCTRL_IMPOSTER 
29410 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20         },.  };. 
29420 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69 6e   int iVerb;.  in
29430 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72  t iFlag;.  int r
29440 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  c;..  if( objc<2
29450 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
29460 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
29470 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42 20   1, objv, "VERB 
29480 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  ARGS...");.    r
29490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
294a0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c  .  }..  rc = Tcl
294b0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
294c0 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69 6e  Struct(.      in
294d0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61  terp, objv[1], a
294e0 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56 65  Verb, sizeof(aVe
294f0 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c 20  rb[0]), "VERB", 
29500 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a 20  0, &iVerb.  );. 
29510 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
29520 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
29530 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69 56  iFlag = aVerb[iV
29540 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68  erb].i;.  switch
29550 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20 63  ( iFlag ){.    c
29560 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
29570 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
29580 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULT: {.      int
29590 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20   val;.      if( 
295a0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
295b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
295c0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
295d0 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20  bjv, "ONOFF");. 
295e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43         return TC
295f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
29600 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
29610 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
29620 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
29630 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
29640 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
29650 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
29660 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
29670 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
29680 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a 20 20  _FAULT, val);.  
29690 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
296a0 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
296b0 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
296c0 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
296d0 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73  int val;.      s
296e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
296f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
29700 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
29710 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29720 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c  , 2, objv, "DB L
29730 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20  IMIT");.        
29740 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29760 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
29770 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
29780 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
29790 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
297a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
297b0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
297c0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
297d0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
297e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
297f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
29800 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
29810 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
29820 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c  ER_MMAP, db, val
29830 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
29840 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
29850 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29860 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
29870 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75    int onOff, tnu
29880 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  m;.      const c
29890 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
298a0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
298b0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
298c0 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =6 ){.        Tc
298d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
298e0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
298f0 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66  "DB dbName onOff
29900 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20 20 20   tnum");.       
29910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29920 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
29930 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
29940 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
29950 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
29960 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
29970 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
29980 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
29990 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
299a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
299b0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
299c0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
299d0 26 6f 6e 4f 66 66 29 20 29 20 72 65 74 75 72 6e  &onOff) ) return
299e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
299f0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
29a00 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
29a10 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20  objv[5], &tnum) 
29a20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
29a30 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
29a40 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
29a50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
29a60 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a 44 62  MPOSTER, db, zDb
29a70 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75  Name, onOff, tnu
29a80 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
29a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
29aa0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
29ab0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
29ac0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  TCL_OK;.}..#if S
29ad0 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69  QLITE_OS_UNIX.#i
29ae0 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
29af0 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
29b00 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73  s/resource.h>..s
29b10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 67  tatic int test_g
29b20 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64  etrusage(.  void
29b30 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
29b40 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29b50 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
29b60 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29b70 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68  T objv[].){.  ch
29b80 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20  ar buf[1024];.  
29b90 73 74 72 75 63 74 20 72 75 73 61 67 65 20 72 3b  struct rusage r;
29ba0 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c  .  memset(&r, 0,
29bb0 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67   sizeof(r));.  g
29bc0 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
29bd0 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71  SELF, &r);..  sq
29be0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
29bf0 69 7a 65 6f 66 28 62 75 66 29 2c 20 62 75 66 2c  izeof(buf), buf,
29c00 0a 20 20 20 20 22 72 75 5f 75 74 69 6d 65 3d 25  .    "ru_utime=%
29c10 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d 65 3d  d.%06d ru_stime=
29c20 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c  %d.%06d ru_minfl
29c30 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25  t=%d ru_majflt=%
29c40 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e  d", .    (int)r.
29c50 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c  ru_utime.tv_sec,
29c60 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65   (int)r.ru_utime
29c70 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28  .tv_usec, .    (
29c80 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74  int)r.ru_stime.t
29c90 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75  v_sec, (int)r.ru
29ca0 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20  _stime.tv_usec, 
29cb0 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d  .    (int)r.ru_m
29cc0 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75  inflt, (int)r.ru
29cd0 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54  _majflt.  );.  T
29ce0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
29cf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
29d00 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31  tringObj(buf, -1
29d10 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
29d20 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
29d30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
29d40 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
29d50 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74  on passed from t
29d60 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69  he main thread i
29d70 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20  nto the windows 
29d80 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62  file locker.** b
29d90 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64  ackground thread
29da0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33  ..*/.struct win3
29db0 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20  2FileLocker {.  
29dc0 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20  char *evName;   
29dd0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65      /* Name of e
29de0 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74  vent to signal t
29df0 68 72 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f  hread startup */
29e00 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20  .  HANDLE h;    
29e10 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
29e20 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
29e30 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  be locked */.  i
29e40 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20  nt delay1;      
29e50 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f     /* Delay befo
29e60 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  re locking */.  
29e70 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20  int delay2;     
29e80 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66      /* Delay bef
29e90 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f  ore unlocking */
29ea0 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20  .  int ok;      
29eb0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68         /* Finish
29ec0 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65  ed ok */.  int e
29ed0 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rr;            /
29ee0 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72 72  * True if an err
29ef0 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a  or occurs */.};.
29f00 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c  #endif...#if SQL
29f10 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c  ITE_OS_WIN.#incl
29f20 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a  ude <process.h>.
29f30 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67 72  /*.** The backgr
29f40 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61 74  ound thread that
29f50 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69   does file locki
29f60 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ng..*/.static vo
29f70 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  id win32_file_lo
29f80 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44  cker(void *pAppD
29f90 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77  ata){.  struct w
29fa0 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a  in32FileLocker *
29fb0 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33  p = (struct win3
29fc0 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70  2FileLocker*)pAp
29fd0 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e  pData;.  if( p->
29fe0 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41  evName ){.    HA
29ff0 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76  NDLE ev = OpenEv
2a000 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59  ent(EVENT_MODIFY
2a010 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70  _STATE, FALSE, p
2a020 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ->evName);.    i
2a030 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20  f ( ev ){.      
2a040 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20  SetEvent(ev);.  
2a050 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
2a060 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ev);.    }.  }. 
2a070 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29   if( p->delay1 )
2a080 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31   Sleep(p->delay1
2a090 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c  );.  if( LockFil
2a0a0 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
2a0b0 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20  0000000, 0) ){. 
2a0c0 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61     Sleep(p->dela
2a0d0 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  y2);.    UnlockF
2a0e0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
2a0f0 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20  100000000, 0);. 
2a100 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20     p->ok = 1;.  
2a110 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72  }else{.    p->er
2a120 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f  r = 1;.  }.  Clo
2a130 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a  seHandle(p->h);.
2a140 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d    p->h = 0;.  p-
2a150 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70  >delay1 = 0;.  p
2a160 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a  ->delay2 = 0;.}.
2a170 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2a180 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
2a190 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f       lock_win32_
2a1a0 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45  file FILENAME DE
2a1b0 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a  LAY1 DELAY2.**.*
2a1c0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
2a1d0 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63  ve manditory loc
2a1e0 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45  k on file for DE
2a1f0 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  LAY2 millisecond
2a200 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59  s..** Wait DELAY
2a210 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  1 milliseconds b
2a220 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
2a230 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
2a240 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66 69  tic int win32_fi
2a250 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20  le_lock(.  void 
2a260 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2a270 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2a280 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2a290 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2a2a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61   objv[].){.  sta
2a2b0 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 33 32  tic struct win32
2a2c0 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b  FileLocker x = {
2a2d0 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63   "win32_file_loc
2a2e0 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  k", 0, 0, 0, 0, 
2a2f0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
2a300 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
2a310 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
2a320 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b    int retry = 0;
2a330 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20  .  HANDLE ev;.  
2a340 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20  DWORD wResult;. 
2a350 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20   .  if( objc!=4 
2a360 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  && objc!=1 ){.  
2a370 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a380 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a390 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45  jv, "FILENAME DE
2a3a0 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20  LAY1 DELAY2");. 
2a3b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a3c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
2a3d0 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  bjc==1 ){.    sq
2a3e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2a3f0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
2a400 66 2c 20 22 25 64 20 25 64 20 25 64 20 25 64 20  f, "%d %d %d %d 
2a410 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %d",.           
2a420 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20            x.ok, 
2a430 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c  x.err, x.delay1,
2a440 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b   x.delay2, x.h);
2a450 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2a460 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
2a470 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
2a480 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
2a490 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78  ;.  }.  while( x
2a4a0 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30 20 29  .h && retry<30 )
2a4b0 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20  {.    retry++;. 
2a4c0 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20     Sleep(100);. 
2a4d0 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a   }.  if( x.h ){.
2a4e0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2a4f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75  sult(interp, "bu
2a500 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  sy", (char*)0);.
2a510 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a520 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2a530 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2a540 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
2a550 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20  ], &x.delay1) ) 
2a560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a570 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
2a580 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2a590 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65  , objv[3], &x.de
2a5a0 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e 20 54  lay2) ) return T
2a5b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c  CL_ERROR;.  zFil
2a5c0 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  ename = Tcl_GetS
2a5d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
2a5e0 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69    x.h = CreateFi
2a5f0 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45  le(zFilename, GE
2a600 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52  NERIC_READ|GENER
2a610 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20  IC_WRITE,.      
2a620 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41          FILE_SHA
2a630 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41  RE_READ|FILE_SHA
2a640 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45  RE_WRITE, 0, OPE
2a650 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20  N_ALWAYS,.      
2a660 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54          FILE_ATT
2a670 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30  RIBUTE_NORMAL, 0
2a680 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b  );.  if( !x.h ){
2a690 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2a6a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
2a6b0 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a  annot open file:
2a6c0 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28   ", zFilename, (
2a6d0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
2a6e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a6f0 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74    }.  ev = Creat
2a700 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55  eEvent(NULL, TRU
2a710 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61  E, FALSE, x.evNa
2a720 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20  me);.  if ( !ev 
2a730 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2a740 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2a750 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65  "cannot create e
2a760 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d  vent: ", x.evNam
2a770 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2a780 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a790 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e  OR;.  }.  _begin
2a7a0 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c  thread(win32_fil
2a7b0 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f  e_locker, 0, (vo
2a7c0 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70  id*)&x);.  Sleep
2a7d0 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65  (0);.  if ( (wRe
2a7e0 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69  sult = WaitForSi
2a7f0 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31  ngleObject(ev, 1
2a800 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a  0000))!=WAIT_OBJ
2a810 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c  ECT_0 ){.    sql
2a820 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2a830 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
2a840 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c  , "0x%x", wResul
2a850 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  t);.    Tcl_Appe
2a860 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a870 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22   "wait failed: "
2a880 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30  , zBuf, (char*)0
2a890 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64  );.    CloseHand
2a8a0 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75  le(ev);.    retu
2a8b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a8c0 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28  }.  CloseHandle(
2a8d0 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ev);.  return TC
2a8e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2a8f0 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e 33 32      exists_win32
2a900 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a  _path PATH.**.**
2a910 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
2a920 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
2a930 65 64 20 70 61 74 68 20 65 78 69 73 74 73 2c 20  ed path exists, 
2a940 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
2a950 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61  ified name.** ma
2a960 79 20 65 78 63 65 65 64 20 32 36 30 20 63 68 61  y exceed 260 cha
2a970 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2a980 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
2a990 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
2a9a0 20 69 6e 74 20 77 69 6e 33 32 5f 65 78 69 73 74   int win32_exist
2a9b0 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64 20 2a  s_path(.  void *
2a9c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2a9d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a9e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2a9f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2aa00 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f  bjv[].){.  if( o
2aa10 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2aa20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2aa30 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2aa40 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65 74  "PATH");.    ret
2aa50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2aa60 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
2aa70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2aa80 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
2aa90 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65 41 74  .      GetFileAt
2aaa0 74 72 69 62 75 74 65 73 57 28 20 54 63 6c 5f 47  tributesW( Tcl_G
2aab0 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2aac0 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ]))!=INVALID_FIL
2aad0 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 29 3b  E_ATTRIBUTES ));
2aae0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2aaf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2ab00 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 20  find_win32_file 
2ab10 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65  PATTERN.**.** Re
2ab20 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
2ab30 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 69 72  entries in a dir
2ab40 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61 74 63  ectory that matc
2ab50 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
2ab60 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73  pattern,.** whos
2ab70 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2ab80 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2ab90 64 20 32 34 38 20 63 68 61 72 61 63 74 65 72 73  d 248 characters
2aba0 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2abb0 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c  ed with.** "\\?\
2abc0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2abd0 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65   win32_find_file
2abe0 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
2abf0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2ac00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2ac10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2ac20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2ac30 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6e  ){.  HANDLE hFin
2ac40 64 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f  dFile = INVALID_
2ac50 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20  HANDLE_VALUE;.  
2ac60 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57  WIN32_FIND_DATAW
2ac70 20 66 69 6e 64 44 61 74 61 3b 0a 20 20 54 63 6c   findData;.  Tcl
2ac80 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20  _Obj *listObj;. 
2ac90 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
2aca0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
2acb0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2acc0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2acd0 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54 45 52  1, objv, "PATTER
2ace0 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
2acf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ad00 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e   hFindFile = Fin
2ad10 64 46 69 72 73 74 46 69 6c 65 57 28 54 63 6c 5f  dFirstFileW(Tcl_
2ad20 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b  GetUnicode(objv[
2ad30 31 5d 29 2c 20 26 66 69 6e 64 44 61 74 61 29 3b  1]), &findData);
2ad40 0a 20 20 69 66 28 20 68 46 69 6e 64 46 69 6c 65  .  if( hFindFile
2ad50 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
2ad60 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 54 63  _VALUE ){.    Tc
2ad70 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2ad80 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2ad90 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2ada0 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2adb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2adc0 0a 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a 20 3d  .  }.  listObj =
2add0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
2ade0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
2adf0 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 64 6f  t(listObj);.  do
2ae00 20 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   {.    Tcl_ListO
2ae10 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ae20 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c  interp, listObj,
2ae30 20 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64 65 4f   Tcl_NewUnicodeO
2ae40 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64  bj(.        find
2ae50 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65 2c 20  Data.cFileName, 
2ae60 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2ae70 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2ae80 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
2ae90 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  bj, Tcl_NewWideI
2aea0 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66  ntObj(.        f
2aeb0 69 6e 64 44 61 74 61 2e 64 77 46 69 6c 65 41 74  indData.dwFileAt
2aec0 74 72 69 62 75 74 65 73 29 29 3b 0a 20 20 7d 20  tributes));.  } 
2aed0 77 68 69 6c 65 28 20 46 69 6e 64 4e 65 78 74 46  while( FindNextF
2aee0 69 6c 65 57 28 68 46 69 6e 64 46 69 6c 65 2c 20  ileW(hFindFile, 
2aef0 26 66 69 6e 64 44 61 74 61 29 20 29 3b 0a 20 20  &findData) );.  
2af00 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c  lastErrno = GetL
2af10 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66  astError();.  if
2af20 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f  ( lastErrno!=NO_
2af30 45 52 52 4f 52 20 26 26 20 6c 61 73 74 45 72 72  ERROR && lastErr
2af40 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52  no!=ERROR_NO_MOR
2af50 45 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20 20 46  E_FILES ){.    F
2af60 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69  indClose(hFindFi
2af70 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  le);.    Tcl_Dec
2af80 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62  rRefCount(listOb
2af90 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  j);.    Tcl_SetO
2afa0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2afb0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2afc0 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2afd0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2afe0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2aff0 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64   FindClose(hFind
2b000 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74  File);.  Tcl_Set
2b010 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2b020 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 72 65  , listObj);.  re
2b030 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2b040 2f 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c 65 74  /*.**      delet
2b050 65 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c  e_win32_file FIL
2b060 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  ENAME.**.** Dele
2b070 74 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65  tes the specifie
2b080 64 20 66 69 6c 65 2c 20 77 68 6f 73 65 20 66 75  d file, whose fu
2b090 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2b0a0 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 36  me may exceed 26
2b0b0 30 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  0.** characters 
2b0c0 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
2b0d0 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
2b0e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2b0f0 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 28 0a  32_delete_file(.
2b100 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2b110 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2b120 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2b130 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2b140 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2b150 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2b160 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2b170 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2b180 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d  , objv, "FILENAM
2b190 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
2b1a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b1b0 20 69 66 28 20 21 44 65 6c 65 74 65 46 69 6c 65   if( !DeleteFile
2b1c0 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
2b1d0 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20  (objv[1])) ){.  
2b1e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2b1f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2b200 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
2b210 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
2b220 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b230 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52  ROR;.  }.  Tcl_R
2b240 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2b250 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
2b260 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
2b270 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69     make_win32_di
2b280 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a  r DIRECTORY.**.*
2b290 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 73 70  * Creates the sp
2b2a0 65 63 69 66 69 65 64 20 64 69 72 65 63 74 6f 72  ecified director
2b2b0 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  y, whose fully q
2b2c0 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
2b2d0 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20  y exceed 248.** 
2b2e0 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74  characters if it
2b2f0 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74   is prefixed wit
2b300 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  h "\\?\"..*/.sta
2b310 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 6d 6b  tic int win32_mk
2b320 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  dir(.  void *cli
2b330 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2b340 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2b350 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2b360 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2b370 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63  [].){.  if( objc
2b380 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2b390 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2b3a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49  rp, 1, objv, "DI
2b3b0 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72  RECTORY");.    r
2b3c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2b3d0 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72 65 61  .  }.  if( !Crea
2b3e0 74 65 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c  teDirectoryW(Tcl
2b3f0 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2b400 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20  [1]), NULL) ){. 
2b410 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2b420 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2b430 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
2b440 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
2b450 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2b460 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
2b470 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2b480 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
2b490 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2b4a0 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33 32      remove_win32
2b4b0 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a  _dir DIRECTORY.*
2b4c0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68 65  *.** Removes the
2b4d0 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63   specified direc
2b4e0 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c  tory, whose full
2b4f0 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
2b500 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a   may exceed 248.
2b510 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
2b520 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
2b530 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
2b540 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
2b550 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64 20 2a  _rmdir(.  void *
2b560 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2b570 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2b580 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2b590 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2b5a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f  bjv[].){.  if( o
2b5b0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2b5c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2b5d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2b5e0 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20  "DIRECTORY");.  
2b5f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b600 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52  OR;.  }.  if( !R
2b610 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28  emoveDirectoryW(
2b620 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f  Tcl_GetUnicode(o
2b630 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20  bjv[1])) ){.    
2b640 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2b650 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2b660 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
2b670 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
2b680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2b690 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73  R;.  }.  Tcl_Res
2b6a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2b6b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2b6c0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  K;.}.#endif.../*
2b6d0 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a  .**      optimiz
2b6e0 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42  ation_control DB
2b6f0 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a   OPT BOOLEAN.**.
2b700 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  ** Enable or dis
2b710 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d  able query optim
2b720 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74  izations using t
2b730 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  he sqlite3_test_
2b740 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74  control().** int
2b750 65 72 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65  erface.  Disable
2b760 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66   if BOOLEAN is f
2b770 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20  alse and enable 
2b780 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72  if BOOLEAN is tr
2b790 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68  ue..** OPT is th
2b7a0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  e name of the op
2b7b0 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65  timization to be
2b7c0 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74   disabled..*/.st
2b7d0 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6d 69 7a  atic int optimiz
2b7e0 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20  ation_control(. 
2b7f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
2b800 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2b810 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2b820 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2b830 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2b840 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
2b850 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
2b860 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69   char *zOpt;.  i
2b870 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20  nt onoff;.  int 
2b880 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74  mask = 0;.  stat
2b890 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2b8a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2b8b0 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20   *zOptName;.    
2b8c0 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f  int mask;.  } aO
2b8d0 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  pt[] = {.    { "
2b8e0 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  all",           
2b8f0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c        SQLITE_All
2b900 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c 0a 20  Opts        },. 
2b910 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20     { "none",    
2b920 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65 72    },.    { "quer
2b950 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20 20 20  y-flattener",   
2b960 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46 6c    SQLITE_QueryFl
2b970 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b  attener },.    {
2b980 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 22 2c   "column-cache",
2b990 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43          SQLITE_C
2b9a0 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20 7d 2c  olumnCache    },
2b9b0 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62 79 2d  .    { "groupby-
2b9c0 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20 53 51  order",       SQ
2b9d0 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64 65  LITE_GroupByOrde
2b9e0 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 61  r   },.    { "fa
2b9f0 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 22 2c  ctor-constants",
2ba00 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63 74 6f      SQLITE_Facto
2ba10 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20 20 20  rOutConst },.   
2ba20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f 70 74   { "distinct-opt
2ba30 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2ba40 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20 20 20  _DistinctOpt    
2ba50 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65 72 2d  },.    { "cover-
2ba60 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 20 20 20  idx-scan",      
2ba70 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
2ba80 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  can   },.    { "
2ba90 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a 6f 69  order-by-idx-joi
2baa0 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 4f 72 64  n",   SQLITE_Ord
2bab0 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20  erByIdxJoin },. 
2bac0 20 20 20 7b 20 22 74 72 61 6e 73 69 74 69 76 65     { "transitive
2bad0 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ",          SQLI
2bae0 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20 20 20  TE_Transitive   
2baf0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62 71    },.    { "subq
2bb00 75 65 72 79 2d 63 6f 72 6f 75 74 69 6e 65 22 2c  uery-coroutine",
2bb10 20 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f 72    SQLITE_SubqCor
2bb20 6f 75 74 69 6e 65 20 20 7d 2c 0a 20 20 20 20 7b  outine  },.    {
2bb30 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e   "omit-noop-join
2bb40 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  ",      SQLITE_O
2bb50 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c  mitNoopJoin   },
2bb60 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22 2c 20  .    { "stat3", 
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
2bb80 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20 20 20  LITE_Stat34     
2bb90 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74      },.    { "st
2bba0 61 74 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  at4",           
2bbb0 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33      SQLITE_Stat3
2bbc0 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  4         },.  }
2bbd0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
2bbe0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2bbf0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2bc00 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f 50   1, objv, "DB OP
2bc10 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20  T BOOLEAN");.   
2bc20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bc30 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2bc40 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2bc50 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2bc60 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2bc70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2bc80 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
2bc90 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
2bca0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
2bcb0 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75 72 6e  &onoff) ) return
2bcc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f   TCL_ERROR;.  zO
2bcd0 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
2bce0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
2bcf0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2bd00 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f  (aOpt)/sizeof(aO
2bd10 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  pt[0]); i++){.  
2bd20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70    if( strcmp(zOp
2bd30 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e  t, aOpt[i].zOptN
2bd40 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
2bd50 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e   mask = aOpt[i].
2bd60 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72 65 61  mask;.      brea
2bd70 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
2bd80 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b 20  f( onoff ) mask 
2bd90 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20 69  = ~mask;.  if( i
2bda0 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73  >=sizeof(aOpt)/s
2bdb0 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20 29  izeof(aOpt[0]) )
2bdc0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2bdd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2bde0 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a 61  unknown optimiza
2bdf0 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62 65  tion - should be
2be00 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20 20   one of:",.     
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 66  (char*)0);.    f
2be30 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
2be40 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f  (aOpt)/sizeof(aO
2be50 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  pt[0]); i++){.  
2be60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2be70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 22  sult(interp, " "
2be80 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61  , aOpt[i].zOptNa
2be90 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2bea0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2beb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2bec0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2bed0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2bee0 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
2bef0 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b 0a  ONS, db, mask);.
2bf00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2bf10 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  .}..typedef stru
2bf20 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  ct sqlite3_api_r
2bf30 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65 33 5f  outines sqlite3_
2bf40 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f 2a  api_routines;./*
2bf50 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74 61  .**     load_sta
2bf60 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42  tic_extension DB
2bf70 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20   NAME ....**.** 
2bf80 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  Load one or more
2bf90 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
2bfa0 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  ed extensions..*
2bfb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
2bfc0 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e 73  LoadStaticExtens
2bfd0 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a  ionCmd(.  void *
2bfe0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2bff0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c000 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2c010 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2c020 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
2c030 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61  rn int sqlite3_a
2c040 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74  match_init(sqlit
2c050 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2c060 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2c070 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2c080 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  n int sqlite3_cl
2c090 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74  osure_init(sqlit
2c0a0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2c0b0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2c0c0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2c0d0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 76  n int sqlite3_ev
2c0e0 61 6c 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  al_init(sqlite3*
2c0f0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2c100 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2c110 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2c120 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 69  nt sqlite3_filei
2c130 6f 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  o_init(sqlite3*,
2c140 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2c150 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2c160 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2c170 74 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72  t sqlite3_fuzzer
2c180 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
2c190 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2c1a0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2c1b0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
2c1c0 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e   sqlite3_ieee_in
2c1d0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c1e0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c1f0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c200 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c210 6c 69 74 65 33 5f 6a 73 6f 6e 5f 69 6e 69 74 28  lite3_json_init(
2c220 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2c230 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2c240 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2c250 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2c260 65 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74  e3_nextchar_init
2c270 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2c280 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2c290 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2c2a0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2c2b0 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69  te3_percentile_i
2c2c0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c2d0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c2e0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c2f0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c300 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e  qlite3_regexp_in
2c310 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c320 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c330 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c340 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c350 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69  lite3_spellfix_i
2c360 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c370 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c380 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c390 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c3a0 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e  qlite3_totype_in
2c3b0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2c3c0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2c3d0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2c3e0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2c3f0 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65  lite3_wholenumbe
2c400 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  r_init(sqlite3*,
2c410 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2c420 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2c430 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2c440 74 20 73 71 6c 69 74 65 33 5f 66 74 73 35 5f 69  t sqlite3_fts5_i
2c450 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c460 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c470 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c480 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2c490 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
2c4a0 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 4e 61  nst char *zExtNa
2c4b0 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70 49  me;.    int (*pI
2c4c0 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c 63 68  nit)(sqlite3*,ch
2c4d0 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2c4e0 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2c4f0 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73 69 6f  );.  } aExtensio
2c500 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61  n[] = {.    { "a
2c510 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20 20 20  match",         
2c520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 61         sqlite3_a
2c530 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20 20 20  match_init      
2c540 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2c550 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20  { "closure",    
2c560 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c570 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20  e3_closure_init 
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2c590 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20 20 20      { "eval",   
2c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c5b0 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74  qlite3_eval_init
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5d0 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
2c5e0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 35 0a 20 20  E_ENABLE_FTS5.  
2c5f0 20 20 7b 20 22 66 74 73 35 22 2c 20 20 20 20 20    { "fts5",     
2c600 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2c610 69 74 65 33 5f 66 74 73 35 5f 69 6e 69 74 20 20  ite3_fts5_init  
2c620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2c630 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20 22  ,.#endif.    { "
2c640 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20 20  fileio",        
2c650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c660 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20 20  fileio_init     
2c670 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c680 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20 20   { "fuzzer",    
2c690 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c6a0 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20  te3_fuzzer_init 
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2c6c0 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34 22  .    { "ieee754"
2c6d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c6e0 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69  sqlite3_ieee_ini
2c6f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2c700 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6a 73 6f 6e    },.    { "json
2c710 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c720 20 20 20 20 73 71 6c 69 74 65 33 5f 6a 73 6f 6e      sqlite3_json
2c730 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2c740 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2c750 6e 65 78 74 63 68 61 72 22 2c 20 20 20 20 20 20  nextchar",      
2c760 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c770 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20  nextchar_init   
2c780 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c790 20 7b 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c   { "percentile",
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2c7b0 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69  te3_percentile_i
2c7c0 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c  nit           },
2c7d0 0a 20 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c  .    { "regexp",
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7f0 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69  sqlite3_regexp_i
2c800 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2c810 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c    },.    { "spel
2c820 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20 20 20  lfix",          
2c830 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c      sqlite3_spel
2c840 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20  lfix_init       
2c850 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2c860 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  totype",        
2c870 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c880 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20  totype_init     
2c890 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c8a0 20 7b 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22   { "wholenumber"
2c8b0 2c 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ,           sqli
2c8c0 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  te3_wholenumber_
2c8d0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c  init          },
2c8e0 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20  .  };.  sqlite3 
2c8f0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
2c900 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  r *zName;.  int 
2c910 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72  i, j, rc;.  char
2c920 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2c930 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20   if( objc<3 ){. 
2c940 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2c950 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2c960 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e  bjv, "DB NAME ..
2c970 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2c980 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2c990 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2c9a0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2c9b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2c9c0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2c9d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  TCL_ERROR;.  for
2c9e0 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b  (j=2; j<objc; j+
2c9f0 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  +){.    zName = 
2ca00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2ca10 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  jv[j]);.    for(
2ca20 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
2ca30 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b  (aExtension); i+
2ca40 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
2ca50 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74  rcmp(zName, aExt
2ca60 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61  ension[i].zExtNa
2ca70 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
2ca80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
2ca90 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65  =ArraySize(aExte
2caa0 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  nsion) ){.      
2cab0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2cac0 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
2cad0 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20  h extension: ", 
2cae0 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  zName, (char*)0)
2caf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2cb00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2cb10 20 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73      rc = aExtens
2cb20 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c  ion[i].pInit(db,
2cb30 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20   &zErrMsg, 0);. 
2cb40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cb50 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20  E_OK || zErrMsg 
2cb60 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2cb70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2cb80 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  , "initializatio
2cb90 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22  n of ", zName, "
2cba0 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72   failed: ", zErr
2cbb0 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
2cbc0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2cbd0 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
2cbe0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
2cbf0 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
2cc00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2cc10 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  }.  }.  return T
2cc20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2cc30 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f      sorter_test_
2cc40 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a 2a  fakeheap BOOL.**
2cc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2cc60 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68  orter_test_fakeh
2cc70 65 61 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  eap(.  void * cl
2cc80 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2cc90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2cca0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2ccb0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2ccc0 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72  v[].){.  int bAr
2ccd0 67 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  g;.  if( objc!=2
2cce0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2ccf0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2cd00 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22   1, objv, "BOOL"
2cd10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2cd20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2cd30 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
2cd40 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
2cd50 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67  , objv[1], &bArg
2cd60 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2cd70 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2cd80 20 20 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20    if( bArg ){.  
2cd90 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2cda0 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d  balConfig.pHeap=
2cdb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2cdc0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2cdd0 70 48 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49  pHeap = SQLITE_I
2cde0 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20  NT_TO_PTR(-1);. 
2cdf0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ce00 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2ce10 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d  balConfig.pHeap=
2ce20 3d 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50  =SQLITE_INT_TO_P
2ce30 54 52 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  TR(-1) ){.      
2ce40 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ce50 66 69 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20  fig.pHeap = 0;. 
2ce60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f     }.  }..  Tcl_
2ce70 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2ce80 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
2ce90 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2cea0 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73     sorter_test_s
2ceb0 6f 72 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53  ort4_helper DB S
2cec0 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a  QL1 NSTEP SQL2.*
2ced0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c  *.** Compile SQL
2cee0 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31   statement $SQL1
2cef0 20 61 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53   and step it $NS
2cf00 54 45 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65  TEP times. For e
2cf10 61 63 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65  ach row, .** che
2cf20 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 66 74  ck that the left
2cf30 6d 6f 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f  most and rightmo
2cf40 73 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72  st columns retur
2cf50 6e 65 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74  ned are both int
2cf60 65 67 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68  egers,.** and th
2cf70 61 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20  at both contain 
2cf80 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a  the same value..
2cf90 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75  **.** Then execu
2cfa0 74 65 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51  te statement $SQ
2cfb0 4c 32 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  L2. Check that t
2cfc0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  he statement ret
2cfd0 75 72 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a  urns the same.**
2cfe0 20 73 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73   set of integers
2cff0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64   in the same ord
2d000 65 72 20 61 73 20 69 6e 20 74 68 65 20 70 72 65  er as in the pre
2d010 76 69 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e  vious step (usin
2d020 67 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61  g $SQL1)..*/.sta
2d030 74 69 63 20 69 6e 74 20 73 6f 72 74 65 72 5f 74  tic int sorter_t
2d040 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72  est_sort4_helper
2d050 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2d060 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2d070 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2d080 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2d090 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2d0a0 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2d0b0 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74   *zSql1;.  const
2d0c0 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20   char *zSql2;.  
2d0d0 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e  int nStep; .  in
2d0e0 74 20 69 53 74 65 70 3b 20 0a 20 20 69 6e 74 20  t iStep; .  int 
2d0f0 69 43 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20  iCksum1 = 0; .  
2d100 69 6e 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b  int iCksum2 = 0;
2d110 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e   .  int rc;.  in
2d120 74 20 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20  t iB;.  sqlite3 
2d130 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  *db;.  sqlite3_s
2d140 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20  tmt *pStmt;.  . 
2d150 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
2d160 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2d170 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2d180 6f 62 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e  objv, "DB SQL1 N
2d190 53 54 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20  STEP SQL2");.   
2d1a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2d1b0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
2d1c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d1d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2d1e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2d1f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2d200 4f 52 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63  OR;.  zSql1 = Tc
2d210 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2d220 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
2d230 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2d240 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
2d250 6e 53 74 65 70 29 20 29 20 72 65 74 75 72 6e 20  nStep) ) return 
2d260 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
2d270 6c 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  l2 = Tcl_GetStri
2d280 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20  ng(objv[4]);..  
2d290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2d2a0 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c  pare_v2(db, zSql
2d2b0 31 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  1, -1, &pStmt, 0
2d2c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2d2d0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71  ITE_OK ) goto sq
2d2e0 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d  l_error;..  iB =
2d2f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2d300 63 6f 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a  count(pStmt)-1;.
2d310 20 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69    for(iStep=0; i
2d320 53 74 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51  Step<nStep && SQ
2d330 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2d340 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69  3_step(pStmt); i
2d350 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  Step++){.    int
2d360 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   a = sqlite3_col
2d370 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
2d380 29 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71  );.    if( a!=sq
2d390 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
2d3a0 28 70 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20  (pStmt, iB) ){. 
2d3b0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
2d3c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64  esult(interp, "d
2d3d0 61 74 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62  ata error: (a!=b
2d3e0 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65  )", 0);.      re
2d3f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d400 20 20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75      }..    iCksu
2d410 6d 31 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c  m1 += (iCksum1 <
2d420 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20  < 3) + a;.  }.  
2d430 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
2d440 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2d450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2d460 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
2d470 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  or;..  rc = sqli
2d480 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
2d490 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70  b, zSql2, -1, &p
2d4a0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
2d4b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d4c0 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a  goto sql_error;.
2d4d0 20 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 53    for(iStep=0; S
2d4e0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
2d4f0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20  e3_step(pStmt); 
2d500 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e  iStep++){.    in
2d510 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  t a = sqlite3_co
2d520 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2d530 30 29 3b 0a 20 20 20 20 69 43 6b 73 75 6d 32 20  0);.    iCksum2 
2d540 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33  += (iCksum2 << 3
2d550 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20  ) + a;.  }.  rc 
2d560 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
2d570 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
2d580 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d590 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
2d5a0 0a 0a 20 20 69 66 28 20 69 43 6b 73 75 6d 31 21  ..  if( iCksum1!
2d5b0 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20 20 20  =iCksum2 ){.    
2d5c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2d5d0 28 69 6e 74 65 72 70 2c 20 22 63 68 65 63 6b 73  (interp, "checks
2d5e0 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20 30 29  um mismatch", 0)
2d5f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d600 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
2d610 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 73  eturn TCL_OK;. s
2d620 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63 6c 5f  ql_error:.  Tcl_
2d630 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2d640 65 72 70 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a  erp, "sql error:
2d650 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d   ", sqlite3_errm
2d660 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 72 65  sg(db), 0);.  re
2d670 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d680 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
2d690 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2d6a0 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20 22  ATION.#include "
2d6b0 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e  sqlite3userauth.
2d6c0 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  h"./*.** tclcmd:
2d6d0 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61    sqlite3_user_a
2d6e0 75 74 68 65 6e 74 69 63 61 74 65 20 44 42 20 55  uthenticate DB U
2d6f0 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
2d700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2d710 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  est_user_authent
2d720 69 63 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  icate(.  ClientD
2d730 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2d740 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2d750 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2d760 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2d770 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2d780 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2d790 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2d7a0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2d7b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2d7c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2d7d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2d7e0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2d7f0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2d800 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
2d810 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73   0;.  char *zPas
2d820 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  swd = 0;.  int n
2d830 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 73 71  Passwd = 0;.  sq
2d840 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2d850 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2d860 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
2d870 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2d880 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2d890 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
2d8a0 52 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RD");.    return
2d8b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2d8c0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2d8d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2d8e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2d8f0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
2d900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d910 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54  .  }.  zUser = T
2d920 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2d930 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64  v[2]);.  zPasswd
2d940 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2d950 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
2d960 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 72 63   &nPasswd);.  rc
2d970 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
2d980 61 75 74 68 65 6e 74 69 63 61 74 65 28 64 62 2c  authenticate(db,
2d990 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c   zUser, zPasswd,
2d9a0 20 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c   nPasswd);.  Tcl
2d9b0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2d9c0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
2d9d0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
2d9e0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
2d9f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2da00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
2da10 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2da20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2da30 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
2da40 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
2da50 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
2da60 65 72 5f 61 64 64 20 44 42 20 55 53 45 52 4e 41  er_add DB USERNA
2da70 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ME PASSWORD ISAD
2da80 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MIN.*/.static in
2da90 74 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64 28  t test_user_add(
2daa0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2dab0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2dac0 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2dad0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2dae0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2daf0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2db00 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2db10 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2db30 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2db40 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2db50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2db60 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2db70 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
2db80 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20  r *zUser = 0;.  
2db90 63 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20  char *zPasswd = 
2dba0 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64  0;.  int nPasswd
2dbb0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64   = 0;.  int isAd
2dbc0 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  min = 0;.  sqlit
2dbd0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
2dbe0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
2dbf0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2dc00 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2dc10 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53   1, objv, "DB US
2dc20 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20  ERNAME PASSWORD 
2dc30 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72  ISADMIN");.    r
2dc40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2dc50 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2dc60 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2dc70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2dc80 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
2dc90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2dca0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65  RROR;.  }.  zUse
2dcb0 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
2dcc0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50  g(objv[2]);.  zP
2dcd0 61 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53  asswd = Tcl_GetS
2dce0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
2dcf0 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b  v[3], &nPasswd);
2dd00 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  .  Tcl_GetBoolea
2dd10 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
2dd20 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d   objv[4], &isAdm
2dd30 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  in);.  rc = sqli
2dd40 74 65 33 5f 75 73 65 72 5f 61 64 64 28 64 62 2c  te3_user_add(db,
2dd50 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c   zUser, zPasswd,
2dd60 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69   nPasswd, isAdmi
2dd70 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  n);.  Tcl_SetRes
2dd80 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2dd90 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
2dda0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2ddb0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2ddc0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
2ddd0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2dde0 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  NTICATION */..#i
2ddf0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
2de00 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2de10 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
2de20 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e  qlite3_user_chan
2de30 67 65 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50  ge DB USERNAME P
2de40 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a  ASSWORD ISADMIN.
2de50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2de60 73 74 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 0a  st_user_change(.
2de70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2de80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
2de90 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
2dea0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2deb0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2dec0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2ded0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2dee0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2def0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2df00 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2df10 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2df20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2df30 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2df40 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
2df50 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63   *zUser = 0;.  c
2df60 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30  har *zPasswd = 0
2df70 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20  ;.  int nPasswd 
2df80 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d  = 0;.  int isAdm
2df90 69 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  in = 0;.  sqlite
2dfa0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2dfb0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
2dfc0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2dfd0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2dfe0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45  1, objv, "DB USE
2dff0 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
2e000 53 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65  SADMIN");.    re
2e010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e020 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2e030 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2e040 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2e050 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
2e060 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e070 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72  ROR;.  }.  zUser
2e080 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2e090 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61  (objv[2]);.  zPa
2e0a0 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  sswd = Tcl_GetSt
2e0b0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
2e0c0 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a  [3], &nPasswd);.
2e0d0 20 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e    Tcl_GetBoolean
2e0e0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2e0f0 6f 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69  objv[4], &isAdmi
2e100 6e 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  n);.  rc = sqlit
2e110 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 64  e3_user_change(d
2e120 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77  b, zUser, zPassw
2e130 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64  d, nPasswd, isAd
2e140 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  min);.  Tcl_SetR
2e150 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2e160 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
2e170 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
2e180 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
2e190 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2e1a0 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2e1b0 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a  HENTICATION */..
2e1c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
2e1d0 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2e1e0 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  N./*.** tclcmd: 
2e1f0 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65   sqlite3_user_de
2e200 6c 65 74 65 20 44 42 20 55 53 45 52 4e 41 4d 45  lete DB USERNAME
2e210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2e220 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74 65 28  est_user_delete(
2e230 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2e240 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75  ientData, /* Unu
2e250 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
2e260 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2e270 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2e280 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2e290 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2e2a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e2c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2e2d0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2e2e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2e2f0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2e300 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ents */.){.  cha
2e310 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20  r *zUser = 0;.  
2e320 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2e330 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
2e340 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
2e350 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2e360 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2e370 44 42 20 55 53 45 52 4e 41 4d 45 22 29 3b 0a 20  DB USERNAME");. 
2e380 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e390 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2e3a0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2e3b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2e3c0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2e3d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2e3e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2e3f0 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
2e400 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2e410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
2e420 73 65 72 5f 64 65 6c 65 74 65 28 64 62 2c 20 7a  ser_delete(db, z
2e430 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74  User);.  Tcl_Set
2e440 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
2e450 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
2e460 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
2e470 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
2e480 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
2e490 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  * SQLITE_USER_AU
2e4a0 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a  THENTICATION */.
2e4b0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 62  ./*.** tclcmd: b
2e4c0 61 64 5f 62 65 68 61 76 69 6f 72 20 54 59 50 45  ad_behavior TYPE
2e4d0 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d 65 20 74  .**.** Do some t
2e4e0 68 69 6e 67 73 20 74 68 61 74 20 73 68 6f 75 6c  hings that shoul
2e4f0 64 20 74 72 69 67 67 65 72 20 61 20 76 61 6c 67  d trigger a valg
2e500 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e 69 74 69  rind or -fsaniti
2e510 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20  ze=undefined.** 
2e520 77 61 72 6e 69 6e 67 2e 20 20 54 68 69 73 20 69  warning.  This i
2e530 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
2e540 20 74 68 61 74 20 65 72 72 6f 72 73 20 61 6e 64   that errors and
2e550 20 77 61 72 6e 69 6e 67 73 20 6f 75 74 70 75 74   warnings output
2e560 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20 74 6f 6f   by those.** too
2e570 6c 73 20 61 72 65 20 64 65 74 65 63 74 65 64 20  ls are detected 
2e580 62 79 20 74 68 65 20 74 65 73 74 20 73 63 72 69  by the test scri
2e590 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  pts..**.**      
2e5a0 20 54 59 50 45 20 20 20 20 20 20 20 42 45 48 41   TYPE       BEHA
2e5b0 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20 20 31 20  VIOR.**       1 
2e5c0 20 20 20 20 20 20 20 20 20 4f 76 65 72 66 6c 6f           Overflo
2e5d0 77 20 61 20 73 69 67 6e 65 64 20 69 6e 74 65 67  w a signed integ
2e5e0 65 72 0a 2a 2a 20 20 20 20 20 20 20 32 20 20 20  er.**       2   
2e5f0 20 20 20 20 20 20 20 4a 75 6d 70 20 62 61 73 65         Jump base
2e600 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  d on an uninitia
2e610 6c 69 7a 65 64 20 76 61 72 69 61 62 6c 65 0a 2a  lized variable.*
2e620 2a 20 20 20 20 20 20 20 33 20 20 20 20 20 20 20  *       3       
2e630 20 20 20 52 65 61 64 20 61 66 74 65 72 20 66 72     Read after fr
2e640 65 65 0a 2a 2a 20 20 20 20 20 20 20 34 20 20 20  ee.**       4   
2e650 20 20 20 20 20 20 20 50 61 6e 69 63 0a 2a 2f 0a         Panic.*/.
2e660 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
2e670 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20 20  bad_behavior(.  
2e680 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2e690 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2e6a0 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
2e6b0 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
2e6c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2e6d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2e6e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2e6f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2e700 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2e710 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2e720 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2e730 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2e740 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2e750 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2e760 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2e770 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54 79   */.){.  int iTy
2e780 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a 20  pe;.  int xyz;. 
2e790 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a 29   int i = *(int*)
2e7a0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e  clientData;.  in
2e7b0 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30 5d  t j;.  int w[10]
2e7c0 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69 66  ;.  int *a;.  if
2e7d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2e7e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2e7f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2e800 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20 20  v, "TYPE");.    
2e810 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e820 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
2e830 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2e840 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
2e850 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e 20  iType) ) return 
2e860 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77 69  TCL_ERROR;.  swi
2e870 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20  tch( iType ){.  
2e880 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
2e890 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66 66    xyz = 0x7fffff
2e8a0 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78 79  00 - i;.      xy
2e8b0 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20 20  z += 0x100;.    
2e8c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2e8d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2e8e0 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b 0a  ewIntObj(xyz));.
2e8f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e900 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
2e910 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35 3b  .      w[1] = 5;
2e920 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d 3e  .      if( w[i]>
2e930 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20 20  0 ) w[1]++;.    
2e940 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2e950 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2e960 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29 3b  ewIntObj(w[1]));
2e970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2e980 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
2e990 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c 6c  {.      a = mall
2e9a0 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  oc( sizeof(int)*
2e9b0 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  10 );.      for(
2e9c0 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29 20  j=0; j<10; j++) 
2e9d0 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  a[j] = j;.      
2e9e0 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 54  free(a);.      T
2e9f0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2ea00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
2ea10 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20 20  ntObj(a[i]));.  
2ea20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2ea30 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
2ea40 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28 22       Tcl_Panic("
2ea50 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69 63  Deliberate panic
2ea60 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
2ea70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2ea80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a  urn TCL_OK;.}  .
2ea90 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2eaa0 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74   register_dbstat
2eab0 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20 43  _vtab DB.**.** C
2eac0 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74 20  ause the dbstat 
2ead0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
2eae0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e   be available on
2eaf0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2eb00 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
2eb10 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64   test_register_d
2eb20 62 73 74 61 74 5f 76 74 61 62 28 0a 20 20 76 6f  bstat_vtab(.  vo
2eb30 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2eb40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2eb50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2eb60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2eb70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
2eb80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2eb90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 54  VIRTUALTABLE.  T
2eba0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ebb0 69 6e 74 65 72 70 2c 20 22 64 62 73 74 61 74 20  interp, "dbstat 
2ebc0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 62 65  not available be
2ebd0 63 61 75 73 65 20 6f 66 20 22 0a 20 20 20 20 20  cause of ".     
2ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ebf0 20 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d        "SQLITE_OM
2ec00 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22  IT_VIRTUALTABLE"
2ec10 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72  , (void*)0);.  r
2ec20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ec30 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
2ec40 53 71 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74  SqliteDb { sqlit
2ec50 65 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61  e3 *db; };.  cha
2ec60 72 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d  r *zDb;.  Tcl_Cm
2ec70 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a  dInfo cmdInfo;..
2ec80 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2ec90 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2eca0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ecb0 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
2ecc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ecd0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d  OR;.  }..  zDb =
2ece0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2ecf0 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[1]);.  if( T
2ed00 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
2ed10 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
2ed20 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
2ed30 73 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 28 28  sqlite3* db = ((
2ed40 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
2ed50 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
2ed60 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20  ntData)->db;.   
2ed70 20 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65   sqlite3DbstatRe
2ed80 67 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a  gister(db);.  }.
2ed90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2eda0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2edb0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2edc0 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  BLE */.}../*.** 
2edd0 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64  Register command
2ede0 73 20 77 69 74 68 20 74 68 65 20 54 43 4c 20 69  s with the TCL i
2edf0 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69  nterpreter..*/.i
2ee00 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49  nt Sqlitetest1_I
2ee10 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
2ee20 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72  interp){.  exter
2ee30 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
2ee40 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  arch_count;.  ex
2ee50 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2ee60 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20  _found_count;.  
2ee70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ee80 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75  e3_interrupt_cou
2ee90 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
2eea0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69   sqlite3_open_fi
2eeb0 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  le_count;.  exte
2eec0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
2eed0 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  ort_count;.  ext
2eee0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2eef0 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69  current_time;.#i
2ef00 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
2ef10 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2ef20 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2ef30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ef40 53 54 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69  STYLE.  extern i
2ef50 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  nt sqlite3_hosti
2ef60 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20  d_num;.#endif.  
2ef70 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ef80 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b  e3_max_blobsize;
2ef90 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2efa0 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
2efb0 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64  CacheReport(void
2efc0 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *,.             
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efe0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
2eff0 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c  _Interp*,int,Tcl
2f000 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20  _Obj*CONST*);.  
2f010 73 74 61 74 69 63 20 69 6e 74 20 69 5a 65 72 6f  static int iZero
2f020 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73   = 0;.  static s
2f030 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
2f040 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
2f050 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
2f060 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
2f070 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74  {.     { "db_ent
2f080 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  er",            
2f090 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f0a0 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72  mdProc*)db_enter
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f0c0 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61  ,.     { "db_lea
2f0d0 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ve",            
2f0e0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f0f0 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65  mdProc*)db_leave
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f110 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f120 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
2f130 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f140 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f150 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
2f160 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f170 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
2f180 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
2f190 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f1a0 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
2f1b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f1c0 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c  3_mprintf_long",
2f1d0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f1e0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f1f0 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d  mprintf_long   }
2f200 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f210 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
2f220 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f230 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f240 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
2f250 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f260 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c  3_snprintf_str",
2f270 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f280 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f290 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d  snprintf_str   }
2f2a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f2b0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
2f2c0 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  y",       (Tcl_C
2f2d0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f2e0 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d  mprintf_stronly}
2f2f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f300 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
2f310 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2f320 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f330 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
2f340 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f350 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
2f360 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2f370 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
2f380 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
2f390 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f3a0 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
2f3b0 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64  ble",   (Tcl_Cmd
2f3c0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
2f3d0 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d  rintf_hexdouble}
2f3e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f3f0 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
2f400 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2f410 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
2f420 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
2f430 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2f440 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22  _mprintf_n_test"
2f450 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
2f460 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
2f470 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_n        },.
2f480 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2f490 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  snprintf_int",  
2f4a0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2f4b0 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69  Proc*)test_snpri
2f4c0 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20  ntf_int     },. 
2f4d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
2f4e0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
2f4f0 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ",     (Tcl_CmdP
2f500 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72  roc*)test_last_r
2f510 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  owid       },.  
2f520 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
2f530 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  ec_printf",     
2f540 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2f550 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72  oc*)test_exec_pr
2f560 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20  intf      },.   
2f570 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
2f580 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20 20  c_hex",         
2f590 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f5a0 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78  c*)test_exec_hex
2f5b0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f5c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
2f5d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2f5e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2f5f0 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20 20  *)test_exec     
2f600 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2f610 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
2f620 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nr",            
2f630 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f640 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20  )test_exec_nr   
2f650 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65         },.#ifnde
2f660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  f SQLITE_OMIT_GE
2f670 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22  T_TABLE.     { "
2f680 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
2f690 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  e_printf",      
2f6a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2f6b0 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  st_get_table_pri
2f6c0 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  ntf },.#endif.  
2f6d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
2f6e0 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
2f6f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2f700 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
2f710 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20  close     },.   
2f720 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f    { "sqlite3_clo
2f730 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  se_v2",         
2f740 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f750 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  c*)sqlite_test_c
2f760 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20  lose_v2  },.    
2f770 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2f780 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
2f790 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2f7a0 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  *)test_create_fu
2f7b0 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  nction  },.     
2f7c0 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
2f7d0 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20  e_aggregate",   
2f7e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f7f0 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67  )test_create_agg
2f800 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b  regate },.     {
2f810 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65   "sqlite_registe
2f820 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  r_test_function"
2f830 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
2f840 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
2f850 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nc    },.     { 
2f860 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20  "sqlite_abort", 
2f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f880 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
2f890 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20  qlite_abort     
2f8a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f8b0 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20  sqlite_bind",   
2f8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2f8e0 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20  st_bind         
2f8f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
2f900 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20  reakpoint",     
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2f920 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2f930 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20  t_breakpoint    
2f940 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2f950 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20  lite3_key",     
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2f970 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2f980 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  _key            
2f990 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2f9a0 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20  ite3_rekey",    
2f9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2f9c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2f9d0 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  rekey           
2f9e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2f9f0 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20  te_set_magic",  
2fa00 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2fa10 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2fa20 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20  _set_magic      
2fa30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2fa40 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20  e3_interrupt",  
2fa50 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2fa60 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e  CmdProc*)test_in
2fa70 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d  terrupt        }
2fa80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2fa90 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
2faa0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
2fab0 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66  mdProc*)delete_f
2fac0 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c  unction       },
2fad0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2fae0 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
2faf0 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
2fb00 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f  dProc*)delete_co
2fb10 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a  llation      },.
2fb20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2fb30 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c  get_autocommit",
2fb40 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2fb50 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f  Proc*)get_autoco
2fb60 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  mmit        },. 
2fb70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2fb80 74 61 63 6b 5f 75 73 65 64 22 2c 20 20 20 20 20  tack_used",     
2fb90 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2fba0 72 6f 63 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f  roc*)test_stack_
2fbb0 75 73 65 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  used       },.  
2fbc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 75     { "sqlite3_bu
2fbd0 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20 20  sy_timeout",    
2fbe0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2fbf0 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74 69  oc*)test_busy_ti
2fc00 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20 20  meout     },.   
2fc10 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20 20    { "printf",   
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc30 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2fc40 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20 20  c*)test_printf  
2fc50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2fc60 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72 61   { "sqlite3IoTra
2fc70 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ce",            
2fc80 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2fc90 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20 20  test_io_trace   
2fca0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2fcb0 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f  "clang_sanitize_
2fcc0 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20 20  address",       
2fcd0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63   (Tcl_CmdProc*)c
2fce0 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64  lang_sanitize_ad
2fcf0 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20  dress },.  };.  
2fd00 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
2fd10 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2fd20 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d  ;.     Tcl_ObjCm
2fd30 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20  dProc *xProc;.  
2fd40 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44     void *clientD
2fd50 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64  ata;.  } aObjCmd
2fd60 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 62  [] = {.     { "b
2fd70 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20 20 20  ad_behavior",   
2fd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2fd90 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72  est_bad_behavior
2fda0 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65 72 6f  ,  (void*)&iZero
2fdb0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 67 69   },.     { "regi
2fdc0 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
2fdd0 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
2fde0 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74  _register_dbstat
2fdf0 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20 20 7b  _vtab  },.     {
2fe00 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63   "sqlite3_connec
2fe10 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20  tion_pointer",  
2fe20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69    get_sqlite_poi
2fe30 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  nter, 0 },.     
2fe40 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2fe50 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
2fe60 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
2fe70 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
2fe80 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2fe90 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20  _zeroblob",     
2fea0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65      test_bind_ze
2feb0 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20  roblob, 0 },.   
2fec0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2fed0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 22 2c 20 20  d_zeroblob64",  
2fee0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
2fef0 65 72 6f 62 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a  eroblob64, 0 },.
2ff00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ff10 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20  bind_int64",    
2ff20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2ff30 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c  d_int64,    0 },
2ff40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ff50 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20  _bind_double",  
2ff60 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2ff70 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d  nd_double,   0 }
2ff80 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ff90 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20  3_bind_null",   
2ffa0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2ffb0 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20  ind_null     ,0 
2ffc0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2ffd0 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20  e3_bind_text",  
2ffe0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2fff0 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30  bind_text     ,0
30000 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30010 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22  te3_bind_text16"
30020 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
30030 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c  _bind_text16   ,
30040 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30050 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c  ite3_bind_blob",
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
30070 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20  t_bind_blob     
30080 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
30090 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
300a0 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65  eter_count",  te
300b0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
300c0 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20  r_count, 0},.   
300d0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
300e0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
300f0 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  ",   test_bind_p
30100 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20  arameter_name,  
30110 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
30120 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
30130 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74  er_index",  test
30140 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
30150 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20  index, 0},.     
30160 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  { "sqlite3_clear
30170 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20  _bindings",     
30180 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69     test_clear_bi
30190 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20  ndings, 0},.    
301a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65   { "sqlite3_slee
301b0 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
301c0 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20      test_sleep, 
301d0 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20           0},.   
301e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
301f0 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
30200 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64       test_errcod
30210 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
30220 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
30230 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c  tended_errcode",
30240 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72        test_ex_er
30250 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20  rcode    ,0 },. 
30260 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30270 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20  rrmsg",         
30280 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
30290 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg        ,0 },.
302a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
302b0 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20  errmsg16",      
302c0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
302d0 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c  msg16      ,0 },
302e0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
302f0 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  _open",         
30300 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
30310 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  en          ,0 }
30320 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30330 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20  3_open16",      
30340 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
30350 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20  pen16        ,0 
30360 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30370 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20  e3_open_v2",    
30380 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30390 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30  open_v2       ,0
303a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
303b0 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c  te3_complete16",
303c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
303d0 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c  _complete16    ,
303e0 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
303f0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20  lite3_prepare", 
30400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
30410 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20 20  st_prepare      
30420 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30430 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
30440 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
30450 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20 20  est_prepare16   
30460 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30470 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
30480 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
30490 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20  test_prepare_v2 
304a0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
304b0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
304c0 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20  _tkt3134",      
304d0 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b   test_prepare_tk
304e0 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20  t3134, 0},.     
304f0 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61  { "sqlite3_prepa
30500 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20  re16_v2",       
30510 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 31     test_prepare1
30520 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20  6_v2  ,0 },.    
30530 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61   { "sqlite3_fina
30540 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  lize",          
30550 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a      test_finaliz
30560 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  e      ,0 },.   
30570 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d    { "sqlite3_stm
30580 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20 20  t_status",      
30590 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73       test_stmt_s
305a0 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20  tatus   ,0 },.  
305b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
305c0 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  set",           
305d0 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65 74        test_reset
305e0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
305f0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30600 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20 20  xpired",        
30610 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70 69         test_expi
30620 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  red       ,0 },.
30630 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30640 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67  transfer_binding
30650 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61  s",     test_tra
30660 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c  nsfer_bind ,0 },
30670 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30680 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20  _changes",      
30690 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 68           test_ch
306a0 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d  anges       ,0 }
306b0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
306c0 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20 20  3_step",        
306d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
306e0 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30 20  tep          ,0 
306f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30700 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20  e3_sql",        
30710 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30720 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30  sql           ,0
30730 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30740 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20  te3_next_stmt", 
30750 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
30760 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c  _next_stmt     ,
30770 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30780 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
30790 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74 65 73  ly",         tes
307a0 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20  t_stmt_readonly 
307b0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
307c0 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22  lite3_stmt_busy"
307d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
307e0 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20  st_stmt_busy    
307f0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75   ,0 },.     { "u
30800 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
30810 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 75  ",             u
30820 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c  ses_stmt_journal
30830 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22   ,0 },..     { "
30840 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
30850 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20  memory",        
30860 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  test_release_mem
30870 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ory,     0},.   
30880 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
30890 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c  release_memory",
308a0 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c       test_db_rel
308b0 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d  ease_memory,  0}
308c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
308d0 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20  3_db_filename", 
308e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
308f0 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  b_filename,     
30900 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
30910 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
30920 6c 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ly",           t
30930 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c  est_db_readonly,
30940 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
30950 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74   { "sqlite3_soft
30960 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20  _heap_limit",   
30970 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65      test_soft_he
30980 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c  ap_limit,    0},
30990 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
309a0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22  _thread_cleanup"
309b0 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68  ,        test_th
309c0 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20  read_cleanup,   
309d0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
309e0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
309f0 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65  ounts",       te
30a00 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
30a10 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20  ts,    0},..    
30a20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64   { "sqlite3_load
30a30 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
30a40 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78      test_load_ex
30a50 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c  tension,     0},
30a60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30a70 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
30a80 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e  ension", test_en
30a90 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20  able_load,      
30aa0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
30ab0 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
30ac0 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65  esult_codes", te
30ad0 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
30ae0 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20  lt_codes, 0},.  
30af0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
30b00 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
30b10 20 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74        test_limit
30b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30b30 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73    0},..     { "s
30b40 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  ave_prng_state",
30b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
30b60 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  ave_prng_state, 
30b70 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
30b80 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
30b90 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
30ba0 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
30bb0 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  te, 0 },.     { 
30bc0 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74  "reset_prng_stat
30bd0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
30be0 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
30bf0 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  e,   0 },.     {
30c00 20 22 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72   "database_never
30c10 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20  _corrupt",      
30c20 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72    database_never
30c30 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20  _corrupt, 0},.  
30c40 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6d     { "database_m
30c50 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c 20  ay_be_corrupt", 
30c60 20 20 20 20 20 20 64 61 74 61 62 61 73 65 5f 6d        database_m
30c70 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20 30  ay_be_corrupt, 0
30c80 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d  },.     { "optim
30c90 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22  ization_control"
30ca0 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  ,          optim
30cb0 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c  ization_control,
30cc0 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  0},.#if SQLITE_O
30cd0 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f  S_WIN.     { "lo
30ce0 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20  ck_win32_file", 
30cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
30d00 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20  n32_file_lock,  
30d10 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65    0 },.     { "e
30d20 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68  xists_win32_path
30d30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ",             w
30d40 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68  in32_exists_path
30d50 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ,  0 },.     { "
30d60 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22  find_win32_file"
30d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30d80 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c  win32_find_file,
30d90 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
30da0 22 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69  "delete_win32_fi
30db0 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
30dc0 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69   win32_delete_fi
30dd0 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  le,  0 },.     {
30de0 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72   "make_win32_dir
30df0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30e00 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20    win32_mkdir,  
30e10 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20        0 },.     
30e20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f  { "remove_win32_
30e30 64 69 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  dir",           
30e40 20 20 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20     win32_rmdir, 
30e50 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
30e60 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f  if.     { "tcl_o
30e70 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20  bjproc",        
30e80 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 41 73             runAs
30e90 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30  ObjProc,       0
30ea0 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c   },..     /* sql
30eb0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20  ite3_column_*() 
30ec0 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73  API */.     { "s
30ed0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
30ee0 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74  unt",          t
30ef0 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
30f00 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30f10 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75  sqlite3_data_cou
30f20 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
30f30 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20  test_data_count 
30f40 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
30f50 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
30f60 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
30f70 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70   test_column_typ
30f80 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  e   ,0 },.     {
30f90 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
30fa0 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
30fb0 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c    test_column_bl
30fc0 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  ob   ,0 },.     
30fd0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
30fe0 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  n_double",      
30ff0 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64     test_column_d
31000 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20  ouble ,0 },.    
31010 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
31020 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  mn_int64",      
31030 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
31040 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20  int64  ,0 },.   
31050 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
31060 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73  umn_text",   tes
31070 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76  t_stmt_utf8,  (v
31080 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
31090 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20  umn_text },.    
310a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
310b0 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74  mn_name",   test
310c0 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f  _stmt_utf8,  (vo
310d0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
310e0 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20  mn_name },.     
310f0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
31100 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f  n_int",    test_
31110 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69  stmt_int,   (voi
31120 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31130 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b  n_int  },.     {
31140 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
31150 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73  _bytes",  test_s
31160 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64  tmt_int,   (void
31170 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
31180 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66  _bytes},.#ifndef
31190 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
311a0 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71  LTYPE.     { "sq
311b0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
311c0 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74  ltype",test_stmt
311d0 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
311e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
311f0 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69  type},.#endif.#i
31200 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
31210 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
31220 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f  TA.{ "sqlite3_co
31230 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
31240 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
31250 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
31260 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
31270 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
31280 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
31290 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
312a0 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
312b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
312c0 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69  e_name},.{ "sqli
312d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
312e0 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d  n_name",test_stm
312f0 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71  t_utf8,(void*)sq
31300 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
31310 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69  gin_name},.#endi
31320 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
31330 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20  E_OMIT_UTF16.   
31340 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
31350 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65  umn_bytes16", te
31360 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f  st_stmt_int, (vo
31370 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
31380 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20  mn_bytes16 },.  
31390 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
313a0 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74  lumn_text16",  t
313b0 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
313c0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
313d0 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20  olumn_text16},. 
313e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
313f0 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20  olumn_name16",  
31400 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
31410 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
31420 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a  column_name16},.
31430 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67       { "add_alig
31440 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
31450 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67  tions", add_alig
31460 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61  nment_test_colla
31470 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c  tions, 0      },
31480 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31490 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
314a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
314b0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22  lumn_decltype16"
314c0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36  ,test_stmt_utf16
314d0 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  ,(void*)sqlite3_
314e0 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
314f0 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  6},.#endif.#ifde
31500 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31510 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
31520 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
31530 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
31540 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",.  test_stmt_u
31550 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
31560 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61  ite3_column_data
31570 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22  base_name16},.{"
31580 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31590 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65  able_name16", te
315a0 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
315b0 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
315c0 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31  lumn_table_name1
315d0 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f  6},.{"sqlite3_co
315e0 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
315f0 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75  16", test_stmt_u
31600 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
31610 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
31620 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64  in_name16},.#end
31630 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  if.#endif.     {
31640 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
31650 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20  _collation_v2", 
31660 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  test_create_coll
31670 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20  ation_v2, 0 },. 
31680 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67      { "sqlite3_g
31690 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20  lobal_recover", 
316a0 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f      test_global_
316b0 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a  recover, 0   },.
316c0 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f       { "working_
316d0 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20  64bit_int",     
316e0 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62       working_64b
316f0 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c  it_int,   0   },
31700 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c  .     { "vfs_unl
31710 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ink_test",      
31720 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b        vfs_unlink
31730 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d  _test,     0   }
31740 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e  ,.     { "vfs_in
31750 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20  itfail_test",   
31760 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66         vfs_initf
31770 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  ail_test,   0   
31780 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75  },.     { "vfs_u
31790 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20  nregister_all", 
317a0 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65          vfs_unre
317b0 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20  gister_all,  0  
317c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
317d0 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c  reregister_all",
317e0 20 20 20 20 20 20 20 20 20 76 66 73 5f 72 65 72           vfs_rer
317f0 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20  egister_all,  0 
31800 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
31810 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c  e_control_test",
31820 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63            file_c
31830 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30  ontrol_test,   0
31840 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
31850 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
31860 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65  rrno_test", file
31870 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
31880 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  no_test,  0   },
31890 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
318a0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
318b0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
318c0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
318d0 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
318e0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
318f0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 22  _chunksize_test"
31900 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63  , file_control_c
31910 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c 20 20  hunksize_test,  
31920 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
31930 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
31940 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66 69 6c  hint_test",  fil
31950 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69  e_control_sizehi
31960 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  nt_test,   0   }
31970 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ,.#if SQLITE_OS_
31980 57 49 4e 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  WIN.     { "file
31990 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
319a0 76 5f 72 65 74 72 79 22 2c 20 66 69 6c 65 5f 63  v_retry", file_c
319b0 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
319c0 72 65 74 72 79 2c 20 20 30 20 20 20 7d 2c 0a 20  retry,  0   },. 
319d0 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
319e0 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61  rol_win32_set_ha
319f0 6e 64 6c 65 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  ndle", file_cont
31a00 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61  rol_win32_set_ha
31a10 6e 64 6c 65 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  ndle, 0  },.#end
31a20 69 66 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  if.     { "file_
31a30 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
31a40 77 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f  wal",    file_co
31a50 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
31a60 6c 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20  l,     0   },.  
31a70 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
31a80 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
31a90 72 77 72 69 74 65 22 2c 66 69 6c 65 5f 63 6f 6e  rwrite",file_con
31aa0 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
31ab0 76 65 72 77 72 69 74 65 2c 30 7d 2c 0a 20 20 20  verwrite,0},.   
31ac0 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
31ad0 6c 5f 76 66 73 6e 61 6d 65 22 2c 20 20 20 20 20  l_vfsname",     
31ae0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
31af0 76 66 73 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  vfsname,        
31b00 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
31b10 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
31b20 70 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 66 69  pfilename",   fi
31b30 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
31b40 69 6c 65 6e 61 6d 65 2c 20 20 20 20 30 20 20 20  ilename,    0   
31b50 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31b60 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20  e3_vfs_list",   
31b70 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74          vfs_list
31b80 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
31b90 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65    { "sqlite3_cre
31ba0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22  ate_function_v2"
31bb0 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  , test_create_fu
31bc0 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a  nction_v2, 0 },.
31bd0 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f  .     /* Functio
31be0 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a  ns from os.h */.
31bf0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31c00 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
31c10 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
31c20 74 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  te",        test
31c30 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
31c40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
31c50 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61   "add_test_colla
31c60 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74  te_needed", test
31c70 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c  _collate_needed,
31c80 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b   0     },.     {
31c90 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74   "add_test_funct
31ca0 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74  ion",       test
31cb0 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20  _function, 0    
31cc0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
31cd0 20 22 61 64 64 5f 74 65 73 74 5f 75 74 66 31 36   "add_test_utf16
31ce0 62 69 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20  bin_collate",   
31cf0 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63   test_utf16bin_c
31d00 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20  ollate, 0       
31d10 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
31d20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  { "sqlite3_test_
31d30 65 72 72 73 74 72 22 2c 20 20 20 20 20 74 65 73  errstr",     tes
31d40 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20 20 20  t_errstr, 0     
31d50 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
31d60 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  { "tcl_variable_
31d70 74 79 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c  type",       tcl
31d80 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20  _variable_type, 
31d90 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64  0       },.#ifnd
31da0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
31db0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
31dc0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62   { "sqlite3_enab
31dd0 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22  le_shared_cache"
31de0 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68  , test_enable_sh
31df0 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20  ared, 0  },.    
31e00 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72   { "sqlite3_shar
31e10 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22  ed_cache_report"
31e20 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  , sqlite3BtreeSh
31e30 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c  aredCacheReport,
31e40 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20   0},.#endif.    
31e50 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76   { "sqlite3_libv
31e60 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20  ersion_number", 
31e70 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
31e80 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 20 20  number, 0  },.  
31e90 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61     { "sqlite3_ta
31ea0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
31eb0 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65  ata", test_table
31ec0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
31ed0 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20  , 0  },.#ifndef 
31ee0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
31ef0 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71 6c  BLOB.     { "sql
31f00 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e  ite3_blob_reopen
31f10 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  ", test_blob_reo
31f20 70 65 6e 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69  pen, 0  },.#endi
31f30 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63 68 65  f.     { "pcache
31f40 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20 20 74  _stats",       t
31f50 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
31f60 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53  , 0  },.#ifdef S
31f70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
31f80 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20  OCK_NOTIFY.     
31f90 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63  { "sqlite3_unloc
31fa0 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f  k_notify", test_
31fb0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30  unlock_notify, 0
31fc0 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20    },.#endif.    
31fd0 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
31fe0 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74  checkpoint",   t
31ff0 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
32000 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  nt, 0  },.     {
32010 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   "sqlite3_wal_ch
32020 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73  eckpoint_v2",tes
32030 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
32040 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20  _v2, 0  },.     
32050 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  { "sqlite3_wal_a
32060 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 74  utocheckpoint",t
32070 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  est_wal_autochec
32080 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
32090 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c 69 74     { "test_sqlit
320a0 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20 20  e3_log",        
320b0 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f   test_sqlite3_lo
320c0 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66  g, 0  },.#ifndef
320d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
320e0 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70 72 69  LAIN.     { "pri
320f0 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72 79  nt_explain_query
32100 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72 69  _plan", test_pri
32110 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65  nt_eqp, 0  },.#e
32120 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c  ndif.     { "sql
32130 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
32140 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f 63 6f  l", test_test_co
32150 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c  ntrol },.#if SQL
32160 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20  ITE_OS_UNIX.    
32170 20 7b 20 22 67 65 74 72 75 73 61 67 65 22 2c 20   { "getrusage", 
32180 74 65 73 74 5f 67 65 74 72 75 73 61 67 65 20 7d  test_getrusage }
32190 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
321a0 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74  "load_static_ext
321b0 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64  ension", tclLoad
321c0 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43  StaticExtensionC
321d0 6d 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  md },.     { "so
321e0 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
321f0 61 70 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74  ap", sorter_test
32200 5f 66 61 6b 65 68 65 61 70 20 7d 2c 0a 20 20 20  _fakeheap },.   
32210 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74    { "sorter_test
32220 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 22 2c 20  _sort4_helper", 
32230 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74  sorter_test_sort
32240 34 5f 68 65 6c 70 65 72 20 7d 2c 0a 23 69 66 64  4_helper },.#ifd
32250 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  ef SQLITE_USER_A
32260 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
32270 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73     { "sqlite3_us
32280 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 22  er_authenticate"
32290 2c 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68  , test_user_auth
322a0 65 6e 74 69 63 61 74 65 2c 20 30 20 7d 2c 0a 20  enticate, 0 },. 
322b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
322c0 73 65 72 5f 61 64 64 22 2c 20 20 20 20 20 20 20  ser_add",       
322d0 20 20 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64     test_user_add
322e0 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
322f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
32300 75 73 65 72 5f 63 68 61 6e 67 65 22 2c 20 20 20  user_change",   
32310 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f 63 68      test_user_ch
32320 61 6e 67 65 2c 20 20 20 20 20 20 20 30 20 7d 2c  ange,       0 },
32330 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32340 5f 75 73 65 72 5f 64 65 6c 65 74 65 22 2c 20 20  _user_delete",  
32350 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f 64       test_user_d
32360 65 6c 65 74 65 2c 20 20 20 20 20 20 20 30 20 7d  elete,       0 }
32370 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ,.#endif.#ifdef 
32380 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
32390 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
323a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
323b0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 22 2c 20  mt_scanstatus", 
323c0 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
323d0 73 63 61 6e 73 74 61 74 75 73 2c 20 20 20 30 20  scanstatus,   0 
323e0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
323f0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
32400 75 73 5f 72 65 73 65 74 22 2c 20 74 65 73 74 5f  us_reset", test_
32410 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f  stmt_scanstatus_
32420 72 65 73 65 74 2c 20 20 20 30 20 7d 2c 0a 23 65  reset,   0 },.#e
32430 6e 64 69 66 0a 0a 20 20 7d 3b 0a 20 20 73 74 61  ndif..  };.  sta
32440 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f  tic int bitmask_
32450 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69  size = sizeof(Bi
32460 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74 20  tmask)*8;.  int 
32470 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  i;.  extern int 
32480 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
32490 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  nt, sqlite3_full
324a0 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  sync_count;.  ex
324b0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
324c0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 3b  _opentemp_count;
324d0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
324e0 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
324f0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
32500 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63  qlite3_xferopt_c
32510 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
32520 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
32530 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a 20  _readdb_count;. 
32540 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
32550 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64  te3_pager_writed
32560 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  b_count;.  exter
32570 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  n int sqlite3_pa
32580 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
32590 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
325a0 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 4c 4f 4e  WIN.  extern LON
325b0 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c 69 74  G volatile sqlit
325c0 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65 6e 64  e3_os_type;.#end
325d0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
325e0 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72 6e 20  _DEBUG.  extern 
325f0 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
32600 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20  Trace;.  extern 
32610 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54 72 61  int sqlite3OSTra
32620 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  ce;.  extern int
32630 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65   sqlite3WalTrace
32640 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
32650 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 69 66 64  SQLITE_TEST.#ifd
32660 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
32670 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e 20 69  _FTS3.  extern i
32680 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73 33 5f  nt sqlite3_fts3_
32690 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68 65 73  enable_parenthes
326a0 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  es;.#endif.#endi
326b0 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f..  for(i=0; i<
326c0 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73 69 7a  sizeof(aCmd)/siz
326d0 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20 69 2b  eof(aCmd[0]); i+
326e0 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
326f0 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
32700 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c  , aCmd[i].zName,
32710 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20   aCmd[i].xProc, 
32720 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  0, 0);.  }.  for
32730 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
32740 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  ObjCmd)/sizeof(a
32750 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29  ObjCmd[0]); i++)
32760 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  {.    Tcl_Create
32770 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
32780 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 7a 4e  p, aObjCmd[i].zN
32790 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 61 4f  ame, .        aO
327a0 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63 2c 20  bjCmd[i].xProc, 
327b0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69 65 6e  aObjCmd[i].clien
327c0 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 20  tData, 0);.  }. 
327d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
327e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 65 61  erp, "sqlite_sea
327f0 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  rch_count", .   
32800 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
32810 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2c  e3_search_count,
32820 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
32830 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32840 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 66 6f  terp, "sqlite_fo
32850 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  und_count", .   
32860 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
32870 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 2c 20  e3_found_count, 
32880 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
32890 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
328a0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 6f 72  erp, "sqlite_sor
328b0 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20  t_count", .     
328c0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
328d0 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sort_count, TCL
328e0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
328f0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
32900 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62  , "sqlite3_max_b
32910 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20 20 20  lobsize", .     
32920 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
32930 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c 20 54  _max_blobsize, T
32940 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
32950 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
32960 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69 6b 65  rp, "sqlite_like
32970 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
32980 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
32990 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  like_count, TCL_
329a0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
329b0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
329c0 20 22 73 71 6c 69 74 65 5f 69 6e 74 65 72 72 75   "sqlite_interru
329d0 70 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  pt_count", .    
329e0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
329f0 33 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e  3_interrupt_coun
32a00 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
32a10 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
32a20 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
32a30 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 22  open_file_count"
32a40 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
32a50 26 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69  &sqlite3_open_fi
32a60 6c 65 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  le_count, TCL_LI
32a70 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
32a80 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32a90 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74  sqlite_current_t
32aa0 69 6d 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68  ime", .      (ch
32ab0 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 63 75 72  ar*)&sqlite3_cur
32ac0 72 65 6e 74 5f 74 69 6d 65 2c 20 54 43 4c 5f 4c  rent_time, TCL_L
32ad0 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 53 51  INK_INT);.#if SQ
32ae0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
32af0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32b00 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
32b10 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32b20 45 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  E.  Tcl_LinkVar(
32b30 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
32b40 68 6f 73 74 69 64 5f 6e 75 6d 22 2c 20 0a 20 20  hostid_num", .  
32b50 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
32b60 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 2c 20  te3_hostid_num, 
32b70 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
32b80 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b  endif.  Tcl_Link
32b90 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
32ba0 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75  ite3_xferopt_cou
32bb0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
32bc0 2a 29 26 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  *)&sqlite3_xfero
32bd0 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  pt_count, TCL_LI
32be0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
32bf0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
32c00 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
32c10 61 64 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  addb_count",.   
32c20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
32c30 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
32c40 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
32c50 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
32c60 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
32c70 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
32c80 64 62 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  db_count",.     
32c90 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
32ca0 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
32cb0 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
32cc0 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
32cd0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
32ce0 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
32cf0 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28  _count",.      (
32d00 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70  char*)&sqlite3_p
32d10 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
32d20 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
32d30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
32d40 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
32d50 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
32d60 2c 20 22 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  , "unaligned_str
32d70 69 6e 67 5f 63 6f 75 6e 74 65 72 22 2c 0a 20 20  ing_counter",.  
32d80 20 20 20 20 28 63 68 61 72 2a 29 26 75 6e 61 6c      (char*)&unal
32d90 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75  igned_string_cou
32da0 6e 74 65 72 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  nter, TCL_LINK_I
32db0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  NT);.#endif.#ifn
32dc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32dd0 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b  UTF16.  Tcl_Link
32de0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
32df0 69 74 65 5f 6c 61 73 74 5f 6e 65 65 64 65 64 5f  ite_last_needed_
32e00 63 6f 6c 6c 61 74 69 6f 6e 22 2c 0a 20 20 20 20  collation",.    
32e10 20 20 28 63 68 61 72 2a 29 26 70 7a 4e 65 65 64    (char*)&pzNeed
32e20 65 64 43 6f 6c 6c 61 74 69 6f 6e 2c 20 54 43 4c  edCollation, TCL
32e30 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43 4c  _LINK_STRING|TCL
32e40 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29  _LINK_READ_ONLY)
32e50 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
32e60 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 54 63 6c  ITE_OS_WIN.  Tcl
32e70 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
32e80 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74 79 70 65   "sqlite_os_type
32e90 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
32ea0 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
32eb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29  , TCL_LINK_LONG)
32ec0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
32ed0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b 0a  SQLITE_TEST.  {.
32ee0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
32ef0 20 63 68 61 72 20 2a 71 75 65 72 79 5f 70 6c 61   char *query_pla
32f00 6e 20 3d 20 22 2a 2a 2a 20 4f 42 53 4f 4c 45 54  n = "*** OBSOLET
32f10 45 20 56 41 52 49 41 42 4c 45 20 2a 2a 2a 22 3b  E VARIABLE ***";
32f20 0a 20 20 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  .    Tcl_LinkVar
32f30 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
32f40 5f 71 75 65 72 79 5f 70 6c 61 6e 22 2c 0a 20 20  _query_plan",.  
32f50 20 20 20 20 20 28 63 68 61 72 2a 29 26 71 75 65       (char*)&que
32f60 72 79 5f 70 6c 61 6e 2c 20 54 43 4c 5f 4c 49 4e  ry_plan, TCL_LIN
32f70 4b 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e  K_STRING|TCL_LIN
32f80 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20  K_READ_ONLY);.  
32f90 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
32fa0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 54  SQLITE_DEBUG.  T
32fb0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
32fc0 70 2c 20 22 73 71 6c 69 74 65 5f 77 68 65 72 65  p, "sqlite_where
32fd0 5f 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28  _trace",.      (
32fe0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 57 68  char*)&sqlite3Wh
32ff0 65 72 65 54 72 61 63 65 2c 20 54 43 4c 5f 4c 49  ereTrace, TCL_LI
33000 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
33010 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
33020 73 71 6c 69 74 65 5f 6f 73 5f 74 72 61 63 65 22  sqlite_os_trace"
33030 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
33040 73 71 6c 69 74 65 33 4f 53 54 72 61 63 65 2c 20  sqlite3OSTrace, 
33050 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
33060 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33070 49 54 5f 57 41 4c 0a 20 20 54 63 6c 5f 4c 69 6e  IT_WAL.  Tcl_Lin
33080 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
33090 6c 69 74 65 5f 77 61 6c 5f 74 72 61 63 65 22 2c  lite_wal_trace",
330a0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
330b0 71 6c 69 74 65 33 57 61 6c 54 72 61 63 65 2c 20  qlite3WalTrace, 
330c0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
330d0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
330e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
330f0 5f 44 49 53 4b 49 4f 0a 20 20 54 63 6c 5f 4c 69  _DISKIO.  Tcl_Li
33100 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
33110 71 6c 69 74 65 5f 6f 70 65 6e 74 65 6d 70 5f 63  qlite_opentemp_c
33120 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68  ount",.      (ch
33130 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70 65  ar*)&sqlite3_ope
33140 6e 74 65 6d 70 5f 63 6f 75 6e 74 2c 20 54 43 4c  ntemp_count, TCL
33150 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
33160 69 66 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  if.  Tcl_LinkVar
33170 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
33180 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
33190 75 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  ue",.      (char
331a0 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69 63  *)&sqlite_static
331b0 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 54 43 4c  _bind_value, TCL
331c0 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
331d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
331e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61  erp, "sqlite_sta
331f0 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 22 2c  tic_bind_nbyte",
33200 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
33210 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
33220 64 5f 6e 62 79 74 65 2c 20 54 43 4c 5f 4c 49 4e  d_nbyte, TCL_LIN
33230 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
33240 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
33250 71 6c 69 74 65 5f 74 65 6d 70 5f 64 69 72 65 63  qlite_temp_direc
33260 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28 63 68  tory",.      (ch
33270 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 74 65 6d  ar*)&sqlite3_tem
33280 70 5f 64 69 72 65 63 74 6f 72 79 2c 20 54 43 4c  p_directory, TCL
33290 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20  _LINK_STRING);. 
332a0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
332b0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 64 61 74  erp, "sqlite_dat
332c0 61 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20  a_directory",.  
332d0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
332e0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
332f0 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  ry, TCL_LINK_STR
33300 49 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ING);.  Tcl_Link
33310 56 61 72 28 69 6e 74 65 72 70 2c 20 22 62 69 74  Var(interp, "bit
33320 6d 61 73 6b 5f 73 69 7a 65 22 2c 0a 20 20 20 20  mask_size",.    
33330 20 20 28 63 68 61 72 2a 29 26 62 69 74 6d 61 73    (char*)&bitmas
33340 6b 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  k_size, TCL_LINK
33350 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
33360 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
33370 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
33380 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  "sqlite_sync_cou
33390 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
333a0 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  *)&sqlite3_sync_
333b0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
333c0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
333d0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
333e0 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
333f0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
33400 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  *)&sqlite3_fulls
33410 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
33420 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65  INK_INT);.#if de
33430 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
33440 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66  BLE_FTS3) && def
33450 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
33460 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ).  Tcl_LinkVar(
33470 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
33480 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
33490 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20  ntheses",.      
334a0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
334b0 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
334c0 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e  ntheses, TCL_LIN
334d0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
334e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
334f0 7d 0a                                            }.