/ Hex Artifact Content
Login

Artifact 33e6b76796736fc16cc809dbb25c955318753c05:


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 20 2a 2a 20 55 73  OK;.}../*. ** Us
18310 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63  age:   sqlite3_c
18320 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54  lear_bindings ST
18330 4d 54 0a 20 2a 2a 0a 20 2a 2f 0a 73 74 61 74 69  MT. **. */.stati
18340 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72  c int test_clear
18350 5f 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c 28 0a  _bindings_null(.
18360 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18370 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18380 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18390 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
183a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
183b0 7b 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  {  .  if( objc!=
183c0 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
183d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
183e0 20 2f 2a 20 74 65 73 74 20 66 6f 72 20 68 61 6e   /* test for han
183f0 64 6c 69 6e 67 20 4e 55 4c 4c 20 3c 72 64 61 72  dling NULL <rdar
18400 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 36 34 36 33  ://problem/66463
18410 33 31 3e 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  31> */.  Tcl_Set
18420 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
18430 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
18440 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
18450 6e 64 69 6e 67 73 28 30 29 29 29 3b 0a 20 20 72  ndings(0)));.  r
18460 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18470 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18480 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49  sqlite3_sleep MI
18490 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74  LLISECONDS.*/.st
184a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c  atic int test_sl
184b0 65 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  eep(.  void * cl
184c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
184d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
184e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
184f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18500 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b  v[].){.  int ms;
18510 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18520 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
18530 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
18540 31 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53  1, objv, "MILLIS
18550 45 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65  ECONDS");.    re
18560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18570 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
18580 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
18590 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73  rp, objv[1], &ms
185a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
185b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
185c0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
185d0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
185e0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
185f0 73 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72  sleep(ms)));.  r
18600 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18610 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
18620 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
18630 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20  rrcode DB.**.** 
18640 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e  Return the strin
18650 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
18660 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
18670 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
18680 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e  I.** error code.
18690 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52   e.g. "SQLITE_ER
186a0 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ROR"..*/.static 
186b0 69 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63  int test_ex_errc
186c0 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ode(.  void * cl
186d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
186e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
186f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
18700 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
18710 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
18720 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
18730 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
18740 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
18750 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18760 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
18770 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
18780 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
18790 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
187a0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
187b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
187c0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
187d0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
187e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
187f0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
18800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18810 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74  rc = sqlite3_ext
18820 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62  ended_errcode(db
18830 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
18840 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
18850 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
18860 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
18870 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
18880 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18890 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a  ite3_errcode DB.
188a0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
188b0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
188c0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  tation of the mo
188d0 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
188e0 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72  3_* API.** error
188f0 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c   code. e.g. "SQL
18900 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73  ITE_ERROR"..*/.s
18910 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
18920 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
18930 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
18940 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
18950 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
18960 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
18970 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
18980 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
18990 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
189a0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
189b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
189c0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
189d0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
189e0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
189f0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
18a00 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
18a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18a20 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
18a30 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
18a40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
18a50 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
18a60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18a70 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18a80 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54  errcode(db);.  T
18a90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18aa0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
18ab0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
18ac0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
18ad0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
18ae0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
18af0 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20  errmsg DB.**.** 
18b00 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
18b10 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  8 representation
18b20 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
18b30 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
18b40 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
18b50 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
18b60 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  I call..*/.stati
18b70 63 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73  c int test_errms
18b80 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  g(.  void * clie
18b90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18ba0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18bb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18bc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18bd0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
18be0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
18bf0 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f   *zErr;..  if( o
18c00 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
18c10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18c20 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
18c30 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
18c40 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
18c50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18c60 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
18c70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18c80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
18c90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
18ca0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
18cb0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
18cc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18cd0 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
18ce0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
18cf0 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  b);.  Tcl_SetObj
18d00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18d10 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
18d20 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65  zErr, -1));.  re
18d30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18d40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74  /*.** Usage:   t
18d50 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a  est_errmsg16 DB.
18d60 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
18d70 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65  e UTF-16 represe
18d80 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65  ntation of the e
18d90 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
18da0 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d  ing for the.** m
18db0 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
18dc0 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54  e3_* API call. T
18dd0 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72  his is a byte ar
18de0 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68  ray object at th
18df0 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c  e TCL .** level,
18e00 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73   and it includes
18e10 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74   the 0x00 0x00 t
18e20 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20  erminator bytes 
18e30 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
18e40 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69  e.** UTF-16 stri
18e50 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
18e60 74 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28  t test_errmsg16(
18e70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
18e80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
18e90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
18ea0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
18eb0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
18ec0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
18ed0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
18ee0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
18ef0 6e 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a  nst void *zErr;.
18f00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
18f10 0a 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30  .  int bytes = 0
18f20 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18f30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18f40 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18f50 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18f60 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18f70 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18f80 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18f90 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
18fa0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18fb0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18fc0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18fd0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18fe0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18ff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19000 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  .  zErr = sqlite
19010 33 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a  3_errmsg16(db);.
19020 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
19030 20 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20    z = zErr;.    
19040 66 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62  for(bytes=0; z[b
19050 79 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73  ytes] || z[bytes
19060 2b 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d  +1]; bytes+=2){}
19070 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
19080 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
19090 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
190a0 4f 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29  Obj(zErr, bytes)
190b0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
190c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
190d0 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
190e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
190f0 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
19100 72 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  re DB sql bytes 
19110 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
19120 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
19130 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
19140 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
19150 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
19160 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
19170 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
19180 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
19190 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
191a0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
191b0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
191c0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
191d0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
191e0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
191f0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
19200 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19210 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
19220 65 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20  epare(.  void * 
19230 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19240 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19250 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19260 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19270 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19280 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19290 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
192a0 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
192b0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
192c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
192d0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
192e0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
192f0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
19300 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
19310 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
19320 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19330 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19340 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19350 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19360 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19370 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
19380 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
19390 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
193a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
193b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
193c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
193d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
193e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
193f0 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
19400 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19410 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
19420 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
19430 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
19440 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
19450 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
19460 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
19470 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74  re(db, zSql, byt
19480 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63  es, &pStmt, objc
19490 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30  >=5 ? &zTail : 0
194a0 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
194b0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
194c0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
194d0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
194e0 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
194f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
19500 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d   zTail && objc>=
19510 35 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74  5 ){.    if( byt
19520 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62  es>=0 ){.      b
19530 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28  ytes = bytes - (
19540 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29  int)(zTail-zSql)
19550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19560 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69  (int)strlen(zTai
19570 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20  l)<bytes ){.    
19580 20 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73    bytes = (int)s
19590 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20  trlen(zTail);.  
195a0 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53    }.    Tcl_ObjS
195b0 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f  etVar2(interp, o
195c0 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e  bjv[4], 0, Tcl_N
195d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69  ewStringObj(zTai
195e0 6c 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20  l, bytes), 0);. 
195f0 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
19600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
19610 73 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29  sert( pStmt==0 )
19620 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
19630 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
19640 75 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29  uf), zBuf, "(%d)
19650 20 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c   ", rc);.    Tcl
19660 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19670 74 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69  terp, zBuf, sqli
19680 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
19690 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
196a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
196b0 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
196c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
196d0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
196e0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
196f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19700 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
19710 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19720 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
19730 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
19740 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
19750 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
19760 70 61 72 65 5f 76 32 20 44 42 20 73 71 6c 20 62  pare_v2 DB sql b
19770 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
19780 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
19790 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
197a0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
197b0 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
197c0 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
197d0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
197e0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
197f0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
19800 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
19810 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
19820 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
19830 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
19840 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
19850 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
19860 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
19870 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
19880 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a 20  st_prepare_v2(. 
19890 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
198a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
198b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
198c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
198d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
198e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
198f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
19900 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  ql;.  char *zCop
19910 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
19920 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28        /* malloc(
19930 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20 2a  ) copy of zSql *
19940 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  /.  int bytes;. 
19950 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
19960 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
19970 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
19980 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
19990 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
199a0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
199b0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
199c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
199d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
199e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
199f0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
19a00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
19a10 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
19a20 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
19a30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19a40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
19a50 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
19a60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
19a70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
19a80 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
19a90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
19aa0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
19ab0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
19ac0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
19ad0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
19ae0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
19af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
19b00 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f 66 20    /* Instead of 
19b10 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72 65 63  using zSql direc
19b20 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f 70 79  tly, make a copy
19b30 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20 6f   into a buffer o
19b40 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64 69 72  btained.  ** dir
19b50 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ectly from mallo
19b60 63 28 29 2e 20 54 68 65 20 69 64 65 61 20 69 73  c(). The idea is
19b70 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69   to make it easi
19b80 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e 64 0a  er for valgrind.
19b90 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62 75 66    ** to spot buf
19ba0 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e 20 20  fer overreads.  
19bb0 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73 3e 3d  */.  if( bytes>=
19bc0 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79 20 3d  0 ){.    zCopy =
19bd0 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b 0a   malloc(bytes);.
19be0 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79      memcpy(zCopy
19bf0 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29 3b 0a  , zSql, bytes);.
19c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
19c10 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
19c20 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20 20 20  (zSql) + 1;.    
19c30 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e  zCopy = malloc(n
19c40 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43  );.    memcpy(zC
19c50 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b 0a 20  opy, zSql, n);. 
19c60 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
19c70 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
19c80 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c 20 26   zCopy, bytes, &
19c90 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f  pStmt, objc>=5 ?
19ca0 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20   &zTail : 0);.  
19cb0 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7a  free(zCopy);.  z
19cc0 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54  Tail = &zSql[(zT
19cd0 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a  ail - zCopy)];..
19ce0 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
19cf0 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
19d00 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74  =0);.  Tcl_Reset
19d10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
19d20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
19d30 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
19d40 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
19d50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19d70 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a   && zTail && obj
19d80 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
19d90 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
19da0 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
19db0 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53  - (int)(zTail-zS
19dc0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ql);.    }.    T
19dd0 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
19de0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
19df0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
19e00 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29  bj(zTail, bytes)
19e10 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
19e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
19e40 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  mt==0 );.    sql
19e50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
19e60 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
19e70 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a  , "(%d) ", rc);.
19e80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19e90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19ea0 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  f, sqlite3_errms
19eb0 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
19ec0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19ed0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
19ee0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
19ef0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
19f00 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
19f10 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
19f20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19f30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19f40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
19f50 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  f, 0);.  }.  ret
19f60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19f70 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
19f80 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
19f90 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e  134 DB.**.** Gen
19fa0 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64  erate a prepared
19fb0 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
19fc0 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e   zero-byte strin
19fd0 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66  g as a test.** f
19fe0 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e  or ticket #3134.
19ff0 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f    The string sho
1a000 75 6c 64 20 62 65 20 70 72 65 63 65 64 65 64 20  uld be preceded 
1a010 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a  by a zero byte..
1a020 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1a030 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
1a040 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  34(.  void * cli
1a050 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a060 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a070 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a080 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a090 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1a0a0 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  *db;.  static co
1a0b0 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20  nst char zSql[] 
1a0c0 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22  = "\000SELECT 1"
1a0d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1a0e0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1a0f0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
1a100 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
1a110 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1a120 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a130 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1a140 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1a150 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1a160 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a170 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1a180 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
1a190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a1a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1a1b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1a1c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a1d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a1e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1a1f0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1a200 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1a210 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20  2(db, &zSql[1], 
1a220 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  0, &pStmt, 0);. 
1a230 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1a240 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
1a250 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1a260 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1a270 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1a280 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a290 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1a2a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1a2b0 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  rt( pStmt==0 );.
1a2c0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1a2d0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1a2e0 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
1a2f0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
1a300 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a310 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
1a320 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
1a330 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1a340 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1a350 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
1a360 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1a370 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1a380 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
1a390 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a3a0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41  ERROR;.    Tcl_A
1a3b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1a3c0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1a3d0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1a3e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a3f0 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  e: sqlite3_prepa
1a400 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65  re16 DB sql byte
1a410 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20  s tailvar.**.** 
1a420 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
1a430 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
1a440 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
1a450 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
1a460 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
1a470 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
1a480 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
1a490 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
1a4a0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
1a4b0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
1a4c0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
1a4d0 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
1a4e0 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
1a4f0 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
1a500 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1a510 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72  atic int test_pr
1a520 65 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20  epare16(.  void 
1a530 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1a540 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a550 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1a560 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1a570 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
1a580 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
1a590 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
1a5a0 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db;.  const void
1a5b0 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20   *zSql;.  const 
1a5c0 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  void *zTail = 0;
1a5d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69  .  Tcl_Obj *pTai
1a5e0 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
1a5f0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1a600 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1a610 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ]; .  int rc;.  
1a620 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20  int bytes;      
1a630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a640 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69   integer specifi
1a650 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20  ed as arg 3 */. 
1a660 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20   int objlen;    
1a670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a680 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e  e byte-array len
1a690 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a  gth of arg 2 */.
1a6a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1a6b0 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1a6c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a6d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a6e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a6f0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1a700 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a710 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1a720 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1a730 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1a740 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a750 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1a760 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1a770 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1a780 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1a790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1a7a0 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74  Sql = Tcl_GetByt
1a7b0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
1a7c0 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b  jv[2], &objlen);
1a7d0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1a7e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1a7f0 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73   objv[3], &bytes
1a800 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a810 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1a820 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28  lite3_prepare16(
1a830 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
1a840 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35   &pStmt, objc>=5
1a850 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a   ? &zTail : 0);.
1a860 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a870 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
1a880 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
1a890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1a8a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1a8b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a8c0 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d   }..  if( objc>=
1a8d0 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61  5 ){.    if( zTa
1a8e0 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c  il ){.      objl
1a8f0 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69  en = objlen - (i
1a900 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d  nt)((u8 *)zTail-
1a910 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20  (u8 *)zSql);.   
1a920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62   }else{.      ob
1a930 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  jlen = 0;.    }.
1a940 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f      pTail = Tcl_
1a950 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1a960 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a  (u8 *)zTail, obj
1a970 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  len);.    Tcl_In
1a980 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c  crRefCount(pTail
1a990 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65  );.    Tcl_ObjSe
1a9a0 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
1a9b0 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c  jv[4], 0, pTail,
1a9c0 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63   0);.    Tcl_Dec
1a9d0 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1a9e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1a9f0 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1aa00 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1aa10 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1aa20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1aa30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1aa40 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e  .  }.  Tcl_Appen
1aa50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1aa60 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66  zBuf, 0);.#endif
1aa70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1aa80 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1aa90 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1aaa0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1aab0 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44  3_prepare16_v2 D
1aac0 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1aad0 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  lvar?.**.** Comp
1aae0 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
1aaf0 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
1ab00 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
1ab10 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
1ab20 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1ab30 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
1ab40 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
1ab50 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
1ab60 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
1ab70 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
1ab80 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
1ab90 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
1aba0 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
1abb0 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
1abc0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1abd0 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61 72   int test_prepar
1abe0 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  e16_v2(.  void *
1abf0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ac00 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1ac10 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1ac20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ac30 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1ac40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1ac50 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1ac60 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1ac70 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1ac80 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1ac90 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1aca0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1acb0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1acc0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1acd0 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1ace0 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1acf0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1ad00 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1ad10 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1ad20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1ad30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad40 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1ad50 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1ad60 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1ad70 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1ad80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ad90 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ada0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1adb0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1adc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1add0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1ade0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1adf0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ae00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1ae10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1ae20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1ae30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1ae40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1ae50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1ae60 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1ae70 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1ae80 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1ae90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1aea0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1aeb0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1aec0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1aed0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1aee0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
1aef0 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  2(db, zSql, byte
1af00 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
1af10 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
1af20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1af30 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1af40 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1af50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1af60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
1af70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1af80 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63  .  }..  if( objc
1af90 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 7a  >=5 ){.    if( z
1afa0 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62  Tail ){.      ob
1afb0 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20  jlen = objlen - 
1afc0 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54 61 69  (int)((u8 *)zTai
1afd0 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20  l-(u8 *)zSql);. 
1afe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1aff0 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  objlen = 0;.    
1b000 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20 54 63  }.    pTail = Tc
1b010 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1b020 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f  j((u8 *)zTail, o
1b030 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  bjlen);.    Tcl_
1b040 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61  IncrRefCount(pTa
1b050 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  il);.    Tcl_Obj
1b060 53 65 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20  SetVar2(interp, 
1b070 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69  objv[4], 0, pTai
1b080 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44  l, 0);.    Tcl_D
1b090 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69  ecrRefCount(pTai
1b0a0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  l);.  }..  if( p
1b0b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1b0c0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1b0d0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1b0e0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1b0f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b100 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  R;.  }.  Tcl_App
1b110 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b120 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1b130 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b140 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1b150 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b160 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1b170 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d  te3_open filenam
1b180 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f  e ?options-list?
1b190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1b1a0 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
1b1b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b1c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b1d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b1e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b1f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1b200 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1b210 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
1b220 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
1b230 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
1b240 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=3 && objc!=2 
1b250 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  && objc!=1 ){.  
1b260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b270 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1b280 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1b290 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1b2a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b2b0 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e  bjv[0]), " filen
1b2c0 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  ame options-list
1b2d0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1b2e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b2f0 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ..  zFilename = 
1b300 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74  objc>1 ? Tcl_Get
1b310 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20  String(objv[1]) 
1b320 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f  : 0;.  sqlite3_o
1b330 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  pen(zFilename, &
1b340 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
1b350 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1b360 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1b370 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1b380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b390 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b3a0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1b3b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1b3c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1b3d0 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1b3e0 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41  _v2 FILENAME FLA
1b3f0 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63  GS VFS.*/.static
1b400 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 5f 76   int test_open_v
1b410 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
1b420 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b430 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b440 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b450 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b460 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
1b470 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1b480 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
1b490 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
1b4a0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
1b4b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
1b4c0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20  ar zBuf[100];.. 
1b4d0 20 69 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63   int nFlag;.  Tc
1b4e0 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a  l_Obj **apFlag;.
1b4f0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1b500 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
1b510 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b520 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b530 20 22 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53   "FILENAME FLAGS
1b540 20 56 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75   VFS");.    retu
1b550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b560 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
1b570 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1b580 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d  jv[1]);.  zVfs =
1b590 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b5a0 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a  bjv[3]);.  if( z
1b5b0 56 66 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a  Vfs[0]==0x00 ) z
1b5c0 56 66 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d  Vfs = 0;..  rc =
1b5d0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45   Tcl_ListObjGetE
1b5e0 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
1b5f0 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c  objv[2], &nFlag,
1b600 20 26 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28   &apFlag);.  if(
1b610 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
1b620 74 75 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69  turn rc;.  for(i
1b630 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b  =0; i<nFlag; i++
1b640 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67  ){.    int iFlag
1b650 3b 0a 20 20 20 20 73 74 72 75 63 74 20 4f 70 65  ;.    struct Ope
1b660 6e 46 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f  nFlag {.      co
1b670 6e 73 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b  nst char *zFlag;
1b680 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b  .      int flag;
1b690 0a 20 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d  .    } aFlag[] =
1b6a0 20 7b 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49   {.      { "SQLI
1b6b0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1b6c0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
1b6d0 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20  EADONLY },.     
1b6e0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b6f0 52 45 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49  READWRITE", SQLI
1b700 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1b710 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b720 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1b730 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  ", SQLITE_OPEN_C
1b740 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b  REATE },.      {
1b750 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45   "SQLITE_OPEN_DE
1b760 4c 45 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51  LETEONCLOSE", SQ
1b770 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1b780 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20  ONCLOSE },.     
1b790 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b7a0 45 58 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49  EXCLUSIVE", SQLI
1b7b0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1b7c0 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  E },.      { "SQ
1b7d0 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
1b7e0 4f 58 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  OXY", SQLITE_OPE
1b7f0 4e 5f 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20  N_AUTOPROXY },. 
1b800 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1b810 50 45 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51  PEN_MAIN_DB", SQ
1b820 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1b830 42 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  B },.      { "SQ
1b840 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1b850 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1b860 54 45 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20  TEMP_DB },.     
1b870 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b880 54 52 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53  TRANSIENT_DB", S
1b890 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1b8a0 49 45 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20  IENT_DB },.     
1b8b0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b8c0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53  MAIN_JOURNAL", S
1b8d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1b8e0 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20  JOURNAL },.     
1b8f0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b900 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53  TEMP_JOURNAL", S
1b910 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1b920 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20  JOURNAL },.     
1b930 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b940 53 55 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c  SUBJOURNAL", SQL
1b950 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1b960 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  NAL },.      { "
1b970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1b980 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c  ER_JOURNAL", SQL
1b990 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
1b9a0 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20  JOURNAL },.     
1b9b0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1b9c0 4e 4f 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45  NOMUTEX", SQLITE
1b9d0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c  _OPEN_NOMUTEX },
1b9e0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1b9f0 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22  _OPEN_FULLMUTEX"
1ba00 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  , SQLITE_OPEN_FU
1ba10 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20  LLMUTEX },.     
1ba20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ba30 53 48 41 52 45 44 43 41 43 48 45 22 2c 20 53 51  SHAREDCACHE", SQ
1ba40 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
1ba50 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b  CACHE },.      {
1ba60 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52   "SQLITE_OPEN_PR
1ba70 49 56 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c  IVATECACHE", SQL
1ba80 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
1ba90 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b  CACHE },.      {
1baa0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   "SQLITE_OPEN_WA
1bab0 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1bac0 57 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  WAL },.      { "
1bad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22  SQLITE_OPEN_URI"
1bae0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  , SQLITE_OPEN_UR
1baf0 49 20 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20  I },.      { 0, 
1bb00 30 20 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72  0 }.    };.    r
1bb10 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78  c = Tcl_GetIndex
1bb20 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e  FromObjStruct(in
1bb30 74 65 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c  terp, apFlag[i],
1bb40 20 61 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61   aFlag, sizeof(a
1bb50 46 6c 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20  Flag[0]), .     
1bb60 20 20 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69     "flag", 0, &i
1bb70 46 6c 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20  Flag.    );.    
1bb80 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29  if( rc!=TCL_OK )
1bb90 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1bba0 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69  flags |= aFlag[i
1bbb0 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a  Flag].flag;.  }.
1bbc0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1bbd0 6f 70 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d  open_v2(zFilenam
1bbe0 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a  e, &db, flags, z
1bbf0 56 66 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Vfs);.  if( sqli
1bc00 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1bc10 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1bc20 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
1bc30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1bc40 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1bc50 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1bc60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bc80 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  : sqlite3_open16
1bc90 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1bca0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
1bcb0 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20 20 76  test_open16(.  v
1bcc0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1bcd0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1bce0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1bcf0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1bd00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1bd10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bd20 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e 73 74  IT_UTF16.  const
1bd30 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65   void *zFilename
1bd40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
1bd50 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1bd60 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
1bd70 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1bd80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bd90 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1bda0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1bdb0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1bdc0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1bdd0 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
1bde0 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
1bdf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1be00 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
1be10 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 42 79  name = Tcl_GetBy
1be20 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1be30 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 73 71  bjv[1], 0);.  sq
1be40 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a 46 69  lite3_open16(zFi
1be50 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1be60 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1be70 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1be80 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1be90 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1bea0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1beb0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1bec0 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64  , zBuf, 0);.#end
1bed0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1bee0 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1bef0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1bf00 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1bf10 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 20 3c  te3_complete16 <
1bf20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e 0a 2a  UTF-16 string>.*
1bf30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1bf40 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 61 72   the supplied ar
1bf50 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f 6d 70  gument is a comp
1bf60 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
1bf70 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f  nt, or zero.** o
1bf80 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1bf90 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6d  tic int test_com
1bfa0 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
1bfb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bfc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bfd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bfe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bff0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21   objv[].){.#if !
1c000 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1c010 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26  MIT_COMPLETE) &&
1c020 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1c030 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63  _OMIT_UTF16).  c
1c040 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
1c050 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1c060 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1c070 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1c080 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
1c090 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1c0a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c0b0 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54   zBuf = (char*)T
1c0c0 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1c0d0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
1c0e0 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
1c0f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1c100 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1c110 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
1c120 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20  zBuf)));.#endif 
1c130 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
1c140 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54  OMPLETE && SQLIT
1c150 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1c160 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c180 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54   sqlite3_step ST
1c190 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
1c1a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1c1b0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
1c1c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1c1d0 73 74 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20  st_step(.  void 
1c1e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c1f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c200 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c210 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c220 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c230 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c240 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1c250 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1c260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c270 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c280 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c290 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1c2a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c2b0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22  bjv[0]), " STMT"
1c2c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c2d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c2e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1c2f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c300 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c310 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1c320 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c330 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1c340 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20  _step(pStmt);.. 
1c350 20 2f 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49   /* if( rc!=SQLI
1c360 54 45 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53  TE_DONE && rc!=S
1c370 51 4c 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75  QLITE_ROW ) retu
1c380 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f  rn TCL_ERROR; */
1c390 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
1c3a0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1c3b0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1c3c0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1c3d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
1c3e0 20 69 6e 74 20 74 65 73 74 5f 73 71 6c 28 0a 20   int test_sql(. 
1c3f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1c400 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1c410 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1c420 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1c430 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1c440 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1c450 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1c460 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c470 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1c480 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1c490 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1c4a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c4b0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c4c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c4d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c4e0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c4f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c500 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
1c510 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1c520 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71 6c  ar *)sqlite3_sql
1c530 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c  (pStmt), TCL_VOL
1c540 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72 6e  ATILE);.  return
1c550 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c560 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c570 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
1c580 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
1c590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1c5a0 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
1c5b0 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
1c5c0 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
1c5d0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1c5e0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  lumn_count(.  vo
1c5f0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c600 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c610 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c620 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c630 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c640 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c650 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1c660 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1c670 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c680 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c690 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c6a0 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c6b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c6c0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1c6d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c6e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c6f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1c700 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1c710 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c720 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1c730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c740 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1c750 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1c760 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1c770 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
1c780 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74  (pStmt)));.  ret
1c790 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c7a0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c7b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20  te3_column_type 
1c7c0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
1c7d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 79 70  * Return the typ
1c7e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e  e of the data in
1c7f0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1c800 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c810 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1c820 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74  nt test_column_t
1c830 79 70 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ype(.  void * cl
1c840 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c850 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c860 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c870 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c880 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c890 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1c8a0 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 74  int col;.  int t
1c8b0 70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  p;..  if( objc!=
1c8c0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
1c8d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c8e0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c8f0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c900 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c910 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c920 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
1c930 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c940 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1c950 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1c960 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c970 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c980 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
1c990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1c9a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1c9b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c9c0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
1c9d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c9e0 52 3b 0a 0a 20 20 74 70 20 3d 20 73 71 6c 69 74  R;..  tp = sqlit
1c9f0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 70  e3_column_type(p
1ca00 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 73 77  Stmt, col);.  sw
1ca10 69 74 63 68 28 20 74 70 20 29 7b 0a 20 20 20 20  itch( tp ){.    
1ca20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
1ca30 47 45 52 3a 20 0a 20 20 20 20 20 20 54 63 6c 5f  GER: .      Tcl_
1ca40 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1ca50 2c 20 22 49 4e 54 45 47 45 52 22 2c 20 54 43 4c  , "INTEGER", TCL
1ca60 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
1ca70 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1ca80 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20   SQLITE_NULL:.  
1ca90 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
1caa0 74 28 69 6e 74 65 72 70 2c 20 22 4e 55 4c 4c 22  t(interp, "NULL"
1cab0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1cac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1cad0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
1cae0 41 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  AT:.      Tcl_Se
1caf0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1cb00 22 46 4c 4f 41 54 22 2c 20 54 43 4c 5f 53 54 41  "FLOAT", TCL_STA
1cb10 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1cb20 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1cb30 49 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20  ITE_TEXT:.      
1cb40 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1cb50 74 65 72 70 2c 20 22 54 45 58 54 22 2c 20 54 43  terp, "TEXT", TC
1cb60 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1cb70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1cb80 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20  e SQLITE_BLOB:. 
1cb90 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1cba0 6c 74 28 69 6e 74 65 72 70 2c 20 22 42 4c 4f 42  lt(interp, "BLOB
1cbb0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1cbc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1cbd0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1cbe0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a   assert(0);.  }.
1cbf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cc00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cc10 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1cc20 5f 69 6e 74 36 34 20 53 54 4d 54 20 63 6f 6c 75  _int64 STMT colu
1cc30 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
1cc40 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
1cc50 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
1cc60 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
1cc70 61 73 74 20 61 73 20 61 6e 0a 2a 2a 20 77 69 64  ast as an.** wid
1cc80 65 20 28 36 34 2d 62 69 74 29 20 69 6e 74 65 67  e (64-bit) integ
1cc90 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
1cca0 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e  t test_column_in
1ccb0 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
1ccc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ccd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cce0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1ccf0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cd00 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1cd10 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1cd20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36 34 20 69  int col;.  i64 i
1cd30 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1cd40 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1cd50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1cd60 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1cd70 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1cd80 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1cd90 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1cda0 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1cdb0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1cdc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1cdd0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1cde0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cdf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ce00 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1ce10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ce20 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1ce30 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1ce40 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1ce50 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ce60 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20 3d 20 73  ROR;..  iVal = s
1ce70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
1ce80 74 36 34 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  t64(pStmt, col);
1ce90 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1cea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1ceb0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 69 56  NewWideIntObj(iV
1cec0 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1ced0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1cee0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1cef0 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54 4d 54 20  olumn_blob STMT 
1cf00 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1cf10 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e   int test_column
1cf20 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
1cf30 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cf40 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cf50 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cf60 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1cf70 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1cf80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1cf90 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69 6e    int col;..  in
1cfa0 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20 76  t len;.  const v
1cfb0 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20 69  oid *pBlob;..  i
1cfc0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
1cfd0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1cfe0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1cff0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1d000 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1d010 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d020 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
1d030 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
1d040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d050 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1d060 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1d070 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1d080 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1d090 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1d0a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1d0b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1d0c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d0d0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
1d0e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 6c   TCL_ERROR;..  l
1d0f0 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  en = sqlite3_col
1d100 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
1d110 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20 3d   col);.  pBlob =
1d120 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d130 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c 29  blob(pStmt, col)
1d140 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d150 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d160 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1d170 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a 20  (pBlob, len));. 
1d180 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1d190 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1d1a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d1b0 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ouble STMT colum
1d1c0 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1d1d0 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d  he data in colum
1d1e0 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68  n 'column' of th
1d1f0 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63 61  e current row ca
1d200 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e 0a  st as a double..
1d210 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1d220 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  st_column_double
1d230 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1d240 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1d250 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1d260 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1d270 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1d280 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1d290 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d2a0 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72   col;.  double r
1d2b0 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Val;..  if( objc
1d2c0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d2d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d2e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d2f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d300 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d310 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d320 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d330 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d350 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d360 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d370 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d380 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d390 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d3a0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1d3b0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1d3c0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1d3d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d3e0 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73  ROR;..  rVal = s
1d3f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
1d400 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  uble(pStmt, col)
1d410 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1d420 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1d430 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56  _NewDoubleObj(rV
1d440 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  al));.  return T
1d450 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1d460 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
1d470 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a  ata_count STMT .
1d480 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
1d490 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
1d4a0 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ns returned by t
1d4b0 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74  he sql statement
1d4c0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
1d4d0 20 69 6e 74 20 74 65 73 74 5f 64 61 74 61 5f 63   int test_data_c
1d4e0 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  ount(.  void * c
1d4f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1d500 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1d510 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1d520 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1d530 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1d540 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
1d550 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1d560 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d570 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1d580 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1d590 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1d5a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1d5b0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1d5c0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1d5d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d5e0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1d5f0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1d600 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1d610 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1d620 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1d630 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54   TCL_ERROR;..  T
1d640 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1d650 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1d660 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61  ntObj(sqlite3_da
1d670 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29  ta_count(pStmt))
1d680 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1d690 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1d6a0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d6b0 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1d6c0 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d6d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d6e0 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1d6f0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1d700 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d710 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1d720 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1d730 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a  test_stmt_utf8(.
1d740 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d750 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ata,        /* P
1d760 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65  ointer to SQLite
1d770 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f   API function to
1d780 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20   be invoke */.  
1d790 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1d7a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1d7b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1d7c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1d7d0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1d7e0 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63  ;.  int col;.  c
1d7f0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46 75  onst char *(*xFu
1d800 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1d810 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74  *, int);.  const
1d820 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
1d830 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63  xFunc = (const c
1d840 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  har *(*)(sqlite3
1d850 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1d860 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1d870 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d880 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d890 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d8a0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d8b0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d8c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d8d0 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d8e0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d8f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d900 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d910 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d920 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d930 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d940 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d950 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d960 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d970 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d980 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d990 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d  _ERROR;.  zRet =
1d9a0 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1d9b0 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20 29  l);.  if( zRet )
1d9c0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
1d9d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1d9e0 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20  r *)zRet, 0);.  
1d9f0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1da00 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
1da10 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
1da20 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
1da30 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1da40 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1da50 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1da60 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1da70 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1da80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
1da90 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
1daa0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
1dab0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1dac0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1dad0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
1dae0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1daf0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
1db00 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
1db10 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
1db20 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1db30 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1db40 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1db50 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
1db60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1db70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1db80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1db90 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
1dba0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1dbb0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
1dbc0 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
1dbd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1dbe0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
1dbf0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1dc00 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1dc10 74 6d 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69  tmt_utf16(.  voi
1dc20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
1dc30 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1dc40 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
1dc50 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
1dc60 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
1dc70 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1dc80 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1dc90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1dca0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1dcb0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1dcc0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1dcd0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1dce0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b    Tcl_Obj *pRet;
1dcf0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1dd00 4e 61 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20  Name16;.  const 
1dd10 76 6f 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73  void *(*xFunc)(s
1dd20 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1dd30 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1dd40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28  const void *(*)(
1dd50 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1dd60 6e 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt))clientData;.
1dd70 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1dd80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1dd90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1dda0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1ddb0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1ddc0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1ddd0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1dde0 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1ddf0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1de00 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1de10 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1de20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1de30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1de40 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1de50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1de60 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1de70 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1de80 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1de90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1dea0 20 20 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e    zName16 = xFun
1deb0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
1dec0 20 69 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a   if( zName16 ){.
1ded0 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63      int n;.    c
1dee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a  onst char *z = z
1def0 4e 61 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28  Name16;.    for(
1df00 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e  n=0; z[n] || z[n
1df10 2b 31 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20  +1]; n+=2){}.   
1df20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42   pRet = Tcl_NewB
1df30 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d  yteArrayObj(zNam
1df40 65 31 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54  e16, n+2);.    T
1df50 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1df60 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20  interp, pRet);. 
1df70 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
1df80 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1df90 2f 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  /..  return TCL_
1dfa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1dfb0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1dfc0 6d 6e 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75  mn_int STMT colu
1dfd0 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1dfe0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1dff0 79 74 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ytes STMT column
1e000 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
1e010 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
1e020 65 73 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  es16 STMT column
1e030 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
1e040 74 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 28  t test_stmt_int(
1e050 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e060 44 61 74 61 2c 20 20 20 20 2f 2a 20 50 6f 69 6e  Data,    /* Poin
1e070 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1e080 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1e090 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1e0a0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e0b0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1e0c0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1e0d0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1e0e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1e0f0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 6e 74    int col;.  int
1e100 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
1e110 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a  3_stmt*, int);..
1e120 20 20 78 46 75 6e 63 20 3d 20 28 69 6e 74 20 28    xFunc = (int (
1e130 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  *)(sqlite3_stmt*
1e140 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61 74  , int))clientDat
1e150 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  a;.  if( objc!=3
1e160 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1e170 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1e180 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1e190 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1e1a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1e1b0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1e1c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1e1d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e1e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e1f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1e200 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1e210 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1e220 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1e230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e240 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1e250 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1e260 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1e270 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e280 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1e290 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1e2a0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 46 75 6e  l_NewIntObj(xFun
1e2b0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 29 29 3b  c(pStmt, col)));
1e2c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1e2e0 3a 20 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61  :  sqlite_set_ma
1e2f0 67 69 63 20 20 44 42 20 20 4d 41 47 49 43 2d 4e  gic  DB  MAGIC-N
1e300 55 4d 42 45 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20  UMBER.**.** Set 
1e310 74 68 65 20 64 62 2d 3e 6d 61 67 69 63 20 76 61  the db->magic va
1e320 6c 75 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  lue.  This is us
1e330 65 64 20 74 6f 20 74 65 73 74 20 65 72 72 6f 72  ed to test error
1e340 20 72 65 63 6f 76 65 72 79 20 6c 6f 67 69 63 2e   recovery logic.
1e350 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1e360 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 28  qlite_set_magic(
1e370 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1e380 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1e390 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1e3a0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
1e3b0 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74  *argv.){.  sqlit
1e3c0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1e3d0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1e3e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e3f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e400 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e410 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
1e420 20 20 20 20 20 20 22 20 44 42 20 4d 41 47 49 43        " DB MAGIC
1e430 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1e440 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e450 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1e460 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1e470 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1e480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e490 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1e4a0 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1e4b0 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29 7b 0a 20  C_OPEN")==0 ){. 
1e4c0 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53     db->magic = S
1e4d0 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
1e4e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1e4f0 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
1e500 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
1e510 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  ED")==0 ){.    d
1e520 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
1e530 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a  E_MAGIC_CLOSED;.
1e540 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1e550 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1e560 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 22 29  ITE_MAGIC_BUSY")
1e570 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1e580 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1e590 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  GIC_BUSY;.  }els
1e5a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
1e5b0 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
1e5c0 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d 30 20 29  GIC_ERROR")==0 )
1e5d0 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
1e5e0 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
1e5f0 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
1e600 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
1e610 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 28 69  erp, argv[2], (i
1e620 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69 63 29 20  nt*)&db->magic) 
1e630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1e640 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1e650 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1e660 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
1e670 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
1e680 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54 72 69 67    DB .**.** Trig
1e690 67 65 72 20 61 6e 20 69 6e 74 65 72 72 75 70 74  ger an interrupt
1e6a0 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63   on DB.*/.static
1e6b0 20 69 6e 74 20 74 65 73 74 5f 69 6e 74 65 72 72   int test_interr
1e6c0 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  upt(.  void * cl
1e6d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e6e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e6f0 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
1e700 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73  ar **argv.){.  s
1e710 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
1e720 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1e730 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e740 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1e750 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1e760 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1e770 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
1e780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1e790 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1e7a0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1e7b0 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1e7c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e7d0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  R;.  sqlite3_int
1e7e0 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72 65  errupt(db);.  re
1e7f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e800 73 74 61 74 69 63 20 75 38 20 2a 73 71 6c 69 74  static u8 *sqlit
1e810 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
1e820 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 46 69  e = 0;../*.** Fi
1e830 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 77 69 74  ll the stack wit
1e840 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74 70 61 74  h a known bitpat
1e850 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tern..*/.static 
1e860 76 6f 69 64 20 70 72 65 70 53 74 61 63 6b 28 76  void prepStack(v
1e870 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  oid){.  int i;. 
1e880 20 75 33 32 20 62 69 67 42 75 66 5b 36 35 35 33   u32 bigBuf[6553
1e890 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  6];.  for(i=0; i
1e8a0 3c 73 69 7a 65 6f 66 28 62 69 67 42 75 66 29 2f  <sizeof(bigBuf)/
1e8b0 73 69 7a 65 6f 66 28 62 69 67 42 75 66 5b 30 5d  sizeof(bigBuf[0]
1e8c0 29 3b 20 69 2b 2b 29 20 62 69 67 42 75 66 5b 69  ); i++) bigBuf[i
1e8d0 5d 20 3d 20 30 78 64 65 61 64 62 65 65 66 3b 0a  ] = 0xdeadbeef;.
1e8e0 20 20 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f    sqlite3_stack_
1e8f0 62 61 73 65 6c 69 6e 65 20 3d 20 28 75 38 2a 29  baseline = (u8*)
1e900 26 62 69 67 42 75 66 5b 36 35 35 33 36 5d 3b 0a  &bigBuf[65536];.
1e910 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 74 68 65  }../*.** Get the
1e920 20 63 75 72 72 65 6e 74 20 73 74 61 63 6b 20 64   current stack d
1e930 65 70 74 68 2e 20 20 55 73 65 64 20 66 6f 72 20  epth.  Used for 
1e940 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
1e950 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 53 74  */.u64 sqlite3St
1e960 61 63 6b 44 65 70 74 68 28 76 6f 69 64 29 7b 0a  ackDepth(void){.
1e970 20 20 75 38 20 78 3b 0a 20 20 72 65 74 75 72 6e    u8 x;.  return
1e980 20 28 75 36 34 29 28 73 71 6c 69 74 65 33 5f 73   (u64)(sqlite3_s
1e990 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 2d 20  tack_baseline - 
1e9a0 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  &x);.}../*.** Us
1e9b0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
1e9c0 61 63 6b 5f 75 73 65 64 20 44 42 20 53 51 4c 0a  ack_used DB SQL.
1e9d0 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6d 65 61  **.** Try to mea
1e9e0 73 75 72 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  sure the amount 
1e9f0 6f 66 20 73 74 61 63 6b 20 73 70 61 63 65 20 75  of stack space u
1ea00 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  sed by a call to
1ea10 20 73 71 6c 69 74 65 33 5f 65 78 65 63 0a 2a 2f   sqlite3_exec.*/
1ea20 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
1ea30 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20 76  _stack_used(.  v
1ea40 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1ea50 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ea60 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1ea70 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1ea80 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
1ea90 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  db;.  int i;.  i
1eaa0 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1eab0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1eac0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ead0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1eae0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1eaf0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
1eb00 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  SQL", 0);.    re
1eb10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1eb20 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1eb30 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1eb40 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1eb50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1eb60 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b 0a  .  prepStack();.
1eb70 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 5f    (void)sqlite3_
1eb80 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32 5d  exec(db, argv[2]
1eb90 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66 6f  , 0, 0, 0);.  fo
1eba0 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30 20  r(i=65535; i>=0 
1ebb0 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74 65  && ((u32*)sqlite
1ebc0 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
1ebd0 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65 65  )[-i]==0xdeadbee
1ebe0 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c 5f  f; i--){}.  Tcl_
1ebf0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1ec00 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1ec10 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74 75  bj(i*4));.  retu
1ec20 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1ec30 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1ec40 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f  e_delete_functio
1ec50 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  n DB function-na
1ec60 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  me.**.** Delete 
1ec70 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
1ec80 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  n 'function-name
1ec90 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  ' from database 
1eca0 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a 2a  handle DB. It.**
1ecb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
1ecc0 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
1ecd0 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20 61  on was created a
1ece0 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d 62  s UTF8, any numb
1ecf0 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65 6e  er of.** argumen
1ed00 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65 20  ts (the way the 
1ed10 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1ed20 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1ed30 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 66 75 6e  c int delete_fun
1ed40 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ction(.  void * 
1ed50 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1ed60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1ed70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1ed80 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1ed90 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1eda0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1edb0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1edc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1edd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ede0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1edf0 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1ee00 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
1ee10 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
1ee20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ee30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1ee40 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1ee50 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1ee60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ee70 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1ee80 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
1ee90 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d  tion(db, argv[2]
1eea0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
1eeb0 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  8, 0, 0, 0, 0);.
1eec0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1eed0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1eee0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1eef0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
1ef00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ef10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ef20 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c  qlite_delete_col
1ef30 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74  lation DB collat
1ef40 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1ef50 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74  elete the collat
1ef60 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f  ion sequence 'co
1ef70 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72  llation-name' fr
1ef80 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  om database hand
1ef90 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73  le .** DB. It is
1efa0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
1efb0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1efc0 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64  ence was created
1efd0 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a   as UTF8 (the .*
1efe0 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  * way the TCL in
1eff0 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
1f000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f010 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
1f020 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f030 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f040 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f050 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1f060 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
1f070 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
1f080 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  b;.  if( argc!=3
1f090 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f0a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f0b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1f0c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1f0d0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1f0e0 20 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e   " DB function-n
1f0f0 61 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ame", 0);.    re
1f100 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f110 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1f120 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
1f130 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
1f140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f150 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1f160 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
1f170 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51  (db, argv[2], SQ
1f180 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29  LITE_UTF8, 0, 0)
1f190 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
1f1a0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1f1b0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1f1c0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
1f1d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f1e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1f1f0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
1f200 6f 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a  ocommit DB.**.**
1f210 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1f220 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20  the database DB 
1f230 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
1f240 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65  auto-commit mode
1f250 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1f260 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
1f270 74 69 63 20 69 6e 74 20 67 65 74 5f 61 75 74 6f  tic int get_auto
1f280 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a  commit(.  void *
1f290 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1f2a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1f2b0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1f2c0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1f2d0 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
1f2e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1f2f0 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
1f300 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f310 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1f320 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1f330 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1f340 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1f350 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1f360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f370 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f380 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1f390 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1f3a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f3b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1f3c0 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
1f3d0 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c   zBuf, "%d", sql
1f3e0 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d  ite3_get_autocom
1f3f0 6d 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  mit(db));.  Tcl_
1f400 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f410 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1f420 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1f430 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1f440 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
1f450 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a  eout DB MS.**.**
1f460 20 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69   Set the busy ti
1f470 6d 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20  meout.  This is 
1f480 6d 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65  more easily done
1f490 20 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f   using the timeo
1f4a0 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ut.** method of 
1f4b0 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63  the TCL interfac
1f4c0 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20  e.  But we need 
1f4d0 61 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68  a way to test th
1f4e0 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20  e case.** where 
1f4f0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
1f500 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61  E_MISUSE..*/.sta
1f510 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73  tic int test_bus
1f520 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69  y_timeout(.  voi
1f530 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1f540 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1f550 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1f560 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1f570 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b  ){.  int rc, ms;
1f580 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1f590 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
1f5a0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f5b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1f5c0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1f5d0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
1f5e0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
1f5f0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1f600 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f610 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1f620 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
1f630 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
1f640 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1f650 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1f660 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d  (interp, argv[2]
1f670 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20  , &ms) ) return 
1f680 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1f690 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74  = sqlite3_busy_t
1f6a0 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a  imeout(db, ms);.
1f6b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f6c0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
1f6d0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
1f6e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f6f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f700 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c  ge:  tcl_variabl
1f710 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e  e_type VARIABLEN
1f720 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
1f730 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1f740 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
1f750 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  entation for the
1f760 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65  .** value of the
1f770 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e   given variable.
1f780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f790 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
1f7a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f7b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f7c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f7d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f7e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f7f0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
1f800 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
1f810 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
1f820 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1f830 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
1f840 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
1f850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1f860 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
1f870 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
1f880 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f890 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
1f8a0 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
1f8b0 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
1f8c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f8d0 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
1f8e0 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
1f8f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f900 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1f910 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
1f920 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
1f930 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f940 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f950 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1f960 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
1f970 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ?N?.**.** Attemp
1f980 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
1f990 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
1f9a0 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ld but not actua
1f9b0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  lly required..**
1f9c0 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69   The integer N i
1f9d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1f9e0 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79  bytes we are try
1f9f0 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20  ing to release. 
1fa00 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20   The .** return 
1fa10 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f  value is the amo
1fa20 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63  unt of memory ac
1fa30 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e  tually released.
1fa40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1fa50 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  est_release_memo
1fa60 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ry(.  void * cli
1fa70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1fa80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1fa90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1faa0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1fab0 5b 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  [].){.#if define
1fac0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1fad0 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1fae0 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
1faf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
1fb00 4f 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e  O).  int N;.  in
1fb10 74 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a  t amt;.  if( obj
1fb20 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=1 && objc!=2 
1fb30 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1fb40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1fb50 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b  1, objv, "?N?");
1fb60 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1fb70 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1fb80 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20   objc==2 ){.    
1fb90 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1fba0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1fbb0 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
1fbc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fbd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20   }else{.    N = 
1fbe0 2d 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  -1;.  }.  amt = 
1fbf0 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
1fc00 6d 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c  memory(N);.  Tcl
1fc10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1fc20 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1fc30 4f 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69  Obj(amt));.#endi
1fc40 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1fc50 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
1fc60 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  ge:  sqlite3_db_
1fc70 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44  release_memory D
1fc80 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  B.**.** Attempt 
1fc90 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
1fca0 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
1fcb0 20 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e   by database DB.
1fcc0 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
1fcd0 72 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69  result code (whi
1fce0 63 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ch in the curren
1fcf0 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
1fd00 20 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29   is always zero)
1fd10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fd20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f  test_db_release_
1fd30 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a  memory(.  void *
1fd40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1fd50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1fd60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1fd70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1fd80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1fd90 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1fda0 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  c;.  if( objc!=2
1fdb0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1fdc0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1fdd0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
1fde0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1fdf0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1fe00 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1fe10 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1fe20 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1fe30 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1fe40 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1fe50 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
1fe60 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54  _memory(db);.  T
1fe70 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1fe80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1fe90 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  ntObj(rc));.  re
1fea0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1feb0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
1fec0 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c  lite3_db_cachefl
1fed0 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74  ush DB.**.** Att
1fee0 65 6d 70 74 20 74 6f 20 66 6c 75 73 68 20 61 6e  empt to flush an
1fef0 79 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f  y dirty pages to
1ff00 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
1ff10 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 63 61 63   int test_db_cac
1ff20 68 65 66 6c 75 73 68 28 0a 20 20 76 6f 69 64 20  heflush(.  void 
1ff30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ff40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ff50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ff60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ff70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1ff80 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1ff90 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  rc;.  if( objc!=
1ffa0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1ffb0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ffc0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
1ffd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1ffe0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1fff0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
20000 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20010 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20020 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
20030 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
20040 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66  qlite3_db_cachef
20050 6c 75 73 68 28 64 62 29 3b 0a 20 20 69 66 28 20  lush(db);.  if( 
20060 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  rc ){.    Tcl_Se
20070 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
20080 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
20090 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53  rrStr(rc), TCL_S
200a0 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
200b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
200c0 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  }..  Tcl_ResetRe
200d0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
200e0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
200f0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
20100 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
20110 61 6d 65 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a  ame DB DBNAME.**
20120 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
20130 61 6d 65 20 6f 66 20 61 20 66 69 6c 65 20 61 73  ame of a file as
20140 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
20150 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
20160 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64 62 5f  tic int test_db_
20170 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64  filename(.  void
20180 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20190 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
201a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
201b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
201c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
201d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
201e0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
201f0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ;.  if( objc!=3 
20200 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
20210 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
20220 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
20230 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
20240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
20250 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
20260 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
20270 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
20280 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
20290 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
202a0 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
202b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
202c0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
202d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
202e0 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
202f0 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76  db, zDbName), (v
20300 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  oid*)0);.  retur
20310 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
20320 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
20330 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44  e3_db_readonly D
20340 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  B DBNAME.**.** R
20350 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69 66 20  eturn 1 or 0 if 
20360 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64 6f 6e  DBNAME is readon
20370 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75  ly or not.  Retu
20380 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d 45 20  rn -1 if DBNAME 
20390 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73  does.** not exis
203a0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
203b0 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c   test_db_readonl
203c0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
203d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
203e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
203f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
20400 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
20410 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
20420 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
20430 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28   *zDbName;.  if(
20440 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
20450 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20460 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20470 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
20480 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
20490 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
204a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
204b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
204c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
204d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
204e0 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20  RROR;.  zDbName 
204f0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
20500 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  objv[2]);.  Tcl_
20510 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20520 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
20530 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  bj(sqlite3_db_re
20540 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61  adonly(db, zDbNa
20550 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  me)));.  return 
20560 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20570 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20580 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
20590 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
205a0 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
205b0 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
205c0 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
205d0 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
205e0 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
205f0 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
20600 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
20610 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
20620 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
20630 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6f  atic int test_so
20640 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
20650 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
20660 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
20670 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20680 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20690 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
206a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
206b0 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65   amt;.  Tcl_Wide
206c0 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66  Int N = -1;.  if
206d0 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
206e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
206f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
20700 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
20710 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
20720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
20730 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
20740 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
20750 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
20760 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
20770 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &N) ) return TCL
20780 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d  _ERROR;.  }.  am
20790 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  t = sqlite3_soft
207a0 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29  _heap_limit64(N)
207b0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
207c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
207d0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61  _NewWideIntObj(a
207e0 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  mt));.  return T
207f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20800 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
20810 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a  _thread_cleanup.
20820 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73  **.** Call the s
20830 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
20840 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74  eanup API..*/.st
20850 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 68  atic int test_th
20860 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20  read_cleanup(.  
20870 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20880 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20890 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
208a0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
208b0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
208c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
208d0 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20  MIT_DEPRECATED. 
208e0 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f   sqlite3_thread_
208f0 63 6c 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69  cleanup();.#endi
20900 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
20910 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
20920 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67  e:   sqlite3_pag
20930 65 72 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42  er_refcounts  DB
20940 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
20950 6c 69 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20  list of numbers 
20960 77 68 69 63 68 20 61 72 65 20 74 68 65 20 50 61  which are the Pa
20970 67 65 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20  gerRefcount for 
20980 61 6c 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e  all.** pagers on
20990 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 63   each database c
209a0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  onnection..*/.st
209b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 61  atic int test_pa
209c0 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20  ger_refcounts(. 
209d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
209e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
209f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
20a00 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
20a10 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
20a20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
20a30 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76    int i;.  int v
20a40 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  , *a;.  Tcl_Obj 
20a50 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28  *pResult;..  if(
20a60 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20a70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
20a80 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
20a90 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
20aa0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
20ab0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
20ac0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
20ad0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
20ae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20af0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
20b00 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
20b10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
20b20 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
20b30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20b40 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63  ;.  pResult = Tc
20b50 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f  l_NewObj();.  fo
20b60 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
20b70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
20b80 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d  db->aDb[i].pBt==
20b90 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d  0 ){.      v = -
20ba0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
20bb0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20bc0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
20bd0 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20 73 71  x);.      a = sq
20be0 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28  lite3PagerStats(
20bf0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
20c00 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  r(db->aDb[i].pBt
20c10 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20 61 5b  ));.      v = a[
20c20 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0];.      sqlite
20c30 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
20c40 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
20c50 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
20c60 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
20c70 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77  pResult, Tcl_New
20c80 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a  IntObj(v));.  }.
20c90 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20ca0 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 73 75  lt(interp, pResu
20cb0 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  lt);.  return TC
20cc0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
20cd0 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e  tclcmd:   workin
20ce0 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a  g_64bit_int.**.*
20cf0 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64  * Some TCL build
20d00 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29 20 64  s (ex: cygwin) d
20d10 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 36 34  o not support 64
20d20 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
20d30 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f  This.** leads to
20d40 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 73   a number of tes
20d50 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54 68 65  t failures.  The
20d60 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64   present command
20d70 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54   checks the.** T
20d80 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65 65 20  CL build to see 
20d90 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69  whether or not i
20da0 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d 62 69  t supports 64-bi
20db0 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49 74 0a  t integers.  It.
20dc0 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55 45 20  ** returns TRUE 
20dd0 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 46  if it does and F
20de0 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  ALSE if not..**.
20df0 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
20e00 69 73 20 75 73 65 64 20 74 6f 20 77 61 72 6e 20  is used to warn 
20e10 75 73 65 72 73 20 74 68 61 74 20 74 68 65 69 72  users that their
20e20 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20 64 65   TCL build is de
20e30 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74  fective.** and t
20e40 68 61 74 20 74 68 65 20 65 72 72 6f 72 73 20 74  hat the errors t
20e50 68 65 79 20 61 72 65 20 73 65 65 69 6e 67 20 69  hey are seeing i
20e60 6e 20 74 68 65 20 74 65 73 74 20 73 63 72 69 70  n the test scrip
20e70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  ts might be.** a
20e80 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 69 72   result of their
20e90 20 64 65 66 65 63 74 69 76 65 20 54 43 4c 20 72   defective TCL r
20ea0 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f 62 6c  ather than probl
20eb0 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a  ems in SQLite..*
20ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 6f 72  /.static int wor
20ed0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a  king_64bit_int(.
20ee0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
20ef0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
20f00 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
20f10 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
20f20 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
20f30 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
20f40 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
20f50 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
20f60 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
20f70 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
20f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20f90 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
20fa0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
20fb0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
20fc0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
20fd0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
20fe0 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20  Obj *pTestObj;. 
20ff0 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30   int working = 0
21000 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20  ;..  pTestObj = 
21010 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
21020 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31  j(1000000*(i64)1
21030 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f  234567890);.  wo
21040 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54  rking = strcmp(T
21050 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65  cl_GetString(pTe
21060 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37  stObj), "1234567
21070 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a  890000000")==0;.
21080 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
21090 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20  nt(pTestObj);.  
210a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
210b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
210c0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69  BooleanObj(worki
210d0 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ng));.  return T
210e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
210f0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
21100 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  nlink_test.**.**
21110 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
21120 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68  d unregisters th
21130 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e  e primary VFS an
21140 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73  d then registers
21150 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69  .** it back agai
21160 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
21170 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69   to test the abi
21180 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72  lity to register
21190 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e   a.** VFS when n
211a0 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73  one are previous
211b0 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61  ly registered, a
211c0 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  nd the ability t
211d0 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72  o .** unregister
211e0 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   the only availa
211f0 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74  ble VFS.  Ticket
21200 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63   #2738.*/.static
21210 20 69 6e 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f   int vfs_unlink_
21220 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
21230 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
21240 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
21250 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
21260 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
21270 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21280 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
21290 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
212a0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
212b0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
212c0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
212d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
212e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
212f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
21300 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
21310 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
21320 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
21330 65 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20  e3_vfs *pMain;. 
21340 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70   sqlite3_vfs *ap
21350 56 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74  Vfs[20];.  sqlit
21360 65 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b  e3_vfs one, two;
21370 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
21380 75 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20  unregister(0);  
21390 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f   /* Unregister o
213a0 66 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65  f NULL is harmle
213b0 73 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d  ss */.  one.zNam
213c0 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74  e = "__one";.  t
213d0 77 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77  wo.zName = "__tw
213e0 6f 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e  o";..  /* Callin
213f0 67 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65  g sqlite3_vfs_re
21400 67 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20  gister with 2nd 
21410 61 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f  argument of 0 do
21420 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e  es not.  ** chan
21430 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  ge the default V
21440 46 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20  FS.  */.  pMain 
21450 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
21460 6e 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  nd(0);.  sqlite3
21470 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
21480 6e 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  ne, 0);.  assert
21490 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d  ( pMain==0 || pM
214a0 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ain==sqlite3_vfs
214b0 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71  _find(0) );.  sq
214c0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
214d0 65 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61  er(&two, 0);.  a
214e0 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20  ssert( pMain==0 
214f0 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65  || pMain==sqlite
21500 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
21510 0a 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69  ..  /* We can fi
21520 6e 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20  nd a VFS by its 
21530 6e 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  name */.  assert
21540 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
21550 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
21560 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
21570 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21580 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
21590 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20  ;..  /* Calling 
215a0 73 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73  sqlite_vfs_regis
215b0 74 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72  ter with non-zer
215c0 6f 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  o second paramet
215d0 65 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20  er changes the. 
215e0 20 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c   ** default VFS,
215f0 20 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74   even if the 1st
21600 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e   parameter is an
21610 20 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61   existig VFS tha
21620 74 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f  t is.  ** previo
21630 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  usly registered 
21640 61 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75  as the non-defau
21650 6c 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lt..  */.  sqlit
21660 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21670 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65  &one, 1);.  asse
21680 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
21690 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
216a0 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
216b0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
216c0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
216d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
216e0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
216f0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c  )==&one );.  sql
21700 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
21710 72 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73  r(&two, 1);.  as
21720 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21730 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d  s_find("__one")=
21740 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72  =&one );.  asser
21750 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21760 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
21770 77 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  wo );.  assert( 
21780 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21790 28 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69  (0)==&two );.  i
217a0 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20  f( pMain ){.    
217b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
217c0 73 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a  ster(pMain, 1);.
217d0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
217e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
217f0 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
21800 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
21810 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
21820 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
21830 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21840 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70  3_vfs_find(0)==p
21850 4d 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20  Main );.  }.  . 
21860 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64   /* Unlink the d
21870 65 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70  efault VFS.  Rep
21880 65 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20  eat until there 
21890 61 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65  are no more VFSe
218a0 73 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65  s.  ** registere
218b0 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
218c0 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66  0; i<sizeof(apVf
218d0 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b  s)/sizeof(apVfs[
218e0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  0]); i++){.    a
218f0 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65  pVfs[i] = sqlite
21900 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
21910 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20     if( apVfs[i] 
21920 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21930 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
21940 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
21950 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
21960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
21970 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
21980 66 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73  fs[i]);.      as
21990 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33  sert( 0==sqlite3
219a0 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
219b0 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
219c0 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
219d0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
219e0 5f 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20  _find(0) );.  . 
219f0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
21a00 20 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e   main VFS as non
21a10 2d 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62  -default (will b
21a20 65 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20  e made default, 
21a30 73 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c  since.  ** it'll
21a40 20 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65   be the only one
21a50 20 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a   in existence)..
21a60 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76    */.  sqlite3_v
21a70 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69  fs_register(pMai
21a80 6e 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  n, 0);.  assert(
21a90 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
21aa0 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20  d(0)==pMain );. 
21ab0 20 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74   .  /* Un-regist
21ac0 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
21ad0 61 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65  again to restore
21ae0 20 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69   an empty VFS li
21af0 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  st */.  sqlite3_
21b00 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70  vfs_unregister(p
21b10 4d 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28  Main);.  assert(
21b20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
21b30 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a  find(0) );..  /*
21b40 20 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65   Relink all VFSe
21b50 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
21b60 65 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69  er. */  .  for(i
21b70 3d 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73  =sizeof(apVfs)/s
21b80 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d  izeof(apVfs[0])-
21b90 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
21ba0 20 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20     if( apVfs[i] 
21bb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
21bc0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70  _vfs_register(ap
21bd0 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20  Vfs[i], 1);.    
21be0 20 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b    assert( apVfs[
21bf0 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  i]==sqlite3_vfs_
21c00 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20  find(0) );.     
21c10 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
21c20 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
21c30 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
21c40 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ame) );.    }.  
21c50 7d 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74  }..  /* Unregist
21c60 65 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46  er out sample VF
21c70 53 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Ses. */.  sqlite
21c80 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21c90 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
21ca0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
21cb0 28 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e  (&two);..  /* Un
21cc0 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46  registering a VF
21cd0 53 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75  S that is not cu
21ce0 72 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72  rrently register
21cf0 65 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a  ed is harmless *
21d00 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
21d10 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29  unregister(&one)
21d20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
21d30 75 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29  unregister(&two)
21d40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
21d50 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
21d60 6f 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73  one")==0 );.  as
21d70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
21d80 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d  s_find("__two")=
21d90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73  =0 );..  /* We s
21da0 68 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69  hould be left wi
21db0 74 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  th the original 
21dc0 64 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b  default VFS back
21dd0 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   as the.  ** ori
21de0 67 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72  ginal */.  asser
21df0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
21e00 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b  ind(0)==pMain );
21e10 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
21e20 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
21e30 6d 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61  md:   vfs_initfa
21e40 69 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68  il_test.**.** Th
21e50 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61  is TCL command a
21e60 74 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66  ttempts to vfs_f
21e70 69 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69  ind and vfs_regi
21e80 73 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a  ster when the.**
21e90 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
21ea0 69 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20  ize() interface 
21eb0 69 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c  is failing.  All
21ec0 20 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61   calls should fa
21ed0 69 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  il..*/.static in
21ee0 74 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74  t vfs_initfail_t
21ef0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
21f00 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21f10 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21f20 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21f30 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21f40 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21f50 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21f60 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21f70 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21f80 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21f90 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21fa0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21fb0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21fc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21fd0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21fe0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21ff0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
22000 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20  ;.  one.zName = 
22010 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20  "__one";..  if( 
22020 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
22030 28 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  (0) ) return TCL
22040 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
22050 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
22060 6f 6e 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 73  one, 0);.  if( s
22070 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
22080 30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  0) ) return TCL_
22090 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
220a0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
220b0 6e 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 71  ne, 1);.  if( sq
220c0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
220d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
220e0 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
220f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22100 53 61 76 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73  Saved VFSes.*/.s
22110 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
22120 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74  s *apVfs[20];.st
22130 61 74 69 63 20 69 6e 74 20 6e 56 66 73 20 3d 20  atic int nVfs = 
22140 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  0;../*.** tclcmd
22150 3a 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73 74  :   vfs_unregist
22160 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72  er_all.**.** Unr
22170 65 67 69 73 74 65 72 20 61 6c 6c 20 56 46 53 65  egister all VFSe
22180 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
22190 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
221a0 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
221b0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
221c0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
221d0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
221e0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
221f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22200 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22210 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22220 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22230 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22240 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22250 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22260 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22270 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22280 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22290 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
222a0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
222b0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
222c0 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  pVfs); i++){.   
222d0 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69   apVfs[i] = sqli
222e0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
222f0 0a 20 20 20 20 69 66 28 20 61 70 56 66 73 5b 69  .    if( apVfs[i
22300 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
22310 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
22320 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69  register(apVfs[i
22330 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d  ]);.  }.  nVfs =
22340 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   i;.  return TCL
22350 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
22360 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72 65 67  cmd:   vfs_rereg
22370 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20  ister_all.**.** 
22380 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46 53 65  Restore all VFSe
22390 73 20 74 68 61 74 20 77 65 72 65 20 72 65 6d 6f  s that were remo
223a0 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f 75 6e  ved using vfs_un
223b0 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a  register_all.*/.
223c0 73 74 61 74 69 63 20 69 6e 74 20 76 66 73 5f 72  static int vfs_r
223d0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  eregister_all(. 
223e0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
223f0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
22400 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
22410 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
22420 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
22430 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
22440 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
22450 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
22460 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
22470 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
22480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22490 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
224a0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
224b0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
224c0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
224d0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
224e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
224f0 56 66 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Vfs; i++){.    s
22500 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
22510 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d  ter(apVfs[i], i=
22520 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  =0);.  }.  retur
22530 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
22540 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
22550 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20  le_control_test 
22560 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
22570 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
22580 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
22590 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
225a0 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
225b0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
225c0 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e  ion of the same.
225d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
225e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
225f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
22600 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
22610 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
22620 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
22630 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
22640 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
22650 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
22660 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
22670 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
22680 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
226b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
226c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
226d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
226e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
226f0 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71  t iArg = 0;.  sq
22700 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
22710 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
22720 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
22730 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
22740 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
22750 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
22760 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
22770 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
22780 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
22790 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
227a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
227b0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
227c0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
227d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
227e0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
227f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
22800 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
22810 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20  _control(db, 0, 
22820 30 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  0, &iArg);.  ass
22830 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
22840 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63  NOTFOUND );.  rc
22850 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22860 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74  control(db, "not
22870 61 64 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49  adatabase", SQLI
22880 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41  TE_FCNTL_LOCKSTA
22890 54 45 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  TE, &iArg);.  as
228a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
228b0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d  _ERROR );.  rc =
228c0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
228d0 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22  ntrol(db, "main"
228e0 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20  , -1, &iArg);.  
228f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
22900 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20  TE_NOTFOUND );. 
22910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
22920 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
22930 74 65 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67  temp", -1, &iArg
22940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
22950 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
22960 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45   || rc==SQLITE_E
22970 52 52 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75 72  RROR );..  retur
22980 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
22990 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
229a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
229b0 72 72 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a  rrno_test DB.**.
229c0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
229d0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
229e0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
229f0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
22a00 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
22a10 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
22a20 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 41 53 54   the SQLITE_LAST
22a30 5f 45 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a  _ERRNO verb..*/.
22a40 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
22a50 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
22a60 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  o_test(.  Client
22a70 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
22a80 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
22a90 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
22aa0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
22ab0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
22ac0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
22ad0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
22ae0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
22af0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
22b00 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
22b10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22b20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
22b30 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
22b40 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
22b50 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
22b60 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30  {.  int iArg = 0
22b70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
22b80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
22b90 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
22ba0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22bb0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
22bc0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
22bd0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
22be0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
22bf0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
22c00 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
22c10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22c20 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22c30 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22c40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22c50 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
22c60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
22c70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
22c80 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
22c90 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
22ca0 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  , SQLITE_LAST_ER
22cb0 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20 20 69  RNO, &iArg);.  i
22cc0 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54 63  f( rc ){ .    Tc
22cd0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
22ce0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
22cf0 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
22d00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22d10 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69 41 72  ; .  }.  if( iAr
22d20 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54 63 6c  g!=0 ) {.    Tcl
22d30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22d40 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63 74 65  terp, "Unexpecte
22d50 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f  d non-zero errno
22d60 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
22d70 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65            Tcl_Ge
22d80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
22d90 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69 41 72  cl_NewIntObj(iAr
22da0 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30 29 3b  g), 0), " ", 0);
22db0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
22dc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
22dd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
22de0 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
22df0 5f 0a 2f 2a 20 46 72 6f 6d 20 73 71 6c 69 74 65  _./* From sqlite
22e00 33 5f 70 72 69 61 76 65 74 2e 68 20 2a 2f 0a 23  3_priavet.h */.#
22e10 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54   ifndef SQLITE_T
22e20 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
22e30 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
22e40 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
22e50 53 45 20 20 20 20 20 20 31 30 31 0a 23 20 64 65  SE      101.# de
22e60 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
22e70 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  CATE_JOURNALMODE
22e80 5f 57 41 4c 20 20 20 20 20 20 20 20 20 20 20 28  _WAL           (
22e90 30 78 31 3c 3c 30 29 0a 23 20 64 65 66 69 6e 65  0x1<<0).# define
22ea0 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
22eb0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b  _AUTOVACUUM_MASK
22ec0 20 20 20 20 20 20 20 20 20 20 20 28 30 78 33 3c             (0x3<
22ed0 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <2).# define SQL
22ee0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54  ITE_TRUNCATE_AUT
22ef0 4f 56 41 43 55 55 4d 5f 4f 46 46 20 20 20 20 20  OVACUUM_OFF     
22f00 20 20 20 20 20 20 20 28 30 78 31 3c 3c 32 29 0a         (0x1<<2).
22f10 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
22f20 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43  TRUNCATE_AUTOVAC
22f30 55 55 4d 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  UUM_FULL        
22f40 20 20 20 28 30 78 32 3c 3c 32 29 0a 23 20 64 65     (0x2<<2).# de
22f50 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
22f60 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
22f70 49 4e 43 52 45 4d 45 4e 54 41 4c 20 20 20 20 28  INCREMENTAL    (
22f80 30 78 33 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65  0x3<<2).# define
22f90 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
22fa0 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 20 20  _PAGESIZE_MASK  
22fb0 20 20 20 20 20 20 20 20 20 20 20 28 30 78 37 3c             (0x7<
22fc0 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <4).# define SQL
22fd0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
22fe0 45 53 49 5a 45 5f 31 30 32 34 20 20 20 20 20 20  ESIZE_1024      
22ff0 20 20 20 20 20 20 20 28 30 78 31 3c 3c 34 29 0a         (0x1<<4).
23000 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
23010 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a  TRUNCATE_PAGESIZ
23020 45 5f 32 30 34 38 20 20 20 20 20 20 20 20 20 20  E_2048          
23030 20 20 20 28 30 78 32 3c 3c 34 29 0a 23 20 64 65     (0x2<<4).# de
23040 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
23050 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 34 30  CATE_PAGESIZE_40
23060 39 36 20 20 20 20 20 20 20 20 20 20 20 20 20 28  96             (
23070 30 78 33 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65  0x3<<4).# define
23080 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
23090 5f 50 41 47 45 53 49 5a 45 5f 38 31 39 32 20 20  _PAGESIZE_8192  
230a0 20 20 20 20 20 20 20 20 20 20 20 28 30 78 34 3c             (0x4<
230b0 3c 34 29 0a 23 20 65 6e 64 69 66 0a 23 20 69 66  <4).# endif.# if
230c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 45 50 4c  ndef SQLITE_REPL
230d0 41 43 45 5f 44 41 54 41 42 41 53 45 0a 23 20 64  ACE_DATABASE.# d
230e0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 50  efine SQLITE_REP
230f0 4c 41 43 45 5f 44 41 54 41 42 41 53 45 20 20 20  LACE_DATABASE   
23100 20 20 20 20 31 30 32 0a 23 20 65 6e 64 69 66 0a      102.# endif.
23110 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23120 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72   file_control_tr
23130 75 6e 63 61 74 65 5f 74 65 73 74 20 44 42 0a 2a  uncate_test DB.*
23140 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
23150 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
23160 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
23170 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
23180 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
23190 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
231a0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54 52  of the SQLITE_TR
231b0 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 20  UNCATE_DATABASE 
231c0 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  verb..*/.static 
231d0 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
231e0 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74 28 0a  _truncate_test(.
231f0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
23200 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
23210 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
23220 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
23230 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
23240 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
23250 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
23260 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
23270 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
23280 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
23290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
232a0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
232b0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
232c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
232d0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
232e0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
232f0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 66  te3 *db;.  int f
23300 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lags;.  int rc;.
23310 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33    .  if( objc!=3
23320 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
23330 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
23340 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
23350 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
23360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23370 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
23380 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
23390 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 53  , 0), " DB FLAGS
233a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
233b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
233c0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
233d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
233e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
233f0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
23400 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23410 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
23420 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23430 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
23440 66 6c 61 67 73 29 20 29 7b 0a 20 20 20 20 72 65  flags) ){.    re
23450 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23460 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
23470 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
23480 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
23490 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
234a0 53 45 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20 69  SE, &flags);.  i
234b0 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54 63  f( rc ){ .    Tc
234c0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
234d0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
234e0 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
234f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23500 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
23510 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
23520 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
23530 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63  e_control_replac
23540 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  e_test DB.**.** 
23550 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
23560 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
23570 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
23580 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
23590 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
235a0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
235b0 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  e SQLITE_REPLACE
235c0 5f 44 41 54 41 42 41 53 45 20 76 65 72 62 2e 0a  _DATABASE verb..
235d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
235e0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61  le_control_repla
235f0 63 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  ce_test(.  Clien
23600 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
23610 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
23620 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
23630 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
23640 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
23650 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
23660 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
23670 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
23680 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
23690 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
236a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
236b0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
236c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
236d0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
236e0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
236f0 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20  ){.  int iArg = 
23700 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72  0;.  sqlite3 *sr
23710 63 5f 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  c_db;.  sqlite3 
23720 2a 64 73 74 5f 64 62 3b 0a 20 20 69 6e 74 20 72  *dst_db;.  int r
23730 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
23740 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
23750 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
23760 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
23770 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23780 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23790 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
237a0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
237b0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 53 54 5f 44  [0], 0), " DST_D
237c0 42 20 53 52 43 5f 44 42 22 2c 20 30 29 3b 0a 20  B SRC_DB", 0);. 
237d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
237e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
237f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
23800 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
23810 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 73 74  g(objv[1]), &dst
23820 5f 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  _db) ){.    retu
23830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23840 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23850 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23860 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23870 32 5d 29 2c 20 26 73 72 63 5f 64 62 29 20 29 7b  2]), &src_db) ){
23880 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23890 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
238a0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
238b0 6f 6e 74 72 6f 6c 28 64 73 74 5f 64 62 2c 20 4e  ontrol(dst_db, N
238c0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 52 45 50 4c  ULL, SQLITE_REPL
238d0 41 43 45 5f 44 41 54 41 42 41 53 45 2c 20 73 72  ACE_DATABASE, sr
238e0 63 5f 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20  c_db);.  if( rc 
238f0 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ){ .    Tcl_SetO
23900 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23910 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
23920 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e  c)); .    return
23930 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d   TCL_ERROR; .  }
23940 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23950 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
23960 5f 5f 41 50 50 4c 45 5f 5f 20 2a 2f 0a 0a 2f 2a  __APPLE__ */../*
23970 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
23980 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
23990 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42 4e  size_test DB DBN
239a0 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54  AME SIZE.**.** T
239b0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
239c0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
239d0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
239e0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
239f0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
23a00 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
23a10 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
23a20 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
23a30 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
23a40 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
23a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23a60 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
23a70 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c  ksize_test(.  Cl
23a80 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
23a90 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
23aa0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
23ab0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
23ac0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
23ad0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
23ae0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
23af0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
23b00 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
23b10 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
23b20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23b30 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23b40 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
23b50 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
23b60 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
23b70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  */.){.  int nSiz
23b80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
23b90 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
23ba0 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63  hunk size */.  c
23bb0 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23bd0 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e  * Db name ("main
23be0 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20  ", "temp" etc.) 
23bf0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
23c00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23c10 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
23c20 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
23c30 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23c50 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72  file_control() r
23c60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
23c70 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
23c80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
23c90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
23ca0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
23cb0 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74   SIZE");.    ret
23cc0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23cd0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23ce0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
23cf0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23d00 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c  [1]), &db) .   |
23d10 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  | Tcl_GetIntFrom
23d20 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23d30 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29  [3], &nSize).  )
23d40 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
23d50 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
23d60 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
23d70 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
23d80 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20   zDb[0]=='\0' ) 
23d90 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72  zDb = NULL;..  r
23da0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23db0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
23dc0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
23dd0 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64  HUNK_SIZE, (void
23de0 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
23df0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
23e00 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
23e10 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
23e20 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
23e30 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
23e40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23e50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
23e60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
23e70 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
23e80 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
23e90 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49  est DB DBNAME SI
23ea0 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  ZE.**.** This TC
23eb0 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
23ec0 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
23ed0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
23ee0 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  e .** with SQLIT
23ef0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
23f00 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
23f10 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
23f20 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c  ehint_test(.  Cl
23f30 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
23f40 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
23f50 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
23f60 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
23f70 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
23f80 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
23f90 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
23fa0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
23fb0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
23fc0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
23fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23fe0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23ff0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
24000 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
24010 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24020 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65  */.){.  Tcl_Wide
24030 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  Int nSize;      
24040 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 65          /* Hinte
24050 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72  d size */.  char
24060 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
24070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
24080 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20  b name ("main", 
24090 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a  "temp" etc.) */.
240a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
240b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240c0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
240d0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ndle */.  int rc
240e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
240f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
24100 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75  e_control() retu
24110 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
24120 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
24130 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
24140 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
24150 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49  v, "DB DBNAME SI
24160 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ZE");.    return
24170 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24180 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24190 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
241a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
241b0 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54  ), &db) .   || T
241c0 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
241d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
241e0 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20  v[3], &nSize).  
241f0 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
24200 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
24210 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
24220 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
24230 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29  ( zDb[0]=='\0' )
24240 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20   zDb = NULL;..  
24250 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
24260 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
24270 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
24280 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64  SIZE_HINT, (void
24290 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
242a0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
242b0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
242c0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
242d0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
242e0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
242f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24300 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
24310 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
24320 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
24330 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
24340 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a  test DB PWD.**.*
24350 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
24360 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
24370 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
24380 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
24390 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
243a0 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
243b0 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  the SQLITE_GET_L
243c0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64  OCKPROXYFILE and
243d0 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  .** SQLITE_SET_L
243e0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72  OCKPROXYFILE ver
243f0 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  bs..*/.static in
24400 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  t file_control_l
24410 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20  ockproxy_test(. 
24420 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
24430 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
24440 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
24450 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
24460 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
24470 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
24480 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
24490 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
244a0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
244b0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
244c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
244d0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
244e0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
244f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
24500 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
24510 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
24520 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28  e3 *db;.  .  if(
24530 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
24540 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24550 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24560 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
24570 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
24580 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
24590 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
245a0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
245b0 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20  DB PWD", 0);.   
245c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
245d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
245e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
245f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
24600 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
24610 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
24620 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69  ERROR;.  }.  .#i
24630 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
24640 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24650 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
24660 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24670 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
24680 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
24690 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
246a0 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
246b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
246c0 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
246d0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
246e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
246f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
24700 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
24710 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  _).  {.    char 
24720 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69  *testPath;.    i
24730 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  nt rc;.    int n
24740 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Pwd;.    const c
24750 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63  har *zPwd;.    c
24760 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30  har proxyPath[40
24770 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77  0];.    .    zPw
24780 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
24790 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
247a0 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66  , &nPwd);.    if
247b0 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  ( sizeof(proxyPa
247c0 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20  th)<nPwd+20 ){. 
247d0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
247e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50  esult(interp, "P
247f0 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f  WD too big", (vo
24800 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  id*)0);.      re
24810 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24820 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
24830 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
24840 66 28 70 72 6f 78 79 50 61 74 68 29 2c 20 70 72  f(proxyPath), pr
24850 6f 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73  oxyPath, "%s/tes
24860 74 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b  t.proxy", zPwd);
24870 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
24880 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
24890 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
248a0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
248b0 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
248c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
248d0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
248e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
248f0 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20  NewIntObj(rc)); 
24900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
24910 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
24920 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
24930 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
24940 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45   NULL, SQLITE_GE
24950 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
24960 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20   &testPath);.   
24970 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f   if( strncmp(pro
24980 78 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c  xyPath,testPath,
24990 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  11) ){.      Tcl
249a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
249b0 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78  terp, "Lock prox
249c0 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d  y file did not m
249d0 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20  atch the ".     
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69            "previ
24a00 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76  ously assigned v
24a10 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  alue", 0);.     
24a20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24a30 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
24a40 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
24a50 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24a60 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
24a70 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20  Obj(rc));.      
24a80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
24aa0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24ab0 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
24ac0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
24ad0 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
24ae0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
24af0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
24b00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24b10 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
24b20 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
24b30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24b40 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24b50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24b60 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41    .}..#ifdef __A
24b70 50 50 4c 45 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  PPLE__.#include 
24b80 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69  <sys/param.h>.#i
24b90 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e  nclude <sys/moun
24ba0 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
24bb0 79 73 2f 65 72 72 6e 6f 2e 68 3e 0a 23 65 6e 64  ys/errno.h>.#end
24bc0 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c 63 6d  if../*. ** tclcm
24bd0 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 6c 6f 63  d:   path_is_loc
24be0 61 6c 20 50 57 44 0a 20 2a 2f 0a 73 74 61 74 69  al PWD. */.stati
24bf0 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f 6c 6f  c int path_is_lo
24c00 63 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  cal(.  ClientDat
24c10 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24c20 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24c30 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24c40 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24c50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24c60 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24c70 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24c80 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24c90 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
24ca0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
24cb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
24cc0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
24cd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24ce0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
24cf0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 23  rguments */.){.#
24d00 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
24d10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
24d20 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ath;.  int nPath
24d30 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
24d40 73 20 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20 69  s fsInfo;.  .  i
24d50 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
24d60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24d70 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
24d80 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
24d90 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
24da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
24db0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
24dc0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
24dd0 22 20 50 41 54 48 22 2c 20 30 29 3b 0a 20 20 20  " PATH", 0);.   
24de0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24df0 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20 3d  R;.  }.  zPath =
24e00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
24e10 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26  omObj(objv[1], &
24e20 6e 50 61 74 68 29 3b 0a 20 20 69 66 28 20 73 74  nPath);.  if( st
24e30 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
24e40 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
24e50 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
24e60 6f 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  o;.    Tcl_Appen
24e70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24e80 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20 73  "Error calling s
24e90 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c 0a  tatfs on path",.
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
24ec0 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a 20 20 20  bj(err), 0);.   
24ed0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24ee0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 73 49  R;.  }.  if( fsI
24ef0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
24f00 4c 4f 43 41 4c 20 29 7b 0a 20 20 20 20 54 63 6c  LOCAL ){.    Tcl
24f10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24f20 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
24f30 4f 62 6a 28 31 29 29 3b 20 0a 20 20 7d 20 65 6c  Obj(1)); .  } el
24f40 73 65 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  se {.    Tcl_Set
24f50 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24f60 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24f70 30 29 29 3b 20 0a 20 20 7d 0a 23 65 6c 73 65 0a  0)); .  }.#else.
24f80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
24f90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
24fa0 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 23  ewIntObj(1)); .#
24fb0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
24fc0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
24fd0 2a 0a 20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  *. ** tclcmd:   
24fe0 70 61 74 68 5f 69 73 5f 64 6f 73 20 50 57 44 0a  path_is_dos PWD.
24ff0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
25000 61 74 68 5f 69 73 5f 64 6f 73 28 0a 20 20 43 6c  ath_is_dos(.  Cl
25010 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
25020 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
25030 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
25040 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
25050 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
25060 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
25070 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
25080 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
25090 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
250a0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
250b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
250c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
250d0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
250e0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
250f0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
25100 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f 5f 41  */.){.#ifdef __A
25110 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73 74 20 63  PPLE__.  const c
25120 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 69 6e  har *zPath;.  in
25130 74 20 6e 50 61 74 68 3b 0a 20 20 73 74 72 75 63  t nPath;.  struc
25140 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
25150 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
25160 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
25170 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
25180 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
25190 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
251c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
251d0 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22 2c 20  ], 0), " PATH", 
251e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
251f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25200 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zPath = Tcl_GetS
25210 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
25220 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b 0a 20  v[1], &nPath);. 
25230 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
25240 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
25250 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  1 ){.    int err
25260 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 54 63   = errno;.    Tc
25270 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
25280 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20 63 61  nterp, "Error ca
25290 6c 6c 69 6e 67 20 73 74 61 74 66 73 20 6f 6e 20  lling statfs on 
252a0 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20 20  path",.         
252b0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
252c0 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72 29 2c 20  NewIntObj(err), 
252d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
252e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
252f0 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
25300 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
25310 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
25320 29 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  )) {.    Tcl_Set
25330 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
25340 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
25350 31 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 69  1)); .  } else i
25360 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
25370 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
25380 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
25390 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ) {.    Tcl_SetO
253a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
253b0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31   Tcl_NewIntObj(1
253c0 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  )); .  } else {.
253d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
253e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
253f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b 20  _NewIntObj(0)); 
25400 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 54 63 6c  .  }.#else.  Tcl
25410 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
25420 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
25430 4f 62 6a 28 30 29 29 3b 20 0a 23 65 6e 64 69 66  Obj(0)); .#endif
25440 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .  .  return TCL
25450 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53 51  _OK;  .}..#if SQ
25460 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
25470 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
25480 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
25490 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45 54  v_retry DB  NRET
254a0 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20  RY  DELAY.**.** 
254b0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
254c0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
254d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
254e0 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
254f0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
25500 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
25510 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
25520 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
25530 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
25540 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ry(.  ClientData
25550 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25560 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
25570 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
25580 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
25590 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
255a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
255b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
255c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
255d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
255e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
255f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
25600 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
25610 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25620 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25630 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25640 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
25650 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32  nt rc;.  int a[2
25660 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  ];.  char z[100]
25670 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
25680 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
25690 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
256a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
256b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
256c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
256d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
256e0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52  [0], 0), " DB NR
256f0 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b  ETRY DELAY", 0);
25700 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25710 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
25720 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
25730 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
25740 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
25750 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
25760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25770 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
25780 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
25790 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20  objv[2], &a[0]) 
257a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
257b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
257c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
257d0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b  rp, objv[3], &a[
257e0 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  1]) ) return TCL
257f0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
25800 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
25810 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
25820 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
25830 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64  _AV_RETRY, (void
25840 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *)a);.  sqlite3_
25850 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
25860 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64  z), z, "%d %d %d
25870 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31  ", rc, a[0], a[1
25880 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
25890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
258a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
258b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
258c0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
258d0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
258e0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
258f0 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a   DB HANDLE.**.**
25900 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
25910 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
25920 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
25930 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
25940 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
25950 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e  TL_WIN32_SET_HAN
25960 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  DLE opcode..*/.s
25970 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
25980 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
25990 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e  _handle(.  Clien
259a0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
259b0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
259c0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
259d0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
259e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
259f0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25a00 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25a10 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25a20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25a30 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25a50 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25a60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25a70 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25a80 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25a90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25aa0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41  ;.  int rc;.  HA
25ab0 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c  NDLE hFile = NUL
25ac0 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  L;.  char z[100]
25ad0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
25ae0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
25af0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25b00 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
25b10 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
25b20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
25b30 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
25b40 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48 41  [0], 0), " DB HA
25b50 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NDLE", 0);.    r
25b60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25b70 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25b80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25b90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
25ba0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
25bb0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
25bc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
25bd0 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28 69  getWin32Handle(i
25be0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
25bf0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
25c00 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  hFile) ){.    re
25c10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25c20 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
25c30 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
25c40 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
25c50 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
25c60 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20  _HANDLE,.       
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69       (void*)&hFi
25c90 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  le);.  sqlite3_s
25ca0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
25cb0 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72  ), z, "%d %p", r
25cc0 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29  c, (void*)hFile)
25cd0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
25ce0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
25cf0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
25d00 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
25d10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
25d20 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
25d30 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
25d40 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47   DB PERSIST-FLAG
25d50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
25d60 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
25d70 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
25d80 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
25d90 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
25da0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
25db0 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  _WAL opcode..*/.
25dc0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
25dd0 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
25de0 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  wal(.  ClientDat
25df0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25e00 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25e10 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25e20 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25e30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25e40 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25e50 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25e60 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25e70 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25e80 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25e90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25ea0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25eb0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25ec0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25ed0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25ee0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
25ef0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50  int rc;.  int bP
25f00 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a  ersist;.  char z
25f10 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
25f20 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
25f30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
25f40 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
25f50 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
25f60 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
25f70 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
25f80 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
25f90 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
25fa0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
25fb0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
25fc0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
25fd0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
25fe0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25ff0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
26000 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
26010 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
26020 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
26030 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29  v[2], &bPersist)
26040 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
26050 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
26060 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26070 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
26080 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
26090 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65  WAL, (void*)&bPe
260a0 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  rsist);.  sqlite
260b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
260c0 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
260d0 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b  , rc, bPersist);
260e0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
260f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
26100 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
26110 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 2f  rn TCL_OK;  .}./
26120 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
26130 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
26140 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 20  rsafe_overwrite 
26150 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a  DB PSOW-FLAG.**.
26160 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
26170 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
26180 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
26190 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
261a0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
261b0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
261c0 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65 2e  VERWRITE opcode.
261d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
261e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
261f0 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 28  rsafe_overwrite(
26200 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26210 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
26220 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
26230 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
26240 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
26250 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
26260 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
26270 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
26280 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
26290 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
262a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
262b0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
262c0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
262d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
262e0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
262f0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
26300 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
26310 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 63  rc;.  int b;.  c
26320 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
26330 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
26340 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
26350 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
26360 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
26370 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
26380 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
26390 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
263a0 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
263b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
263c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
263d0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
263e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
263f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
26400 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
26410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26420 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
26430 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
26440 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20 29  , objv[2], &b) )
26450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
26460 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
26470 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26480 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46 43  b,NULL,SQLITE_FC
26490 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
264a0 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29 26  ERWRITE,(void*)&
264b0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b);.  sqlite3_sn
264c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
264d0 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63  , z, "%d %d", rc
264e0 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , b);.  Tcl_Appe
264f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
26500 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
26510 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
26520 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63   .}.../*.** tclc
26530 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
26540 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f 41  ol_vfsname DB ?A
26550 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75  UXDB?.**.** Retu
26560 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
26570 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73   describes the s
26580 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a  tack of VFSes..*
26590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
265a0 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
265b0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
265c0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
265d0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
265e0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
265f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
26600 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
26610 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
26620 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
26630 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
26640 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
26650 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26660 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
26670 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
26680 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
26690 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
266a0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
266b0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
266c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
266d0 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68  e = "main";.  ch
266e0 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30  ar *zVfsName = 0
266f0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
26700 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
26710 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
26720 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
26730 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
26740 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
26750 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
26760 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
26770 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f  0), " DB ?AUXDB?
26780 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
26790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
267a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
267b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
267c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
267d0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
267e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
267f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
26800 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61  ==3 ){.    zDbNa
26810 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
26820 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d  ng(objv[2]);.  }
26830 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  .  sqlite3_file_
26840 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e  control(db, zDbN
26850 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
26860 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64 2a  L_VFSNAME,(void*
26870 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 54  )&zVfsName);.  T
26880 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26890 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d 65  interp, zVfsName
268a0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73  , (char*)0);.  s
268b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66 73  qlite3_free(zVfs
268c0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
268d0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
268e0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
268f0 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
26900 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42  lename DB ?AUXDB
26910 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ?.**.** Return a
26920 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
26930 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
26940 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  name.*/.static i
26950 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
26960 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20  tempfilename(.  
26970 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
26980 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
26990 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
269a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
269b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
269c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
269d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
269e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
269f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
26a00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
26a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26a20 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26a30 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
26a40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
26a50 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
26a60 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
26a70 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
26a80 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
26a90 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
26aa0 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  TName = 0;..  if
26ab0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
26ac0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
26ad0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
26ae0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
26af0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
26b00 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
26b10 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
26b20 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
26b30 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a  B ?AUXDB?", 0);.
26b40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26b50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
26b60 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
26b70 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
26b80 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
26b90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
26ba0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
26bb0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
26bc0 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
26bd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
26be0 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [2]);.  }.  sqli
26bf0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26c00 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  (db, zDbName, SQ
26c10 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
26c20 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29  ILENAME, (void*)
26c30 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  &zTName);.  Tcl_
26c40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
26c50 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68  erp, zTName, (ch
26c60 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
26c70 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
26c80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26c90 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
26ca0 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76  cmd:   sqlite3_v
26cb0 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20  fs_list.**.**   
26cc0 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73  Return a tcl lis
26cd0 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
26ce0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65   names of all re
26cf0 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a  gistered vfs's..
26d00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
26d10 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74  s_list(.  Client
26d20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26d30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26d40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26d50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26d60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26d70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26d80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26d90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
26da0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26db0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
26dc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26dd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
26de0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26df0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26e00 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26e10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
26e20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pVfs;.  Tcl_Obj
26e30 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
26e40 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a  Obj();.  if( obj
26e50 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
26e60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
26e70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
26e80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26e90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
26ea0 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f  or(pVfs=sqlite3_
26eb0 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66  vfs_find(0); pVf
26ec0 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e  s; pVfs=pVfs->pN
26ed0 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69  ext){.    Tcl_Li
26ee0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
26ef0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26f00 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
26f10 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d  j(pVfs->zName, -
26f20 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  1));.  }.  Tcl_S
26f30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
26f40 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74  rp, pRet);.  ret
26f50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
26f60 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26f70 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44   sqlite3_limit D
26f80 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  B ID VALUE.**.**
26f90 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
26fa0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
26fb0 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61  e3_limit interfa
26fc0 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
26fd0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
26fe0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
26ff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27000 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c  test_limit(.  Cl
27010 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
27020 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
27030 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
27040 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
27050 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
27060 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
27070 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
27080 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
27090 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
270a0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
270b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
270c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
270d0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
270e0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
270f0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
27100 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
27110 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
27120 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
27130 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
27140 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
27150 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20  t id;.  } aId[] 
27160 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
27170 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c  E_LIMIT_LENGTH",
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
27190 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
271a0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
271b0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
271c0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
271d0 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
271e0 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
271f0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  NGTH           }
27200 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
27210 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20  LIMIT_COLUMN",  
27220 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
27230 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
27240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
27250 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
27260 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22  IMIT_EXPR_DEPTH"
27270 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
27280 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
27290 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
272a0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
272b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
272c0 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ECT",     SQLITE
272d0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
272e0 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20  SELECT      },. 
272f0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
27300 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20  IT_VDBE_OP",    
27310 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
27320 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
27330 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
27340 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
27350 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c  T_FUNCTION_ARG",
27360 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
27370 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
27380 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  G         },.   
27390 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
273a0 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20 20  _ATTACHED",     
273b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
273c0 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20  MIT_ATTACHED    
273d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
273e0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
273f0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
27400 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  GTH", SQLITE_LIM
27410 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
27420 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b  LENGTH  },.    {
27430 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
27440 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c  ARIABLE_NUMBER",
27450 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
27460 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
27470 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  R      },.    { 
27480 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  "SQLITE_LIMIT_TR
27490 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20 20  IGGER_DEPTH",   
274a0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
274b0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
274c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
274d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
274e0 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20 20  KER_THREADS",   
274f0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
27500 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20  WORKER_THREADS  
27510 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20       },.    .   
27520 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65   /* Out of range
27530 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20   test cases */. 
27540 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
27550 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20  IT_TOOSMALL",   
27560 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20           -1,    
27570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27580 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
27590 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
275a0 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20  T_TOOBIG",      
275b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
275c0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
275d0 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20 7d  ADS+1     },.  }
275e0 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20 3d 20  ;.  int i, id = 
275f0 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  0;.  int val;.  
27600 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
27610 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
27620 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
27630 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
27640 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
27650 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
27660 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
27670 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
27680 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20  0], 0), " DB ID 
27690 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
276a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
276b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
276c0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
276d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
276e0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
276f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27700 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65  ;.  zId = Tcl_Ge
27710 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
27720 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
27730 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
27740 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  f(aId[0]); i++){
27750 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
27760 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d  zId, aId[i].zNam
27770 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
27780 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20  d = aId[i].id;. 
27790 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
277a0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
277b0 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
277c0 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20  f(aId[0]) ){.   
277d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
277e0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
277f0 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22  wn limit type: "
27800 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29  , zId, (char*)0)
27810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
27820 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
27830 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
27840 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
27850 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
27860 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27870 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69   rc = sqlite3_li
27880 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29  mit(db, id, val)
27890 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
278a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
278b0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
278c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
278d0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
278e0 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f  cmd:  save_prng_
278f0 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65  state.**.** Save
27900 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
27910 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  e pseudo-random 
27920 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
27930 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65  ..** At the same
27940 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68   time, verify th
27950 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  at sqlite3_test_
27960 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76  control works ev
27970 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65  en when.** calle
27980 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  d with an out-of
27990 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a  -range opcode..*
279a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
279b0 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20  e_prng_state(.  
279c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
279d0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
279e0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
279f0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
27a00 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27a10 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27a20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27a30 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27a40 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27a50 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27a70 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27a80 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27a90 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27aa0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27ab0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
27ac0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
27ad0 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20  control(9999);. 
27ae0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
27af0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27b00 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31  _test_control(-1
27b10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
27b20 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
27b30 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
27b40 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
27b50 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72  G_SAVE);.  retur
27b60 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
27b70 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f  * tclcmd:  resto
27b80 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f  re_prng_state.*/
27b90 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 74  .static int rest
27ba0 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ore_prng_state(.
27bb0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27bc0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
27bd0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
27be0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27bf0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
27c00 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
27c10 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
27c20 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
27c30 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
27c40 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
27c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27c60 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27c70 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27c80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
27c90 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
27ca0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
27cb0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
27cc0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
27cd0 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a  _PRNG_RESTORE);.
27ce0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27cf0 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
27d00 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
27d10 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
27d20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74   reset_prng_stat
27d30 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
27d40 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
27d50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
27d60 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
27d70 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
27d80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
27d90 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
27da0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
27db0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
27dc0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
27dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27de0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
27df0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
27e00 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
27e10 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
27e20 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
27e30 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
27e40 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
27e50 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b  TRL_PRNG_RESET);
27e60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
27e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
27e80 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79  d:  database_may
27e90 5f 62 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  _be_corrupt.**.*
27ea0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
27eb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d  database files m
27ec0 69 67 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e  ight be corrupt.
27ed0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
27ee0 2c 20 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c  , set the normal
27ef0 0a 2a 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65  .** state of ope
27f00 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
27f10 63 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6d  c int database_m
27f20 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 28 0a 20  ay_be_corrupt(. 
27f30 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
27f40 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
27f50 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
27f60 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
27f70 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
27f80 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
27f90 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
27fa0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
27fb0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27fc0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27fe0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27ff0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
28000 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
28010 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
28020 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
28030 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
28040 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
28050 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 30  NEVER_CORRUPT, 0
28060 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
28070 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
28080 6d 64 3a 20 20 64 61 74 61 62 61 73 65 5f 6e 65  md:  database_ne
28090 76 65 72 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a  ver_corrupt.**.*
280a0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
280b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
280c0 72 65 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 66  re always well-f
280d0 6f 72 6d 65 64 2e 20 20 54 68 69 73 20 65 6e 61  ormed.  This ena
280e0 62 6c 65 73 20 65 78 74 72 61 20 61 73 73 65 72  bles extra asser
280f0 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
28100 73 20 74 68 61 74 20 74 65 73 74 20 63 6f 6e 64  s that test cond
28110 69 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  itions that are 
28120 61 6c 77 61 79 73 20 74 72 75 65 20 66 6f 72 20  always true for 
28130 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
28140 62 61 73 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bases..*/.static
28150 20 69 6e 74 20 64 61 74 61 62 61 73 65 5f 6e 65   int database_ne
28160 76 65 72 5f 63 6f 72 72 75 70 74 28 0a 20 20 43  ver_corrupt(.  C
28170 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
28180 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
28190 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
281a0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
281b0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
281c0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
281d0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
281e0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
281f0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
28200 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
28210 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28220 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
28230 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
28240 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
28250 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
28260 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
28270 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
28280 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
28290 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 31 29 3b  VER_CORRUPT, 1);
282a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
282b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
282c0 64 3a 20 20 70 63 61 63 68 65 5f 73 74 61 74 73  d:  pcache_stats
282d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
282e0 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73  est_pcache_stats
282f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
28300 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
28310 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
28320 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
28330 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
28340 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
28350 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
28360 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
28370 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
28380 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
283b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
283c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
283d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
283e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
283f0 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d  t nMin;.  int nM
28400 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72 72 65  ax;.  int nCurre
28410 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63 79 63  nt;.  int nRecyc
28420 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a  lable;.  Tcl_Obj
28430 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c 69 74   *pRet;..  sqlit
28440 65 33 50 63 61 63 68 65 53 74 61 74 73 28 26 6e  e3PcacheStats(&n
28450 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78 2c 20  Current, &nMax, 
28460 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63 6c 61  &nMin, &nRecycla
28470 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20 3d 20  ble);..  pRet = 
28480 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
28490 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
284a0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
284b0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
284c0 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65 6e 74  ringObj("current
284d0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
284e0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
284f0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
28500 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
28510 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20 54 63  nCurrent));.  Tc
28520 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
28530 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
28540 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
28550 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d 31 29  ngObj("max", -1)
28560 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
28570 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
28580 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
28590 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78 29 29  NewIntObj(nMax))
285a0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
285b0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
285c0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
285d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e  ewStringObj("min
285e0 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
285f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
28600 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
28610 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
28620 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMin));.  Tcl_Li
28630 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
28640 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
28650 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
28660 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22 2c 20  j("recyclable", 
28670 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
28680 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
28690 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
286a0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 52 65  cl_NewIntObj(nRe
286b0 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20 20 54  cyclable));..  T
286c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
286d0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
286e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
286f0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
28700 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
28710 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 76 6f  NOTIFY.static vo
28720 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  id test_unlock_n
28730 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20 2a 2a  otify_cb(void **
28740 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 29 7b  aArg, int nArg){
28750 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66 6f 72  .  int ii;.  for
28760 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67 3b 20  (ii=0; ii<nArg; 
28770 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 45  ii++){.    Tcl_E
28780 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74 65 72  valEx((Tcl_Inter
28790 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20 22 75  p *)aArg[ii], "u
287a0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d  nlock_notify", -
287b0 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
287c0 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  AL);.  }.}.#endi
287d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
287e0 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59  LE_UNLOCK_NOTIFY
287f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   */../*.** tclcm
28800 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f  d:  sqlite3_unlo
28810 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a 2f 0a  ck_notify db.*/.
28820 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
28830 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
28840 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  FY.static int te
28850 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
28860 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
28870 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
28880 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
28890 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
288a0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
288b0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
288c0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
288d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288f0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
28900 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
28910 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
28920 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
28930 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
28940 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
28950 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
28960 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
28970 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28980 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
28990 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
289a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
289b0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
289c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
289d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
289e0 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
289f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28a00 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
28a10 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
28a20 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  (db, test_unlock
28a30 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69  _notify_cb, (voi
28a40 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54  d *)interp);.  T
28a50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
28a60 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
28a70 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
28a80 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
28a90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
28aa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ndif../*.** tclc
28ab0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
28ac0 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f  _checkpoint db ?
28ad0 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME?.*/.static 
28ae0 69 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  int test_wal_che
28af0 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
28b00 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28b10 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
28b20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28b30 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28b40 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28b50 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28b60 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28b70 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28b80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28b90 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28ba0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28bb0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28bc0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28bd0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
28be0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
28bf0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
28c00 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
28c10 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
28c20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28c30 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28c40 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  "DB ?NAME?");.  
28c50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28c60 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
28c70 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
28c80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
28c90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
28ca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
28cb0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
28cc0 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
28cd0 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
28ce0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
28cf0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
28d00 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
28d10 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54  nt(db, zDb);.  T
28d20 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
28d30 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
28d40 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
28d50 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
28d60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
28d70 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
28d80 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
28d90 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20  oint_v2 db MODE 
28da0 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  ?NAME?.**.** Thi
28db0 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20  s command calls 
28dc0 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
28dd0 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  nt_v2() function
28de0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
28df0 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75  ied.** mode argu
28e00 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66  ment (passive, f
28e10 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e  ull or restart).
28e20 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65   If present, the
28e30 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
28e40 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64  * NAME is passed
28e50 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
28e60 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63  rgument to wal_c
28e70 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20  heckpoint_v2(). 
28e80 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d  If it the.** NAM
28e90 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  E argument is no
28ea0 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c  t present, a NUL
28eb0 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73  L pointer is pas
28ec0 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
28ed0 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70  ** If wal_checkp
28ee0 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e  oint_v2() return
28ef0 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
28f00 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
28f10 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  SY or.** SQLITE_
28f20 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  OK, then this co
28f30 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43  mmand returns TC
28f40 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c  L_ERROR. The Tcl
28f50 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a   result is set.*
28f60 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  * to the error m
28f70 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20  essage obtained 
28f80 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
28f90 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  msg()..**.** Oth
28fa0 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d  erwise, this com
28fb0 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c  mand returns a l
28fc0 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74  ist of three int
28fd0 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
28fe0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31   integer.** is 1
28ff0 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
29000 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72  was returned, or
29010 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68   0 otherwise. Th
29020 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
29030 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
29040 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
29050 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70  ned via the outp
29060 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62 79  ut parameters by
29070 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
29080 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75  v2() -.** the nu
29090 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
290a0 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68  n the log and th
290b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
290c0 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a  es in the log.**
290d0 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
290e0 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
290f0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
29100 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
29110 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
29120 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
29130 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
29140 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
29150 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
29160 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
29170 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
29180 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
29190 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
291a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
291b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
291c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
291d0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
291e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
291f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
29200 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29210 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65  int rc;..  int e
29220 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67  Mode;.  int nLog
29230 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e   = -555;.  int n
29240 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54  Ckpt = -555;.  T
29250 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
29260 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d   const char * aM
29270 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69  ode[] = { "passi
29280 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65  ve", "full", "re
29290 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61 74  start", "truncat
292a0 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72  e", 0 };.  asser
292b0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
292c0 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
292d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
292e0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
292f0 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
29300 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
29310 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
29320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
29330 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
29340 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 0a  TRUNCATE==3 );..
29350 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
29360 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
29370 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
29380 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
29390 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45  , "DB MODE ?NAME
293a0 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
293b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
293c0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
293d0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
293e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
293f0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  );.  }.  if( get
29400 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
29410 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
29420 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 7c  objv[1]), &db) |
29430 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f 4b  | (.      TCL_OK
29440 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
29450 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20  Obj(0, objv[2], 
29460 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54 43  &eMode).   && TC
29470 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 64  L_OK!=Tcl_GetInd
29480 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
29490 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65  , objv[2], aMode
294a0 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d  , "mode", 0, &eM
294b0 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20 20  ode) .  )){.    
294c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
294d0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
294e0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
294f0 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c  oint_v2(db, zDb,
29500 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26   eMode, &nLog, &
29510 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63  nCkpt);.  if( rc
29520 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
29530 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
29540 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29550 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c   *zErrCode = sql
29560 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b  ite3ErrName(rc);
29570 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
29580 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
29590 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
295a0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 43  lt(interp, zErrC
295b0 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68 61  ode, " - ", (cha
295c0 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
295d0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
295e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
295f0 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
29600 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
29610 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
29620 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
29630 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
29640 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f  tObj(rc==SQLITE_
29650 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63  BUSY?1:0));.  Tc
29660 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
29670 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
29680 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
29690 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c  bj(nLog));.  Tcl
296a0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
296b0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
296c0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
296d0 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c  j(nCkpt));.  Tcl
296e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
296f0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
29700 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29710 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
29720 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
29730 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 56  ocheckpoint db V
29740 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ALUE.*/.static i
29750 6e 74 20 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f  nt test_wal_auto
29760 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c  checkpoint(.  Cl
29770 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
29780 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
29790 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
297a0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
297b0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
297c0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
297d0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
297e0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
297f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29800 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
29810 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
29820 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
29830 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29840 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
29850 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
29860 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69   int iVal;...  i
29870 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
29880 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29890 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
298a0 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29 3b  jv, "DB VALUE");
298b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
298c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
298d0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
298e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
298f0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29900 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
29910 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
29920 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a  objv[2], &iVal).
29930 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
29940 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
29950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
29960 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
29970 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54  t(db, iVal);.  T
29980 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
29990 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72 63  nterp);.  if( rc
299a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
299b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
299c0 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65  ErrCode = sqlite
299d0 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20  3ErrName(rc);.  
299e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
299f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
29a00 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
29a10 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
29a20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29a30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
29a40 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
29a50 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f  * tclcmd:  test_
29a60 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52  sqlite3_log ?SCR
29a70 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73  IPT?.*/.static s
29a80 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63  truct LogCallbac
29a90 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  k {.  Tcl_Interp
29aa0 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c   *pInterp;.  Tcl
29ab0 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f  _Obj *pObj;.} lo
29ac0 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20  gcallback = {0, 
29ad0 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  0};.static void 
29ae0 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69  xLogcallback(voi
29af0 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65  d *unused, int e
29b00 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  rr, char *zMsg){
29b10 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77  .  Tcl_Obj *pNew
29b20 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
29b30 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  Obj(logcallback.
29b40 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  pObj);.  Tcl_Inc
29b50 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b  rRefCount(pNew);
29b60 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
29b70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20  pendElement(.   
29b80 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f     0, pNew, Tcl_
29b90 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
29ba0 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29  ite3ErrName(err)
29bb0 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c  , -1).  );.  Tcl
29bc0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
29bd0 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54  ement(0, pNew, T
29be0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29bf0 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zMsg, -1));.  Tc
29c00 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63  l_EvalObjEx(logc
29c10 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c  allback.pInterp,
29c20 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f   pNew, TCL_EVAL_
29c30 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f  GLOBAL|TCL_EVAL_
29c40 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
29c50 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77  ecrRefCount(pNew
29c60 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
29c70 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67  test_sqlite3_log
29c80 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
29c90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
29ca0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29cb0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
29cc0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
29cd0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
29ce0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
29cf0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
29d00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29d10 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
29d20 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
29d30 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
29d40 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29d50 20 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20   if( objc>2 ){. 
29d60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
29d70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
29d80 62 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a  bjv, "SCRIPT");.
29d90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29da0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29db0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
29dc0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72   ){.    Tcl_Decr
29dd0 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c  RefCount(logcall
29de0 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20  back.pObj);.    
29df0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
29e00 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c   = 0;.    logcal
29e10 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
29e20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  0;.    sqlite3_c
29e30 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
29e40 46 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a  FIG_LOG, 0, 0);.
29e50 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31    }.  if( objc>1
29e60 20 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62   ){.    logcallb
29e70 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b  ack.pObj = objv[
29e80 31 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  1];.    Tcl_Incr
29e90 52 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c  RefCount(logcall
29ea0 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20  back.pObj);.    
29eb0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74  logcallback.pInt
29ec0 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
29ed0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
29ee0 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c  (SQLITE_CONFIG_L
29ef0 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b  OG, xLogcallback
29f00 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
29f10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
29f20 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70  .**     tcl_objp
29f30 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20  roc COMMANDNAME 
29f40 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75  ARGS....**.** Ru
29f50 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  n a TCL command 
29f60 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f  using its objPro
29f70 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68  c interface.  Th
29f80 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a  row an error if.
29f90 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68  ** the command h
29fa0 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e  as no objProc in
29fb0 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
29fc0 69 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50  ic int runAsObjP
29fd0 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  roc(.  void * cl
29fe0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
29ff0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2a000 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2a010 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a020 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64  v[].){.  Tcl_Cmd
2a030 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
2a040 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2a050 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a060 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a070 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e  jv, "COMMAND ...
2a080 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2a090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a0a0 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
2a0b0 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
2a0c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2a0d0 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
2a0e0 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
2a0f0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2a100 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
2a110 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  ound: ",.       
2a120 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
2a130 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
2a140 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2a150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a160 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f  .  if( cmdInfo.o
2a170 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  bjProc==0 ){.   
2a180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a190 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
2a1a0 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
2a1b0 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c: ",.          
2a1c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2a1d0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
2a1e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2a1f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a200 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f  return cmdInfo.o
2a210 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f  bjProc(cmdInfo.o
2a220 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  bjClientData, in
2a230 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62  terp, objc-1, ob
2a240 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  jv+1);.}..#ifnde
2a250 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2a260 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e  PLAIN./*.** WARN
2a270 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ING: The followi
2a280 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69  ng function, pri
2a290 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
2a2a0 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74  an() is an exact
2a2b0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d  .** copy of exam
2a2c0 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71  ple code from eq
2a2d0 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e  p.in (eqp.html).
2a2e0 20 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73   If this code is
2a2f0 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68   modified,.** th
2a300 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  en the documenta
2a310 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20  tion copy needs 
2a320 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61  to be modified a
2a330 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  s well..*/./*.**
2a340 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20   Argument pStmt 
2a350 69 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51  is a prepared SQ
2a360 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
2a370 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69  s function compi
2a380 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49  les.** an EXPLAI
2a390 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
2a3a0 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f  mand to report o
2a3b0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
2a3c0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64  tatement,.** and
2a3d0 20 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f   prints the repo
2a3e0 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69  rt to stdout usi
2a3f0 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a  ng printf()..*/.
2a400 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e  int printExplain
2a410 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65  QueryPlan(sqlite
2a420 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  3_stmt *pStmt){.
2a430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2a440 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
2a450 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a    /* Input SQL *
2a460 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  /.  char *zExpla
2a470 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
2a480 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20      /* SQL with 
2a490 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
2a4a0 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a  AN prepended */.
2a4b0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2a4c0 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20  pExplain;       
2a4d0 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58    /* Compiled EX
2a4e0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
2a4f0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2a500 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a520 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
2a530 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  m sqlite3_prepar
2a540 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71  e_v2() */..  zSq
2a550 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
2a560 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53  pStmt);.  if( zS
2a570 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
2a580 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
2a590 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74  zExplain = sqlit
2a5a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
2a5b0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
2a5c0 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  s", zSql);.  if(
2a5d0 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72   zExplain==0 ) r
2a5e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
2a5f0 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  EM;..  rc = sqli
2a600 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73  te3_prepare_v2(s
2a610 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
2a620 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69  (pStmt), zExplai
2a630 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  n, -1, &pExplain
2a640 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
2a650 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a  free(zExplain);.
2a660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a670 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
2a680 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ..  while( SQLIT
2a690 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
2a6a0 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
2a6b0 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74  .    int iSelect
2a6c0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
2a6d0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2a6e0 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f  , 0);.    int iO
2a6f0 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  rder = sqlite3_c
2a700 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
2a710 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  in, 1);.    int 
2a720 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f  iFrom = sqlite3_
2a730 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
2a740 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e  ain, 2);.    con
2a750 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c  st char *zDetail
2a760 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
2a770 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2a780 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
2a790 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22  );..    printf("
2a7a0 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20  %d %d %d %s\n", 
2a7b0 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65  iSelectid, iOrde
2a7c0 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69  r, iFrom, zDetai
2a7d0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  l);.  }..  retur
2a7e0 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
2a7f0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a  ze(pExplain);.}.
2a800 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2a810 5f 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f  _print_eqp(.  vo
2a820 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2a830 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2a840 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2a850 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2a860 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2a870 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
2a880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
2a890 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2a8a0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2a8b0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2a8c0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a   objv, "STMT");.
2a8d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2a8e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2a8f0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
2a900 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2a910 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2a920 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
2a930 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
2a940 3d 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75  = printExplainQu
2a950 65 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a  eryPlan(pStmt);.
2a960 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65    /* This is nee
2a970 64 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  ded on Windows s
2a980 6f 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61  o that a test ca
2a990 73 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20  se using this . 
2a9a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e   ** function can
2a9b0 20 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70   open a read pip
2a9c0 65 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75  e and get the ou
2a9d0 74 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69  tput of.  ** pri
2a9e0 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
2a9f0 61 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79  an() immediately
2aa00 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28  ..  */.  fflush(
2aa10 73 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53  stdout);.  Tcl_S
2aa20 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2aa30 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2aa40 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
2aa50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2aa60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2aa70 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
2aa80 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  /../*.** sqlite3
2aa90 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45  _test_control VE
2aaa0 52 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74  RB ARGS....*/.st
2aab0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 65  atic int test_te
2aac0 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  st_control(.  vo
2aad0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2aae0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2aaf0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2ab00 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2ab10 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2ab20 73 74 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20  struct Verb {.  
2ab30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2ab40 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ame;.    int i;.
2ab50 20 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a    } aVerb[] = {.
2ab60 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45      { "SQLITE_TE
2ab70 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
2ab80 5f 46 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f  _FAULT", SQLITE_
2ab90 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
2aba0 4d 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20  ME_FAULT }, .   
2abb0 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43   { "SQLITE_TESTC
2abc0 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22  TRL_SORTER_MMAP"
2abd0 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53  ,     SQLITE_TES
2abe0 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
2abf0 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20  P     }, .    { 
2ac00 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2ac10 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20 20 20  _IMPOSTER",     
2ac20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2ac30 52 4c 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20  RL_IMPOSTER     
2ac40 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74     },.  };.  int
2ac50 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46   iVerb;.  int iF
2ac60 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lag;.  int rc;..
2ac70 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
2ac80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2ac90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2aca0 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53  objv, "VERB ARGS
2acb0 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
2acc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2acd0 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74  ..  rc = Tcl_Get
2ace0 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75  IndexFromObjStru
2acf0 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70  ct(.      interp
2ad00 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62  , objv[1], aVerb
2ad10 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30  , sizeof(aVerb[0
2ad20 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26  ]), "VERB", 0, &
2ad30 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28  iVerb.  );.  if(
2ad40 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
2ad50 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61  turn rc;..  iFla
2ad60 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d  g = aVerb[iVerb]
2ad70 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46  .i;.  switch( iF
2ad80 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20  lag ){.    case 
2ad90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2ada0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
2adb0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c   {.      int val
2adc0 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
2add0 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
2ade0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2adf0 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
2ae00 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20   "ONOFF");.     
2ae10 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ae20 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2ae30 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
2ae40 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2ae50 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
2ae60 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
2ae70 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71  _ERROR;.      sq
2ae80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2ae90 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2aea0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
2aeb0 4c 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20  LT, val);.      
2aec0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2aed0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
2aee0 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
2aef0 41 50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AP: {.      int 
2af00 76 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  val;.      sqlit
2af10 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66  e3 *db;.      if
2af20 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2af30 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
2af40 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
2af50 20 6f 62 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54   objv, "DB LIMIT
2af60 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
2af70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2af80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2af90 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2afa0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2afb0 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62  ng(objv[2]), &db
2afc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2afd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
2afe0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2aff0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
2b000 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
2b010 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2b020 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2b030 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2b040 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
2b050 4d 41 50 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20  MAP, db, val);. 
2b060 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2b070 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  }..    case SQLI
2b080 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2b090 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  STER: {.      in
2b0a0 74 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20  t onOff, tnum;. 
2b0b0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2b0c0 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20  *zDbName;.      
2b0d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
2b0e0 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 36 20 29     if( objc!=6 )
2b0f0 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72  {.        Tcl_Wr
2b100 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2b110 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 2, objv, "DB 
2b120 64 62 4e 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75  dbName onOff tnu
2b130 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  m");.        ret
2b140 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2b160 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2b170 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2b180 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64  ing(objv[2]), &d
2b190 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2b1a0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62  ERROR;.      zDb
2b1b0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
2b1c0 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
2b1d0 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
2b1e0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2b1f0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f  p, objv[4], &onO
2b200 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ff) ) return TCL
2b210 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66  _ERROR;.      if
2b220 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2b230 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2b240 5b 35 5d 2c 20 26 74 6e 75 6d 29 20 29 20 72 65  [5], &tnum) ) re
2b250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b260 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65        sqlite3_te
2b270 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2b280 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53  E_TESTCTRL_IMPOS
2b290 54 45 52 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65  TER, db, zDbName
2b2a0 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a  , onOff, tnum);.
2b2b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2b2c0 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65   }.  }..  Tcl_Re
2b2d0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
2b2e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2b2f0 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
2b300 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75  E_OS_UNIX.#inclu
2b310 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
2b320 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
2b330 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69  source.h>..stati
2b340 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 72 75  c int test_getru
2b350 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  sage(.  void * c
2b360 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2b370 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2b380 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2b390 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b3a0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62  jv[].){.  char b
2b3b0 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72 75  uf[1024];.  stru
2b3c0 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20 6d  ct rusage r;.  m
2b3d0 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69 7a  emset(&r, 0, siz
2b3e0 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72 75  eof(r));.  getru
2b3f0 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
2b400 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69 74 65  , &r);..  sqlite
2b410 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2b420 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20 20 20  f(buf), buf,.   
2b430 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e 25 30   "ru_utime=%d.%0
2b440 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64 2e 25  6d ru_stime=%d.%
2b450 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d 25 64  06d ru_minflt=%d
2b460 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22 2c 20   ru_majflt=%d", 
2b470 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 75  .    (int)r.ru_u
2b480 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e  time.tv_sec, (in
2b490 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f  t)r.ru_utime.tv_
2b4a0 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74 29  usec, .    (int)
2b4b0 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 73 65  r.ru_stime.tv_se
2b4c0 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69  c, (int)r.ru_sti
2b4d0 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
2b4e0 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e 66 6c   (int)r.ru_minfl
2b4f0 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d 61 6a  t, (int)r.ru_maj
2b500 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 53  flt.  );.  Tcl_S
2b510 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2b520 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
2b530 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a  gObj(buf, -1));.
2b540 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2b550 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  .}.#endif..#if S
2b560 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a  QLITE_OS_WIN./*.
2b570 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 70  ** Information p
2b580 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65 20 6d  assed from the m
2b590 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74 6f 20  ain thread into 
2b5a0 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69 6c 65  the windows file
2b5b0 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63 6b 67   locker.** backg
2b5c0 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a 2a 2f  round thread..*/
2b5d0 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c  .struct win32Fil
2b5e0 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68 61 72  eLocker {.  char
2b5f0 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20 20 20   *evName;       
2b600 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65 6e 74  /* Name of event
2b610 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72 65 61   to signal threa
2b620 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20 20 48  d startup */.  H
2b630 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20  ANDLE h;        
2b640 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 66 20     /* Handle of 
2b650 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c  the file to be l
2b660 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  ocked */.  int d
2b670 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20 20 2f  elay1;         /
2b680 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20 6c  * Delay before l
2b690 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  ocking */.  int 
2b6a0 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20 20 20  delay2;         
2b6b0 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65 20  /* Delay before 
2b6c0 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69  unlocking */.  i
2b6d0 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20 20 20  nt ok;          
2b6e0 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64 20 6f     /* Finished o
2b6f0 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 3b 20  k */.  int err; 
2b700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b710 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ue if an error o
2b720 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ccurs */.};.#end
2b730 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  if...#if SQLITE_
2b740 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64 65 20  OS_WIN.#include 
2b750 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a 0a 2a  <process.h>./*.*
2b760 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75 6e 64  * The background
2b770 20 74 68 72 65 61 64 20 74 68 61 74 20 64 6f 65   thread that doe
2b780 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  s file locking..
2b790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
2b7a0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72  in32_file_locker
2b7b0 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
2b7c0 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32  {.  struct win32
2b7d0 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20  FileLocker *p = 
2b7e0 28 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c  (struct win32Fil
2b7f0 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74  eLocker*)pAppDat
2b800 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61  a;.  if( p->evNa
2b810 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45  me ){.    HANDLE
2b820 20 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28   ev = OpenEvent(
2b830 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41  EVENT_MODIFY_STA
2b840 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76  TE, FALSE, p->ev
2b850 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20  Name);.    if ( 
2b860 65 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45  ev ){.      SetE
2b870 76 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20  vent(ev);.      
2b880 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2b890 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2b8a0 20 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65   p->delay1 ) Sle
2b8b0 65 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20  ep(p->delay1);. 
2b8c0 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d   if( LockFile(p-
2b8d0 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30  >h, 0, 0, 100000
2b8e0 30 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53  000, 0) ){.    S
2b8f0 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b  leep(p->delay2);
2b900 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
2b910 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30  p->h, 0, 0, 1000
2b920 30 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70  00000, 0);.    p
2b930 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ->ok = 1;.  }els
2b940 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20  e{.    p->err = 
2b950 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61  1;.  }.  CloseHa
2b960 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d  ndle(p->h);.  p-
2b970 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  >h = 0;.  p->del
2b980 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65  ay1 = 0;.  p->de
2b990 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  lay2 = 0;.}.#end
2b9a0 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
2b9b0 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20  S_WIN./*.**     
2b9c0 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65   lock_win32_file
2b9d0 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31   FILENAME DELAY1
2b9e0 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65   DELAY2.**.** Ge
2b9f0 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t an exclusive m
2ba00 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e  anditory lock on
2ba10 20 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32   file for DELAY2
2ba20 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a   milliseconds..*
2ba30 2a 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69  * Wait DELAY1 mi
2ba40 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72  lliseconds befor
2ba50 65 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20  e acquiring the 
2ba60 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
2ba70 69 6e 74 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  int win32_file_l
2ba80 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ock(.  void * cl
2ba90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2baa0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2bab0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2bac0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2bad0 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  v[].){.  static 
2bae0 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
2baf0 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77 69  Locker x = { "wi
2bb00 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20  n32_file_lock", 
2bb10 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b  0, 0, 0, 0, 0 };
2bb20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2bb30 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72  Filename;.  char
2bb40 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e   zBuf[200];.  in
2bb50 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20 48  t retry = 0;.  H
2bb60 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52  ANDLE ev;.  DWOR
2bb70 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20  D wResult;.  .  
2bb80 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
2bb90 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
2bba0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2bbb0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2bbc0 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31  "FILENAME DELAY1
2bbd0 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20 72   DELAY2");.    r
2bbe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2bbf0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
2bc00 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
2bc10 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2bc20 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
2bc30 25 64 20 25 64 20 25 64 20 25 64 20 25 64 22 2c  %d %d %d %d %d",
2bc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bc50 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72        x.ok, x.er
2bc60 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64  r, x.delay1, x.d
2bc70 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20  elay2, x.h);.   
2bc80 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2bc90 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
2bca0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
2bcb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
2bcc0 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20 26  }.  while( x.h &
2bcd0 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20 20  & retry<30 ){.  
2bce0 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53    retry++;.    S
2bcf0 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20  leep(100);.  }. 
2bd00 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20 20   if( x.h ){.    
2bd10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2bd20 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22 2c  (interp, "busy",
2bd30 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2bd40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2bd50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
2bd60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
2bd70 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
2bd80 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74 75  x.delay1) ) retu
2bd90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2bda0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2bdb0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2bdc0 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32  jv[3], &x.delay2
2bdd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2bde0 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  RROR;.  zFilenam
2bdf0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
2be00 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e  g(objv[1]);.  x.
2be10 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28 7a  h = CreateFile(z
2be20 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49  Filename, GENERI
2be30 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f 57  C_READ|GENERIC_W
2be40 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20  RITE,.          
2be50 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f 52      FILE_SHARE_R
2be60 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57  EAD|FILE_SHARE_W
2be70 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c  RITE, 0, OPEN_AL
2be80 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20 20  WAYS,.          
2be90 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
2bea0 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20  TE_NORMAL, 0);. 
2beb0 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20 20   if( !x.h ){.   
2bec0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2bed0 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f  t(interp, "canno
2bee0 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20  t open file: ", 
2bef0 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72  zFilename, (char
2bf00 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
2bf10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2bf20 20 20 65 76 20 3d 20 43 72 65 61 74 65 45 76 65    ev = CreateEve
2bf30 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46  nt(NULL, TRUE, F
2bf40 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b  ALSE, x.evName);
2bf50 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a 20  .  if ( !ev ){. 
2bf60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2bf70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
2bf80 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e 74  not create event
2bf90 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28  : ", x.evName, (
2bfa0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65  char*)0);.    re
2bfb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2bfc0 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72 65    }.  _beginthre
2bfd0 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  ad(win32_file_lo
2bfe0 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29  cker, 0, (void*)
2bff0 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b  &x);.  Sleep(0);
2c000 0a 20 20 69 66 20 28 20 28 77 52 65 73 75 6c 74  .  if ( (wResult
2c010 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   = WaitForSingle
2c020 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30 30  Object(ev, 10000
2c030 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f  ))!=WAIT_OBJECT_
2c040 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2c050 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2c060 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 30  (zBuf), zBuf, "0
2c070 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a  x%x", wResult);.
2c080 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2c090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 61  sult(interp, "wa
2c0a0 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42  it failed: ", zB
2c0b0 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  uf, (char*)0);. 
2c0c0 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65     CloseHandle(e
2c0d0 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  v);.    return T
2c0e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2c0f0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2c100 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2c110 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2c120 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74  exists_win32_pat
2c130 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74  h PATH.**.** Ret
2c140 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
2c150 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2c160 61 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f 73  ath exists, whos
2c170 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2c180 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78  d name.** may ex
2c190 63 65 65 64 20 32 36 30 20 63 68 61 72 61 63 74  ceed 260 charact
2c1a0 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2c1b0 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2c1c0 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2c1d0 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61   win32_exists_pa
2c1e0 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  th(.  void *clie
2c1f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2c200 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2c210 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2c220 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2c230 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ].){.  if( objc!
2c240 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
2c250 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2c260 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54  p, 1, objv, "PAT
2c270 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  H");.    return 
2c280 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2c290 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2c2a0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2c2b0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20  wBooleanObj(.   
2c2c0 20 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62     GetFileAttrib
2c2d0 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e  utesW( Tcl_GetUn
2c2e0 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21  icode(objv[1]))!
2c2f0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2c300 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72  TRIBUTES ));.  r
2c310 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2c320 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64  ./*.**      find
2c330 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54  _win32_file PATT
2c340 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ERN.**.** Return
2c350 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72  s a list of entr
2c360 69 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f  ies in a directo
2c370 72 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ry that match th
2c380 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74  e specified patt
2c390 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75  ern,.** whose fu
2c3a0 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2c3b0 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
2c3c0 38 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  8 characters if 
2c3d0 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
2c3e0 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a  ith.** "\\?\"..*
2c3f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2c400 33 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20  32_find_file(.  
2c410 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2c420 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2c430 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2c440 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2c450 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2c460 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c   HANDLE hFindFil
2c470 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  e = INVALID_HAND
2c480 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33  LE_VALUE;.  WIN3
2c490 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e  2_FIND_DATAW fin
2c4a0 64 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a  dData;.  Tcl_Obj
2c4b0 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f   *listObj;.  DWO
2c4c0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
2c4d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2c4e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2c4f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2c500 62 6a 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b  bjv, "PATTERN");
2c510 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c520 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69  ERROR;.  }.  hFi
2c530 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72  ndFile = FindFir
2c540 73 74 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55  stFileW(Tcl_GetU
2c550 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c  nicode(objv[1]),
2c560 20 26 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69   &findData);.  i
2c570 66 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e  f( hFindFile==IN
2c580 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
2c590 55 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  UE ){.    Tcl_Se
2c5a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2c5b0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2c5c0 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2c5d0 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2c5e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c5f0 0a 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c  .  listObj = Tcl
2c600 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c  _NewObj();.  Tcl
2c610 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69  _IncrRefCount(li
2c620 73 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20  stObj);.  do {. 
2c630 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2c640 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c650 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c  rp, listObj, Tcl
2c660 5f 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a  _NewUnicodeObj(.
2c670 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61          findData
2c680 2e 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29  .cFileName, -1))
2c690 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2c6a0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c6b0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20  nterp, listObj, 
2c6c0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
2c6d0 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44  j(.        findD
2c6e0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
2c6f0 75 74 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c  utes));.  } whil
2c700 65 28 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57  e( FindNextFileW
2c710 28 68 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e  (hFindFile, &fin
2c720 64 44 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74  dData) );.  last
2c730 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45  Errno = GetLastE
2c740 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61  rror();.  if( la
2c750 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f  stErrno!=NO_ERRO
2c760 52 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d  R && lastErrno!=
2c770 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49  ERROR_NO_MORE_FI
2c780 4c 45 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43  LES ){.    FindC
2c790 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b  lose(hFindFile);
2c7a0 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2c7b0 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a  Count(listObj);.
2c7c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2c7d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2c7e0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2c7f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2c800 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c810 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e  ERROR;.  }.  Fin
2c820 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65  dClose(hFindFile
2c830 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
2c840 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69  esult(interp, li
2c850 73 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e  stObj);.  return
2c860 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2c870 2a 20 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69  *      delete_wi
2c880 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d  n32_file FILENAM
2c890 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20  E.**.** Deletes 
2c8a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
2c8b0 6c 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20  le, whose fully 
2c8c0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d  qualified name m
2c8d0 61 79 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a  ay exceed 260.**
2c8e0 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
2c8f0 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
2c900 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74  th "\\?\"..*/.st
2c910 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 64  atic int win32_d
2c920 65 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f  elete_file(.  vo
2c930 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2c940 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2c950 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2c960 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2c970 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2c980 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2c990 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2c9a0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2c9b0 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b  jv, "FILENAME");
2c9c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c9d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2c9e0 20 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54 63   !DeleteFileW(Tc
2c9f0 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2ca00 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63  v[1])) ){.    Tc
2ca10 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2ca20 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2ca30 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2ca40 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2ca50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ca60 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2ca70 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2ca80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2ca90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d  .}../*.**      m
2caa0 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49  ake_win32_dir DI
2cab0 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72  RECTORY.**.** Cr
2cac0 65 61 74 65 73 20 74 68 65 20 73 70 65 63 69 66  eates the specif
2cad0 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77  ied directory, w
2cae0 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2caf0 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2cb00 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72  ceed 248.** char
2cb10 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2cb20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2cb30 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2cb40 69 6e 74 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28  int win32_mkdir(
2cb50 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2cb60 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2cb70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2cb80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2cb90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2cba0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2cbb0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2cbc0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2cbd0 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54  1, objv, "DIRECT
2cbe0 4f 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ORY");.    retur
2cbf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2cc00 0a 20 20 69 66 28 20 21 43 72 65 61 74 65 44 69  .  if( !CreateDi
2cc10 72 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74  rectoryW(Tcl_Get
2cc20 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
2cc30 2c 20 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54  , NULL) ){.    T
2cc40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2cc50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2cc60 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2cc70 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2cc80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2cc90 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65  ;.  }.  Tcl_Rese
2cca0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
2ccb0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2ccc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2ccd0 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72  remove_win32_dir
2cce0 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a   DIRECTORY.**.**
2ccf0 20 52 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65   Removes the spe
2cd00 63 69 66 69 65 64 20 64 69 72 65 63 74 6f 72 79  cified directory
2cd10 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2cd20 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
2cd30 20 65 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63   exceed 248.** c
2cd40 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2cd50 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2cd60 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2cd70 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 72 6d 64  ic int win32_rmd
2cd80 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  ir(.  void *clie
2cd90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2cda0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2cdb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2cdc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2cdd0 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ].){.  if( objc!
2cde0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
2cdf0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2ce00 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 49 52  p, 1, objv, "DIR
2ce10 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20 72 65  ECTORY");.    re
2ce20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ce30 20 20 7d 0a 20 20 69 66 28 20 21 52 65 6d 6f 76    }.  if( !Remov
2ce40 65 44 69 72 65 63 74 6f 72 79 57 28 54 63 6c 5f  eDirectoryW(Tcl_
2ce50 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b  GetUnicode(objv[
2ce60 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  1])) ){.    Tcl_
2ce70 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2ce80 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2ce90 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2cea0 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2ceb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2cec0 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65   }.  Tcl_ResetRe
2ced0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2cee0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2cef0 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
2cf00 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f       optimizatio
2cf10 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20 4f 50 54  n_control DB OPT
2cf20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45   BOOLEAN.**.** E
2cf30 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
2cf40 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 61 74   query optimizat
2cf50 69 6f 6e 73 20 75 73 69 6e 67 20 74 68 65 20 73  ions using the s
2cf60 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2cf70 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  rol().** interfa
2cf80 63 65 2e 20 20 44 69 73 61 62 6c 65 20 69 66 20  ce.  Disable if 
2cf90 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61 6c 73 65  BOOLEAN is false
2cfa0 20 61 6e 64 20 65 6e 61 62 6c 65 20 69 66 20 42   and enable if B
2cfb0 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75 65 2e 0a  OOLEAN is true..
2cfc0 2a 2a 20 4f 50 54 20 69 73 20 74 68 65 20 6e 61  ** OPT is the na
2cfd0 6d 65 20 6f 66 20 74 68 65 20 6f 70 74 69 6d 69  me of the optimi
2cfe0 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20 64 69 73  zation to be dis
2cff0 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  abled..*/.static
2d000 20 69 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f   int optimizatio
2d010 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69  n_control(.  voi
2d020 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2d030 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d040 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2d050 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2d060 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2d070 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
2d080 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
2d090 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20 6f  r *zOpt;.  int o
2d0a0 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  noff;.  int mask
2d0b0 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63   = 0;.  static c
2d0c0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
2d0d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
2d0e0 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  ptName;.    int 
2d0f0 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b 5d  mask;.  } aOpt[]
2d100 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c 22   = {.    { "all"
2d110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d120 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74 73    SQLITE_AllOpts
2d130 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2d140 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20   "none",        
2d150 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
2d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2d170 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66 6c  .    { "query-fl
2d180 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53 51  attener",     SQ
2d190 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74 65  LITE_QueryFlatte
2d1a0 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f  ner },.    { "co
2d1b0 6c 75 6d 6e 2d 63 61 63 68 65 22 2c 20 20 20 20  lumn-cache",    
2d1c0 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d      SQLITE_Colum
2d1d0 6e 43 61 63 68 65 20 20 20 20 7d 2c 0a 20 20 20  nCache    },.   
2d1e0 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65   { "groupby-orde
2d1f0 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  r",       SQLITE
2d200 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20  _GroupByOrder   
2d210 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72  },.    { "factor
2d220 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20  -constants",    
2d230 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
2d240 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22  Const },.    { "
2d250 64 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20  distinct-opt",  
2d260 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73        SQLITE_Dis
2d270 74 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20  tinctOpt    },. 
2d280 20 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d     { "cover-idx-
2d290 73 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49  scan",      SQLI
2d2a0 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20  TE_CoverIdxScan 
2d2b0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65    },.    { "orde
2d2c0 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20  r-by-idx-join", 
2d2d0 20 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79    SQLITE_OrderBy
2d2e0 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b  IdxJoin },.    {
2d2f0 20 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20   "transitive",  
2d300 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
2d310 72 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c  ransitive     },
2d320 0a 20 20 20 20 7b 20 22 73 75 62 71 75 65 72 79  .    { "subquery
2d330 2d 63 6f 72 6f 75 74 69 6e 65 22 2c 20 20 53 51  -coroutine",  SQ
2d340 4c 49 54 45 5f 53 75 62 71 43 6f 72 6f 75 74 69  LITE_SubqCorouti
2d350 6e 65 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d  ne  },.    { "om
2d360 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20  it-noop-join",  
2d370 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e      SQLITE_OmitN
2d380 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20  oopJoin   },.   
2d390 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20 20   { "stat3",     
2d3a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2d3b0 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20 20  _Stat34         
2d3c0 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 34 22  },.    { "stat4"
2d3d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d3e0 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20  SQLITE_Stat34   
2d3f0 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20        },.  };.. 
2d400 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
2d410 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2d420 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2d430 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f  objv, "DB OPT BO
2d440 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
2d450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d460 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2d470 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2d480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2d490 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
2d4a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d4b0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2d4c0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2d4d0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f  p, objv[3], &ono
2d4e0 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ff) ) return TCL
2d4f0 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d  _ERROR;.  zOpt =
2d500 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2d510 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
2d520 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
2d530 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
2d540 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
2d550 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61  ( strcmp(zOpt, a
2d560 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29  Opt[i].zOptName)
2d570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73  ==0 ){.      mas
2d580 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b  k = aOpt[i].mask
2d590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2d5a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
2d5b0 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d  noff ) mask = ~m
2d5c0 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69  ask;.  if( i>=si
2d5d0 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f  zeof(aOpt)/sizeo
2d5e0 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20  f(aOpt[0]) ){.  
2d5f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2d600 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
2d610 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  own optimization
2d620 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65   - should be one
2d630 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20   of:",.         
2d640 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
2d650 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  r*)0);.    for(i
2d660 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
2d670 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
2d680 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
2d690 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2d6a0 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f  (interp, " ", aO
2d6b0 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20  pt[i].zOptName, 
2d6c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
2d6d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d6e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
2d6f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2d700 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2d710 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
2d720 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65   db, mask);.  re
2d730 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2d740 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
2d750 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2d760 6e 65 73 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nes sqlite3_api_
2d770 72 6f 75 74 69 6e 65 73 3b 0a 2f 2a 0a 2a 2a 20  routines;./*.** 
2d780 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f      load_static_
2d790 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d  extension DB NAM
2d7a0 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64  E ....**.** Load
2d7b0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74 61   one or more sta
2d7c0 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65  tically linked e
2d7d0 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  xtensions..*/.st
2d7e0 61 74 69 63 20 69 6e 74 20 74 63 6c 4c 6f 61 64  atic int tclLoad
2d7f0 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43  StaticExtensionC
2d800 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  md(.  void * cli
2d810 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2d820 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2d830 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2d840 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2d850 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69  [].){.  extern i
2d860 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63  nt sqlite3_amatc
2d870 68 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  h_init(sqlite3*,
2d880 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2d890 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2d8a0 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2d8b0 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72  t sqlite3_closur
2d8c0 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2d8d0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2d8e0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2d8f0 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2d900 74 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69  t sqlite3_eval_i
2d910 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2d920 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2d930 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2d940 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2d950 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2d960 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2d970 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2d980 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2d990 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2d9a0 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2d9b0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2d9c0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2d9d0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2d9e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2d9f0 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73  ite3_ieee_init(s
2da00 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2da10 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2da20 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
2da30 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2da40 33 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28  3_nextchar_init(
2da50 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2da60 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2da70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2da80 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2da90 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e  e3_percentile_in
2daa0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
2dab0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
2dac0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
2dad0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2dae0 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2daf0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2db00 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2db10 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2db20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2db30 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74  ite3_series_init
2db40 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2db50 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2db60 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2db70 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2db80 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69  te3_spellfix_ini
2db90 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
2dba0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
2dbb0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
2dbc0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2dbd0 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74  ite3_totype_init
2dbe0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2dbf0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2dc00 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2dc10 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2dc20 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  te3_wholenumber_
2dc30 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2dc40 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2dc50 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2dc60 29 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  );.  static cons
2dc70 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
2dc80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74 4e  onst char *zExtN
2dc90 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a 70  ame;.    int (*p
2dca0 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c 63  Init)(sqlite3*,c
2dcb0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
2dcc0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
2dcd0 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73 69  *);.  } aExtensi
2dce0 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  on[] = {.    { "
2dcf0 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20 20  amatch",        
2dd00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2dd10 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20 20  amatch_init     
2dd20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2dd30 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20   { "closure",   
2dd40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2dd50 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74  te3_closure_init
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2dd70 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20 20  .    { "eval",  
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd90 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69  sqlite3_eval_ini
2dda0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2ddb0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c 65    },.    { "file
2ddc0 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  io",            
2ddd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
2dde0 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  io_init         
2ddf0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2de00 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20 20  fuzzer",        
2de10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2de20 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20 20  fuzzer_init     
2de30 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2de40 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20 20   { "ieee754",   
2de50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2de60 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20 20  te3_ieee_init   
2de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2de80 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61 72  .    { "nextchar
2de90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2dea0 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72  sqlite3_nextchar
2deb0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2dec0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72 63    },.    { "perc
2ded0 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20 20  entile",        
2dee0 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72 63      sqlite3_perc
2def0 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20 20  entile_init     
2df00 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2df10 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20 20  regexp",        
2df20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2df30 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20 20  regexp_init     
2df40 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2df50 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20 20 20   { "series",    
2df60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2df70 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74 20  te3_series_init 
2df80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2df90 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78  .    { "spellfix
2dfa0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2dfb0 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78  sqlite3_spellfix
2dfc0 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
2dfd0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79    },.    { "toty
2dfe0 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  pe",            
2dff0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79      sqlite3_toty
2e000 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  pe_init         
2e010 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2e020 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20  wholenumber",   
2e030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e040 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74  wholenumber_init
2e050 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d            },.  }
2e060 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2e070 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2e080 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Name;.  int i, j
2e090 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  , rc;.  char *zE
2e0a0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66 28  rrMsg = 0;.  if(
2e0b0 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54   objc<3 ){.    T
2e0c0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2e0d0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2e0e0 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b   "DB NAME ...");
2e0f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e100 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2e110 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2e120 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2e130 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2e140 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2e150 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32  ERROR;.  for(j=2
2e160 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a  ; j<objc; j++){.
2e170 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f      zName = Tcl_
2e180 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a  GetString(objv[j
2e190 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
2e1a0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45 78   i<ArraySize(aEx
2e1b0 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a  tension); i++){.
2e1c0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2e1d0 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73 69  (zName, aExtensi
2e1e0 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d  on[i].zExtName)=
2e1f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2e200 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72  }.    if( i>=Arr
2e210 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69 6f  aySize(aExtensio
2e220 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  n) ){.      Tcl_
2e230 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2e240 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65 78  erp, "no such ex
2e250 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d  tension: ", zNam
2e260 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
2e270 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2e280 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
2e290 69 66 28 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69  if( aExtension[i
2e2a0 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  ].pInit ){.     
2e2b0 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e   rc = aExtension
2e2c0 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a  [i].pInit(db, &z
2e2d0 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20  ErrMsg, 0);.    
2e2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2e2f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2e300 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
2e310 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72  QLITE_OK || zErr
2e320 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Msg ){.      Tcl
2e330 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2e340 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a  terp, "initializ
2e350 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d  ation of ", zNam
2e360 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c 20  e, " failed: ", 
2e370 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 20  zErrMsg,.       
2e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e390 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
2e3a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2e3b0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 65  rrMsg);.      re
2e3c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e3d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e3e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2e3f0 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74  .**     sorter_t
2e400 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f  est_fakeheap BOO
2e410 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  L.**.*/.static i
2e420 6e 74 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  nt sorter_test_f
2e430 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64 20  akeheap(.  void 
2e440 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2e450 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2e460 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2e470 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2e480 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2e490 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a   bArg;.  if( obj
2e4a0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2e4b0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2e4c0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42  erp, 1, objv, "B
2e4d0 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OOL");.    retur
2e4e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2e4f0 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ..  if( Tcl_GetB
2e500 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
2e510 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
2e520 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74  bArg) ){.    ret
2e530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e540 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20 29   }..  if( bArg )
2e550 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2e560 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2e570 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eap==0 ){.      
2e580 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2e590 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c 49  fig.pHeap = SQLI
2e5a0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31  TE_INT_TO_PTR(-1
2e5b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2e5c0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
2e5d0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2e5e0 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f  eap==SQLITE_INT_
2e5f0 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20 20  TO_PTR(-1) ){.  
2e600 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2e610 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20  lConfig.pHeap = 
2e620 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2e630 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
2e640 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72  interp);.  retur
2e650 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2e660 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65  **     sorter_te
2e670 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20  st_sort4_helper 
2e680 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51  DB SQL1 NSTEP SQ
2e690 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  L2.**.** Compile
2e6a0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 24   SQL statement $
2e6b0 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69 74  SQL1 and step it
2e6c0 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20 46   $NSTEP times. F
2e6d0 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a  or each row, .**
2e6e0 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
2e6f0 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69 67  leftmost and rig
2e700 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72  htmost columns r
2e710 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74 68  eturned are both
2e720 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e   integers,.** an
2e730 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e 74  d that both cont
2e740 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c  ain the same val
2e750 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65  ue..**.** Then e
2e760 78 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e 74  xecute statement
2e770 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74 68   $SQL2. Check th
2e780 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
2e790 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d   returns the sam
2e7a0 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74 65  e.** set of inte
2e7b0 67 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d 65  gers in the same
2e7c0 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68 65   order as in the
2e7d0 20 70 72 65 76 69 6f 75 73 20 73 74 65 70 20 28   previous step (
2e7e0 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f  using $SQL1)..*/
2e7f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72 74  .static int sort
2e800 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65  er_test_sort4_he
2e810 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  lper(.  void * c
2e820 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2e830 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2e840 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2e850 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2e860 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
2e870 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63  char *zSql1;.  c
2e880 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
2e890 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a  ;.  int nStep; .
2e8a0 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20    int iStep; .  
2e8b0 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30 3b  int iCksum1 = 0;
2e8c0 20 0a 20 20 69 6e 74 20 69 43 6b 73 75 6d 32 20   .  int iCksum2 
2e8d0 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a  = 0; .  int rc;.
2e8e0 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c 69    int iB;.  sqli
2e8f0 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74  te3 *db;.  sqlit
2e900 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
2e910 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35    .  if( objc!=5
2e920 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2e930 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2e940 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 51   1, objv, "DB SQ
2e950 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29 3b  L1 NSTEP SQL2");
2e960 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2e970 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2e980 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2e990 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2e9a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2e9b0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2e9c0 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31 20  _ERROR;.  zSql1 
2e9d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2e9e0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
2e9f0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2ea00 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
2ea10 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65 74  ], &nStep) ) ret
2ea20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ea30 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65 74   zSql2 = Tcl_Get
2ea40 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
2ea50 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2ea60 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
2ea70 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74 6d  zSql1, -1, &pStm
2ea80 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
2ea90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2eaa0 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20  o sql_error;..  
2eab0 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  iB = sqlite3_col
2eac0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
2ead0 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d  -1;.  for(iStep=
2eae0 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20 26  0; iStep<nStep &
2eaf0 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
2eb00 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2eb10 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20  ); iStep++){.   
2eb20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33   int a = sqlite3
2eb30 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
2eb40 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  t, 0);.    if( a
2eb50 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  !=sqlite3_column
2eb60 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29 20  _int(pStmt, iB) 
2eb70 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2eb80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2eb90 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20 28  , "data error: (
2eba0 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20 20  a!=b)", 0);.    
2ebb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ebc0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
2ebd0 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73 75  Cksum1 += (iCksu
2ebe0 6d 31 20 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20  m1 << 3) + a;.  
2ebf0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
2ec00 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2ec10 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2ec20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
2ec30 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20  _error;..  rc = 
2ec40 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
2ec50 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31  v2(db, zSql2, -1
2ec60 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2ec70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ec80 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
2ec90 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d  or;.  for(iStep=
2eca0 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
2ecb0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
2ecc0 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20  t); iStep++){.  
2ecd0 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65    int a = sqlite
2ece0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
2ecf0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73  mt, 0);.    iCks
2ed00 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20  um2 += (iCksum2 
2ed10 3c 3c 20 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20  << 3) + a;.  }. 
2ed20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
2ed30 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2ed40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ed50 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
2ed60 72 6f 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73  ror;..  if( iCks
2ed70 75 6d 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a  um1!=iCksum2 ){.
2ed80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2ed90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68  sult(interp, "ch
2eda0 65 63 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22  ecksum mismatch"
2edb0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2edc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2edd0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2ede0 3b 0a 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20  ;. sql_error:.  
2edf0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ee00 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72  (interp, "sql er
2ee10 72 6f 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f  ror: ", sqlite3_
2ee20 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
2ee30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ee40 4f 52 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  OR;.}...#ifdef S
2ee50 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2ee60 4e 54 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75  NTICATION.#inclu
2ee70 64 65 20 22 73 71 6c 69 74 65 33 75 73 65 72 61  de "sqlite3usera
2ee80 75 74 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c  uth.h"./*.** tcl
2ee90 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
2eea0 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20  er_authenticate 
2eeb0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
2eec0 57 4f 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69  WORD.*/.static i
2eed0 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 61 75 74  nt test_user_aut
2eee0 68 65 6e 74 69 63 61 74 65 28 0a 20 20 43 6c 69  henticate(.  Cli
2eef0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2ef00 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2ef10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2ef20 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2ef30 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ef40 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2ef50 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2ef60 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2ef70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ef80 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2ef90 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2efa0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2efb0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2efc0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
2efd0 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
2efe0 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  zPasswd = 0;.  i
2eff0 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a  nt nPasswd = 0;.
2f000 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2f010 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2f020 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
2f030 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2f040 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2f050 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41   "DB USERNAME PA
2f060 53 53 57 4f 52 44 22 29 3b 0a 20 20 20 20 72 65  SSWORD");.    re
2f070 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f080 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2f090 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2f0a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2f0b0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
2f0c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f0d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72  ROR;.  }.  zUser
2f0e0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2f0f0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61  (objv[2]);.  zPa
2f100 73 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74  sswd = Tcl_GetSt
2f110 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
2f120 5b 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a  [3], &nPasswd);.
2f130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
2f140 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65  ser_authenticate
2f150 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73  (db, zUser, zPas
2f160 73 77 64 2c 20 6e 50 61 73 73 77 64 29 3b 0a 20  swd, nPasswd);. 
2f170 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2f180 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2f190 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2f1a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
2f1b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2f1c0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2f1d0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2f1e0 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TION */..#ifdef 
2f1f0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2f200 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
2f210 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
2f220 33 5f 75 73 65 72 5f 61 64 64 20 44 42 20 55 53  3_user_add DB US
2f230 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20  ERNAME PASSWORD 
2f240 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69  ISADMIN.*/.stati
2f250 63 20 69 6e 74 20 74 65 73 74 5f 75 73 65 72 5f  c int test_user_
2f260 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  add(.  ClientDat
2f270 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2f280 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2f290 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2f2a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2f2b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2f2c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2f2d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2f2e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2f2f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2f300 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2f310 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2f320 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2f330 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2f340 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
2f350 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
2f360 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
2f370 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
2f380 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73  isAdmin = 0;.  s
2f390 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2f3a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
2f3b0 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
2f3c0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2f3d0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2f3e0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
2f3f0 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20  ORD ISADMIN");. 
2f400 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f410 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2f420 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2f430 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2f440 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2f450 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2f460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2f470 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
2f480 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2f490 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
2f4a0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2f4b0 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
2f4c0 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f  wd);.  Tcl_GetBo
2f4d0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2f4e0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69  erp, objv[4], &i
2f4f0 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20  sAdmin);.  rc = 
2f500 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64  sqlite3_user_add
2f510 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50 61 73  (db, zUser, zPas
2f520 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20 69 73  swd, nPasswd, is
2f530 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f 53 65  Admin);.  Tcl_Se
2f540 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2f550 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
2f560 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
2f570 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
2f580 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
2f590 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
2f5a0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
2f5b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2f5c0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2f5d0 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ION./*.** tclcmd
2f5e0 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  :  sqlite3_user_
2f5f0 63 68 61 6e 67 65 20 44 42 20 55 53 45 52 4e 41  change DB USERNA
2f600 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ME PASSWORD ISAD
2f610 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MIN.*/.static in
2f620 74 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e  t test_user_chan
2f630 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ge(.  ClientData
2f640 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2f650 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2f660 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2f670 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2f680 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2f690 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2f6a0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2f6b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2f6c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2f6d0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2f6e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2f6f0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2f700 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2f710 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
2f720 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
2f730 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
2f740 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  swd = 0;.  int i
2f750 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71  sAdmin = 0;.  sq
2f760 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2f770 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2f780 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
2f790 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2f7a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2f7b0 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
2f7c0 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20  RD ISADMIN");.  
2f7d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2f7e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2f7f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2f800 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2f810 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2f820 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2f830 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
2f840 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
2f850 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2f860 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
2f870 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2f880 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
2f890 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f  d);.  Tcl_GetBoo
2f8a0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
2f8b0 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73  rp, objv[4], &is
2f8c0 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73  Admin);.  rc = s
2f8d0 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e  qlite3_user_chan
2f8e0 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  ge(db, zUser, zP
2f8f0 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20  asswd, nPasswd, 
2f900 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f  isAdmin);.  Tcl_
2f910 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
2f920 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
2f930 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
2f940 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
2f950 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
2f960 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
2f970 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
2f980 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2f990 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2f9a0 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
2f9b0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
2f9c0 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52  r_delete DB USER
2f9d0 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
2f9e0 6e 74 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c  nt test_user_del
2f9f0 65 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ete(.  ClientDat
2fa00 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2fa10 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2fa20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2fa30 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2fa40 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2fa50 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2fa60 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2fa70 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2fa80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2fa90 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2faa0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2fab0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2fac0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2fad0 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
2fae0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2faf0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2fb00 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2fb10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2fb20 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2fb30 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22  v, "DB USERNAME"
2fb40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2fb50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2fb60 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2fb70 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2fb80 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2fb90 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
2fba0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2fbb0 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f  }.  zUser = Tcl_
2fbc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2fbd0 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
2fbe0 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64  e3_user_delete(d
2fbf0 62 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c  b, zUser);.  Tcl
2fc00 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2fc10 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
2fc20 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
2fc30 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
2fc40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2fc50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
2fc60 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
2fc70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   */../*.** tclcm
2fc80 64 3a 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20  d: bad_behavior 
2fc90 54 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f  TYPE.**.** Do so
2fca0 6d 65 20 74 68 69 6e 67 73 20 74 68 61 74 20 73  me things that s
2fcb0 68 6f 75 6c 64 20 74 72 69 67 67 65 72 20 61 20  hould trigger a 
2fcc0 76 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61  valgrind or -fsa
2fcd0 6e 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64  nitize=undefined
2fce0 0a 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68  .** warning.  Th
2fcf0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65  is is used to ve
2fd00 72 69 66 79 20 74 68 61 74 20 65 72 72 6f 72 73  rify that errors
2fd10 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75   and warnings ou
2fd20 74 70 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a  tput by those.**
2fd30 20 74 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63   tools are detec
2fd40 74 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20  ted by the test 
2fd50 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20  scripts..**.**  
2fd60 20 20 20 20 20 54 59 50 45 20 20 20 20 20 20 20       TYPE       
2fd70 42 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20  BEHAVIOR.**     
2fd80 20 20 31 20 20 20 20 20 20 20 20 20 20 4f 76 65    1          Ove
2fd90 72 66 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69  rflow a signed i
2fda0 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  nteger.**       
2fdb0 32 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20  2          Jump 
2fdc0 62 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e  based on an unin
2fdd0 69 74 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62  itialized variab
2fde0 6c 65 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20  le.**       3   
2fdf0 20 20 20 20 20 20 20 52 65 61 64 20 61 66 74 65         Read afte
2fe00 72 20 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20  r free.**       
2fe10 34 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63  4          Panic
2fe20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2fe30 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72  est_bad_behavior
2fe40 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2fe50 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
2fe60 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65  inter to an inte
2fe70 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a  ger containing z
2fe80 65 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ero */.  Tcl_Int
2fe90 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2fea0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2feb0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2fec0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2fed0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2fee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fef0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2ff00 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2ff10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2ff20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2ff30 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
2ff40 20 69 54 79 70 65 3b 0a 20 20 69 6e 74 20 78 79   iType;.  int xy
2ff50 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 28 69  z;.  int i = *(i
2ff60 6e 74 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  nt*)clientData;.
2ff70 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77    int j;.  int w
2ff80 5b 31 30 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a  [10];.  int *a;.
2ff90 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2ffa0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2ffb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ffc0 20 6f 62 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a   objv, "TYPE");.
2ffd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ffe0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2fff0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
30000 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
30010 5d 2c 20 26 69 54 79 70 65 29 20 29 20 72 65 74  ], &iType) ) ret
30020 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30030 20 73 77 69 74 63 68 28 20 69 54 79 70 65 20 29   switch( iType )
30040 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a  {.    case 1: {.
30050 20 20 20 20 20 20 78 79 7a 20 3d 20 30 78 37 66        xyz = 0x7f
30060 66 66 66 66 30 30 20 2d 20 69 3b 0a 20 20 20 20  ffff00 - i;.    
30070 20 20 78 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a    xyz += 0x100;.
30080 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
30090 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
300a0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a  cl_NewIntObj(xyz
300b0 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
300c0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
300d0 32 3a 20 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20  2: {.      w[1] 
300e0 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20 77  = 5;.      if( w
300f0 5b 69 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a  [i]>0 ) w[1]++;.
30100 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
30110 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
30120 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31  cl_NewIntObj(w[1
30130 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
30140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
30150 20 33 3a 20 7b 0a 20 20 20 20 20 20 61 20 3d 20   3: {.      a = 
30160 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69  malloc( sizeof(i
30170 6e 74 29 2a 31 30 20 29 3b 0a 20 20 20 20 20 20  nt)*10 );.      
30180 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a  for(j=0; j<10; j
30190 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20  ++) a[j] = j;.  
301a0 20 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20 20      free(a);.   
301b0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
301c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
301d0 4e 65 77 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29  NewIntObj(a[i]))
301e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
301f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
30200 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 50 61 6e   {.      Tcl_Pan
30210 69 63 28 22 44 65 6c 69 62 65 72 61 74 65 20 70  ic("Deliberate p
30220 61 6e 69 63 22 29 3b 0a 20 20 20 20 20 20 62 72  anic");.      br
30230 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
30240 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
30250 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  }  ../*.** tclcm
30260 64 3a 20 20 20 72 65 67 69 73 74 65 72 5f 64 62  d:   register_db
30270 73 74 61 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a  stat_vtab DB.**.
30280 2a 2a 20 43 61 75 73 65 20 74 68 65 20 64 62 73  ** Cause the dbs
30290 74 61 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c  tat virtual tabl
302a0 65 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62 6c  e to be availabl
302b0 65 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74  e on the connect
302c0 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ion DB.*/.static
302d0 20 69 6e 74 20 74 65 73 74 5f 72 65 67 69 73 74   int test_regist
302e0 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 28 0a  er_dbstat_vtab(.
302f0 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
30300 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
30310 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
30320 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
30330 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
30340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
30350 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
30360 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
30370 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 62 73  ult(interp, "dbs
30380 74 61 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tat not availabl
30390 65 20 62 65 63 61 75 73 65 20 6f 66 20 22 0a 20  e because of ". 
303a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303b0 20 20 20 20 20 20 20 20 20 20 22 53 51 4c 49 54            "SQLIT
303c0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
303d0 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  BLE", (void*)0);
303e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  .  return TCL_ER
303f0 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  ROR;.#else.  str
30400 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20 73  uct SqliteDb { s
30410 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a 20  qlite3 *db; };. 
30420 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 63   char *zDb;.  Tc
30430 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
30440 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  o;..  if( objc!=
30450 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
30460 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
30470 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29  , 1, objv, "DB")
30480 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
30490 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
304a0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
304b0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69  ng(objv[1]);.  i
304c0 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  f( Tcl_GetComman
304d0 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44  dInfo(interp, zD
304e0 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  b, &cmdInfo) ){.
304f0 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64 62 20      sqlite3* db 
30500 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74  = ((struct Sqlit
30510 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a  eDb*)cmdInfo.obj
30520 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b  ClientData)->db;
30530 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 73 74  .    sqlite3Dbst
30540 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a  atRegister(db);.
30550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
30560 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
30570 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
30580 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a  ALTABLE */.}../*
30590 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d  .** Register com
305a0 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20 54  mands with the T
305b0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  CL interpreter..
305c0 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73  */.int Sqlitetes
305d0 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  t1_Init(Tcl_Inte
305e0 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65  rp *interp){.  e
305f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
30600 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
30610 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30620 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
30630 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
30640 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
30650 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
30660 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65   int sqlite3_ope
30670 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20  n_file_count;.  
30680 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
30690 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20  e3_sort_count;. 
306a0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
306b0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
306c0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
306d0 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28  UNIX && defined(
306e0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
306f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
30700 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65  ING_STYLE.  exte
30710 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68  rn int sqlite3_h
30720 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69  ostid_num;.#endi
30730 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  f.  extern int s
30740 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
30750 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ize;.  extern in
30760 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  t sqlite3BtreeSh
30770 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74 28  aredCacheReport(
30780 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20 20  void*,.         
30790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e 74   Tcl_Interp*,int
307c0 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29  ,Tcl_Obj*CONST*)
307d0 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  ;.  static int i
307e0 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 73 74 61 74  Zero = 0;.  stat
307f0 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
30800 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
30810 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
30820 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
30830 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
30840 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
30860 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
30870 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
30880 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
30890 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
308b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
308c0 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
308d0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
308e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
308f0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
30900 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30910 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
30920 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
30930 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
30940 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
30950 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30960 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
30970 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
30980 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
30990 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ng",          (T
309a0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
309b0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
309c0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
309d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
309e0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
309f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30a00 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
30a10 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
30a20 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
30a30 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
30a40 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30a50 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
30a60 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
30a70 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
30a80 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
30a90 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30aa0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
30ab0 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
30ac0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
30ad0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
30ae0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30af0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
30b00 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
30b10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
30b20 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
30b30 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
30b40 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
30b50 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
30b60 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
30b70 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
30b80 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
30b90 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
30ba0 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
30bb0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
30bc0 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
30bd0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
30be0 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
30bf0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
30c00 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
30c10 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
30c20 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
30c30 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
30c40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30c50 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
30c60 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
30c70 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
30c80 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
30c90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30ca0 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
30cb0 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
30cc0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
30cd0 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
30ce0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
30cf0 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
30d00 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
30d10 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
30d20 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
30d30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30d40 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20  _exec_hex",     
30d50 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
30d60 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
30d70 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a  _hex         },.
30d80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30d90 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20  exec",          
30da0 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
30db0 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20  Proc*)test_exec 
30dc0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
30dd0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
30de0 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20  xec_nr",        
30df0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
30e00 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e  roc*)test_exec_n
30e10 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  r          },.#i
30e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30e30 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20  T_GET_TABLE.    
30e40 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
30e50 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
30e60 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
30e70 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
30e80 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69  _printf },.#endi
30e90 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
30ea0 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  3_close",       
30eb0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
30ec0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
30ed0 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c  est_close     },
30ee0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30ef0 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20  _close_v2",     
30f00 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
30f10 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
30f20 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a  st_close_v2  },.
30f30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30f40 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
30f50 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
30f60 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
30f70 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
30f80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
30f90 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
30fa0 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
30fb0 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
30fc0 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
30fd0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
30fe0 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
30ff0 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
31000 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
31010 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
31020 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
31030 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
31040 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
31050 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
31060 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31070 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
31080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31090 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
310a0 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
310b0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
310c0 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
310f0 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
31100 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
31110 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31130 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
31140 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
31150 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
31160 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31180 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
31190 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
311a0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
311b0 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
311c0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
311d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
311e0 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
311f0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
31200 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
31210 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
31220 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
31230 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
31240 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
31250 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
31260 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54  tion",        (T
31270 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
31280 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20  te_function     
31290 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
312a0 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
312b0 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63  tion",       (Tc
312c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
312d0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20  e_collation     
312e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
312f0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
31300 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  it",        (Tcl
31310 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75  _CmdProc*)get_au
31320 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  tocommit        
31330 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31340 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20  e3_stack_used", 
31350 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
31360 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74  CmdProc*)test_st
31370 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d  ack_used       }
31380 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31390 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c  3_busy_timeout",
313a0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
313b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73  mdProc*)test_bus
313c0 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c  y_timeout     },
313d0 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22  .     { "printf"
313e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
313f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
31400 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e  dProc*)test_prin
31410 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf           },.
31420 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49       { "sqlite3I
31430 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  oTrace",        
31440 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
31450 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
31460 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  e         },.   
31470 20 20 7b 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74    { "clang_sanit
31480 69 7a 65 5f 61 64 64 72 65 73 73 22 2c 20 20 20  ize_address",   
31490 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
314a0 63 2a 29 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a  c*)clang_sanitiz
314b0 65 5f 61 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d  e_address },.  }
314c0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
314d0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
314e0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
314f0 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
31500 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
31510 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
31520 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
31530 7b 20 22 62 61 64 5f 62 65 68 61 76 69 6f 72 22  { "bad_behavior"
31540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31550 20 20 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61     test_bad_beha
31560 76 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29 26 69  vior,  (void*)&i
31570 5a 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22  Zero },.     { "
31580 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f  register_dbstat_
31590 76 74 61 62 22 2c 20 20 20 20 20 20 20 20 20 20  vtab",          
315a0 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62  test_register_db
315b0 73 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20  stat_vtab  },.  
315c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
315d0 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72  nnection_pointer
315e0 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65  ",    get_sqlite
315f0 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20  _pointer, 0 },. 
31600 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
31610 69 6e 64 5f 69 6e 74 22 2c 20 20 20 20 20 20 20  ind_int",       
31620 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
31630 5f 69 6e 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a  _int,      0 },.
31640 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31650 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20  bind_zeroblob", 
31660 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
31670 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c  d_zeroblob, 0 },
31680 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31690 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
316a0 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 62 69  ",       test_bi
316b0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 2c 20 30  nd_zeroblob64, 0
316c0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
316d0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 22 2c  te3_bind_int64",
316e0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
316f0 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20 20 20 20  _bind_int64,    
31700 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
31710 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
31720 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
31730 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 2c 20 20  t_bind_double,  
31740 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
31750 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22  lite3_bind_null"
31760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
31770 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 20 20  st_bind_null    
31780 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
31790 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
317a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ",             t
317b0 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 20 20 20  est_bind_text   
317c0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
317d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
317e0 74 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  t16",           
317f0 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36  test_bind_text16
31800 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
31810 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c  "sqlite3_bind_bl
31820 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ob",            
31830 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 20   test_bind_blob 
31840 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
31850 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70   "sqlite3_bind_p
31860 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 22 2c  arameter_count",
31870 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61    test_bind_para
31880 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c  meter_count, 0},
31890 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
318a0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
318b0 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 62 69  name",   test_bi
318c0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d  nd_parameter_nam
318d0 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  e,  0},.     { "
318e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
318f0 61 6d 65 74 65 72 5f 69 6e 64 65 78 22 2c 20 20  ameter_index",  
31900 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
31910 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d 2c 0a 20  ter_index, 0},. 
31920 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
31930 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20  lear_bindings", 
31940 20 20 20 20 20 20 20 74 65 73 74 5f 63 6c 65 61         test_clea
31950 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a  r_bindings, 0},.
31960 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31970 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e  clear_bindings_n
31980 75 6c 6c 22 2c 20 20 20 74 65 73 74 5f 63 6c 65  ull",   test_cle
31990 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c  ar_bindings_null
319a0 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
319b0 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20  lite3_sleep",   
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
319d0 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20  st_sleep,       
319e0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
319f0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c  qlite3_errcode",
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
31a10 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20  est_errcode     
31a20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
31a30 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
31a40 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20  _errcode",      
31a50 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20  test_ex_errcode 
31a60 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
31a70 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22  "sqlite3_errmsg"
31a80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31a90 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20   test_errmsg    
31aa0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
31ab0 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
31ac0 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
31ad0 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20    test_errmsg16 
31ae0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
31af0 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22  { "sqlite3_open"
31b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31b10 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20     test_open    
31b20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
31b30 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
31b40 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  16",            
31b50 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20      test_open16 
31b60 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
31b70 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
31b80 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  n_v2",          
31b90 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76       test_open_v
31ba0 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  2       ,0 },.  
31bb0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
31bc0 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20  mplete16",      
31bd0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c        test_compl
31be0 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 0a  ete16    ,0 },..
31bf0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31c00 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20  prepare",       
31c10 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
31c20 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c  pare       ,0 },
31c30 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
31c40 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20  _prepare16",    
31c50 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
31c60 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d  epare16     ,0 }
31c70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31c80 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20  3_prepare_v2",  
31c90 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
31ca0 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20  repare_v2    ,0 
31cb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
31cc0 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
31cd0 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  34",       test_
31ce0 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c  prepare_tkt3134,
31cf0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
31d00 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
31d10 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
31d20 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
31d30 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
31d40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
31d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
31d60 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
31d70 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
31d80 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
31d90 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  us",           t
31da0 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  est_stmt_status 
31db0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
31dc0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20  sqlite3_reset", 
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31de0 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20  test_reset      
31df0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
31e00 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  "sqlite3_expired
31e10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31e20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20   test_expired   
31e30 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
31e40 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66   "sqlite3_transf
31e50 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  er_bindings",   
31e60 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f    test_transfer_
31e70 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20  bind ,0 },.     
31e80 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  { "sqlite3_chang
31e90 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  es",            
31ea0 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20     test_changes 
31eb0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
31ec0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70   { "sqlite3_step
31ed0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31ee0 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20      test_step   
31ef0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
31f00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c    { "sqlite3_sql
31f10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31f20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20       test_sql   
31f30 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
31f40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 65     { "sqlite3_ne
31f50 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20 20 20  xt_stmt",       
31f60 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78 74 5f        test_next_
31f70 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20  stmt     ,0 },. 
31f80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
31f90 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c 20 20  tmt_readonly",  
31fa0 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74         test_stmt
31fb0 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a  _readonly ,0 },.
31fc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
31fd0 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20 20 20  stmt_busy",     
31fe0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d          test_stm
31ff0 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20 7d 2c  t_busy     ,0 },
32000 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f 73 74  .     { "uses_st
32010 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20 20 20  mt_journal",    
32020 20 20 20 20 20 20 20 20 20 75 73 65 73 5f 73 74           uses_st
32030 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c  mt_journal ,0 },
32040 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
32050 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
32060 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 72  ",        test_r
32070 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20  elease_memory,  
32080 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
32090 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73  qlite3_db_releas
320a0 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 74  e_memory",     t
320b0 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  est_db_release_m
320c0 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20 20 20  emory,  0},.    
320d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 63   { "sqlite3_db_c
320e0 61 63 68 65 66 6c 75 73 68 22 2c 20 20 20 20 20  acheflush",     
320f0 20 20 20 20 74 65 73 74 5f 64 62 5f 63 61 63 68      test_db_cach
32100 65 66 6c 75 73 68 2c 20 20 20 20 20 20 30 7d 2c  eflush,      0},
32110 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
32120 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20  _db_filename",  
32130 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62           test_db
32140 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  _filename,      
32150 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
32160 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
32170 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  y",           te
32180 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20  st_db_readonly, 
32190 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
321a0 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f  { "sqlite3_soft_
321b0 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20  heap_limit",    
321c0 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61     test_soft_hea
321d0 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a  p_limit,    0},.
321e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
321f0 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c  thread_cleanup",
32200 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72          test_thr
32210 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20  ead_cleanup,    
32220 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
32230 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f  ite3_pager_refco
32240 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73  unts",       tes
32250 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  t_pager_refcount
32260 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20  s,    0},..     
32270 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f  { "sqlite3_load_
32280 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20  extension",     
32290 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74     test_load_ext
322a0 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a  ension,     0},.
322b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
322c0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
322d0 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61  nsion", test_ena
322e0 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20  ble_load,       
322f0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
32300 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
32310 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73  sult_codes", tes
32320 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  t_extended_resul
32330 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20  t_codes, 0},.   
32340 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d    { "sqlite3_lim
32350 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  it",            
32360 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c       test_limit,
32370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32380 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61   0},..     { "sa
32390 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  ve_prng_state", 
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61                sa
323b0 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  ve_prng_state,  
323c0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
323d0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
323e0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72  e",            r
323f0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
32400 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e, 0 },.     { "
32410 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
32420 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32430 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65  reset_prng_state
32440 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
32450 22 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f  "database_never_
32460 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20 20 20  corrupt",       
32470 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
32480 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20  corrupt, 0},.   
32490 20 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6d 61    { "database_ma
324a0 79 5f 62 65 5f 63 6f 72 72 75 70 74 22 2c 20 20  y_be_corrupt",  
324b0 20 20 20 20 20 64 61 74 61 62 61 73 65 5f 6d 61       database_ma
324c0 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d  y_be_corrupt, 0}
324d0 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69  ,.     { "optimi
324e0 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c  zation_control",
324f0 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69            optimi
32500 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30  zation_control,0
32510 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  },.#if SQLITE_OS
32520 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63  _WIN.     { "loc
32530 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20  k_win32_file",  
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
32550 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20  32_file_lock,   
32560 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78   0 },.     { "ex
32570 69 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 22  ists_win32_path"
32580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ,             wi
32590 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74 68 2c  n32_exists_path,
325a0 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66    0 },.     { "f
325b0 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ind_win32_file",
325c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
325d0 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20  in32_find_file, 
325e0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
325f0 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c  delete_win32_fil
32600 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
32610 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c  win32_delete_fil
32620 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  e,  0 },.     { 
32630 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22  "make_win32_dir"
32640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32650 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20   win32_mkdir,   
32660 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b       0 },.     {
32670 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64   "remove_win32_d
32680 69 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ir",            
32690 20 20 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20    win32_rmdir,  
326a0 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
326b0 66 0a 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62  f.     { "tcl_ob
326c0 6a 70 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20  jproc",         
326d0 20 20 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f            runAsO
326e0 62 6a 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20  bjProc,       0 
326f0 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69  },..     /* sqli
32700 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41  te3_column_*() A
32710 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71  PI */.     { "sq
32720 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
32730 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  nt",          te
32740 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20  st_column_count 
32750 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
32760 71 6c 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e  qlite3_data_coun
32770 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  t",            t
32780 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20  est_data_count  
32790 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
327a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
327b0 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
327c0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  test_column_type
327d0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
327e0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
327f0 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20  blob",          
32800 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f   test_column_blo
32810 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  b   ,0 },.     {
32820 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
32830 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
32840 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f    test_column_do
32850 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20  uble ,0 },.     
32860 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
32870 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  n_int64",       
32880 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69     test_column_i
32890 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20  nt64  ,0 },.    
328a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
328b0 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74  mn_text",   test
328c0 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f  _stmt_utf8,  (vo
328d0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
328e0 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20  mn_text },.     
328f0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
32900 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f  n_name",   test_
32910 73 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69  stmt_utf8,  (voi
32920 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
32930 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b  n_name },.     {
32940 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
32950 5f 69 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73  _int",    test_s
32960 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64  tmt_int,   (void
32970 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
32980 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20  _int  },.     { 
32990 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
329a0 62 79 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74  bytes",  test_st
329b0 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a  mt_int,   (void*
329c0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
329d0 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20  bytes},.#ifndef 
329e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
329f0 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  TYPE.     { "sql
32a00 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
32a10 74 79 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  type",test_stmt_
32a20 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
32a30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74  te3_column_declt
32a40 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  ype},.#endif.#if
32a50 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
32a60 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
32a70 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c  A.{ "sqlite3_col
32a80 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
32a90 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
32aa0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
32ab0 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
32ac0 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74  _name},.{ "sqlit
32ad0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
32ae0 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  name",test_stmt_
32af0 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
32b00 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
32b10 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74  _name},.{ "sqlit
32b20 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
32b30 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74  _name",test_stmt
32b40 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c  _utf8,(void*)sql
32b50 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
32b60 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66  in_name},.#endif
32b70 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
32b80 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
32b90 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
32ba0 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73  mn_bytes16", tes
32bb0 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69  t_stmt_int, (voi
32bc0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
32bd0 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20  n_bytes16 },.   
32be0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
32bf0 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65  umn_text16",  te
32c00 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28  st_stmt_utf16, (
32c10 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
32c20 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20  lumn_text16},.  
32c30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
32c40 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74  lumn_name16",  t
32c50 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20  est_stmt_utf16, 
32c60 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
32c70 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20  olumn_name16},. 
32c80 20 20 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e      { "add_align
32c90 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
32ca0 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e  ions", add_align
32cb0 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
32cc0 69 6f 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a  ions, 0      },.
32cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32ce0 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20  MIT_DECLTYPE.   
32cf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
32d00 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c  umn_decltype16",
32d10 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
32d20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
32d30 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36  olumn_decltype16
32d40 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
32d50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
32d60 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
32d70 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
32d80 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22  database_name16"
32d90 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,.  test_stmt_ut
32da0 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
32db0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
32dc0 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73  ase_name16},.{"s
32dd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
32de0 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73  ble_name16", tes
32df0 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
32e00 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
32e10 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36  umn_table_name16
32e20 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  },.{"sqlite3_col
32e30 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31  umn_origin_name1
32e40 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  6", test_stmt_ut
32e50 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
32e60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69  te3_column_origi
32e70 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69  n_name16},.#endi
32e80 66 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  f.#endif.     { 
32e90 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
32ea0 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74  collation_v2", t
32eb0 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  est_create_colla
32ec0 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20  tion_v2, 0 },.  
32ed0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c     { "sqlite3_gl
32ee0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20  obal_recover",  
32ef0 20 20 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72     test_global_r
32f00 65 63 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20  ecover, 0   },. 
32f10 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36      { "working_6
32f20 34 62 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20  4bit_int",      
32f30 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69      working_64bi
32f40 74 5f 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a  t_int,   0   },.
32f50 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69       { "vfs_unli
32f60 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  nk_test",       
32f70 20 20 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f       vfs_unlink_
32f80 74 65 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c  test,     0   },
32f90 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69  .     { "vfs_ini
32fa0 74 66 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20  tfail_test",    
32fb0 20 20 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61        vfs_initfa
32fc0 69 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d  il_test,   0   }
32fd0 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e  ,.     { "vfs_un
32fe0 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20  register_all",  
32ff0 20 20 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67         vfs_unreg
33000 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20  ister_all,  0   
33010 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72  },.     { "vfs_r
33020 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20  eregister_all", 
33030 20 20 20 20 20 20 20 20 76 66 73 5f 72 65 72 65          vfs_rere
33040 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20  gister_all,  0  
33050 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
33060 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20  _control_test", 
33070 20 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f           file_co
33080 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20  ntrol_test,   0 
33090 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
330a0 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
330b0 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f  rno_test", file_
330c0 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
330d0 6f 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a  o_test,  0   },.
330e0 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
330f0 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
33100 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72  est", file_contr
33110 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
33120 74 2c 20 20 30 20 20 20 7d 2c 0a 23 69 66 64 65  t,  0   },.#ifde
33130 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 20 20  f __APPLE__.    
33140 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
33150 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74 22 2c  _truncate_test",
33160 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72   file_control_tr
33170 75 6e 63 61 74 65 5f 74 65 73 74 2c 20 20 30 20  uncate_test,  0 
33180 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
33190 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63  e_control_replac
331a0 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  e_test", file_co
331b0 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65  ntrol_replace_te
331c0 73 74 2c 20 20 30 20 20 20 7d 2c 0a 23 65 6e 64  st,  0   },.#end
331d0 69 66 20 0a 20 20 20 20 20 7b 20 22 66 69 6c 65  if .     { "file
331e0 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
331f0 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  ze_test", file_c
33200 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
33210 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
33220 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
33230 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
33240 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  t",  file_contro
33250 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c  l_sizehint_test,
33260 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51     0   },.#if SQ
33270 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20  LITE_OS_WIN.    
33280 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
33290 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22  _win32_av_retry"
332a0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  , file_control_w
332b0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20  in32_av_retry,  
332c0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
332d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
332e0 32 5f 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66  2_set_handle", f
332f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
33300 32 5f 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20  2_set_handle, 0 
33310 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
33320 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
33330 70 65 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20  persist_wal",   
33340 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
33350 72 73 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30  rsist_wal,     0
33360 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
33370 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
33380 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c  safe_overwrite",
33390 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
333a0 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
333b0 2c 30 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c  ,0},.     { "fil
333c0 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
333d0 65 22 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f  e",        file_
333e0 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c  control_vfsname,
333f0 20 20 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a           0   },.
33400 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
33410 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d  trol_tempfilenam
33420 65 22 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  e",   file_contr
33430 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c  ol_tempfilename,
33440 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20      0   },.     
33450 7b 20 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c  { "sqlite3_vfs_l
33460 69 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ist",           
33470 76 66 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20  vfs_list,     0 
33480 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
33490 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
334a0 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63  tion_v2", test_c
334b0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
334c0 32 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  2, 0 },.     { "
334d0 70 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 22 2c 20  path_is_local", 
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
334f0 68 5f 69 73 5f 6c 6f 63 61 6c 2c 20 20 30 20 20  h_is_local,  0  
33500 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 61 74 68   },.     { "path
33510 5f 69 73 5f 64 6f 73 22 2c 20 20 20 20 20 20 20  _is_dos",       
33520 20 20 20 20 20 20 20 20 20 70 61 74 68 5f 69 73           path_is
33530 5f 64 6f 73 2c 20 20 30 20 20 20 7d 2c 0a 0a 20  _dos,  0   },.. 
33540 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73      /* Functions
33550 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69   from os.h */.#i
33560 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33570 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22  T_UTF16.     { "
33580 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
33590 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
335a0 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20  ollate, 0       
335b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
335c0 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65  add_test_collate
335d0 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63  _needed", test_c
335e0 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30  ollate_needed, 0
335f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
33600 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
33610 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66  n",       test_f
33620 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20  unction, 0      
33630 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
33640 61 64 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69  add_test_utf16bi
33650 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74  n_collate",    t
33660 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
33670 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d  late, 0        }
33680 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
33690 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72  "sqlite3_test_er
336a0 72 73 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f  rstr",     test_
336b0 65 72 72 73 74 72 2c 20 30 20 20 20 20 20 20 20  errstr, 0       
336c0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
336d0 22 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79  "tcl_variable_ty
336e0 70 65 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76  pe",       tcl_v
336f0 61 72 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20  ariable_type, 0 
33700 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
33710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
33720 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b  RED_CACHE.     {
33730 20 22 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65   "sqlite3_enable
33740 5f 73 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20  _shared_cache", 
33750 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72  test_enable_shar
33760 65 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ed, 0  },.     {
33770 20 22 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64   "sqlite3_shared
33780 5f 63 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20  _cache_report", 
33790 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
337a0 65 64 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30  edCacheReport, 0
337b0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
337c0 20 22 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72   "sqlite3_libver
337d0 73 69 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65  sion_number", te
337e0 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  st_libversion_nu
337f0 6d 62 65 72 2c 20 30 20 20 7d 2c 0a 20 20 20 20  mber, 0  },.    
33800 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 61 62 6c   { "sqlite3_tabl
33810 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
33820 61 22 2c 20 74 65 73 74 5f 74 61 62 6c 65 5f 63  a", test_table_c
33830 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 2c 20  olumn_metadata, 
33840 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  0  },.#ifndef SQ
33850 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
33860 4f 42 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  OB.     { "sqlit
33870 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c  e3_blob_reopen",
33880 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f 70 65   test_blob_reope
33890 6e 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  n, 0  },.#endif.
338a0 20 20 20 20 20 7b 20 22 70 63 61 63 68 65 5f 73       { "pcache_s
338b0 74 61 74 73 22 2c 20 20 20 20 20 20 20 74 65 73  tats",       tes
338c0 74 5f 70 63 61 63 68 65 5f 73 74 61 74 73 2c 20  t_pcache_stats, 
338d0 30 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c  0  },.#ifdef SQL
338e0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
338f0 4b 5f 4e 4f 54 49 46 59 0a 20 20 20 20 20 7b 20  K_NOTIFY.     { 
33900 22 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f  "sqlite3_unlock_
33910 6e 6f 74 69 66 79 22 2c 20 74 65 73 74 5f 75 6e  notify", test_un
33920 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c 20 30 20 20  lock_notify, 0  
33930 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
33940 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   "sqlite3_wal_ch
33950 65 63 6b 70 6f 69 6e 74 22 2c 20 20 20 74 65 73  eckpoint",   tes
33960 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
33970 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
33980 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
33990 6b 70 6f 69 6e 74 5f 76 32 22 2c 74 65 73 74 5f  kpoint_v2",test_
339a0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
339b0 32 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20  2, 0  },.     { 
339c0 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74  "sqlite3_wal_aut
339d0 6f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 74 65 73  ocheckpoint",tes
339e0 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  t_wal_autocheckp
339f0 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20  oint, 0  },.    
33a00 20 7b 20 22 74 65 73 74 5f 73 71 6c 69 74 65 33   { "test_sqlite3
33a10 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74  _log",         t
33a20 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 2c  est_sqlite3_log,
33a30 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53   0  },.#ifndef S
33a40 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
33a50 49 4e 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74  IN.     { "print
33a60 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72 79 5f 70  _explain_query_p
33a70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72 69 6e 74  lan", test_print
33a80 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23 65 6e 64  _eqp, 0  },.#end
33a90 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  if.     { "sqlit
33aa0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 22  e3_test_control"
33ab0 2c 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74  , test_test_cont
33ac0 72 6f 6c 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54  rol },.#if SQLIT
33ad0 45 5f 4f 53 5f 55 4e 49 58 0a 20 20 20 20 20 7b  E_OS_UNIX.     {
33ae0 20 22 67 65 74 72 75 73 61 67 65 22 2c 20 74 65   "getrusage", te
33af0 73 74 5f 67 65 74 72 75 73 61 67 65 20 7d 2c 0a  st_getrusage },.
33b00 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 6c  #endif.     { "l
33b10 6f 61 64 5f 73 74 61 74 69 63 5f 65 78 74 65 6e  oad_static_exten
33b20 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61 64 53 74  sion", tclLoadSt
33b30 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64  aticExtensionCmd
33b40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74   },.     { "sort
33b50 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
33b60 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  ", sorter_test_f
33b70 61 6b 65 68 65 61 70 20 7d 2c 0a 20 20 20 20 20  akeheap },.     
33b80 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 73  { "sorter_test_s
33b90 6f 72 74 34 5f 68 65 6c 70 65 72 22 2c 20 73 6f  ort4_helper", so
33ba0 72 74 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f  rter_test_sort4_
33bb0 68 65 6c 70 65 72 20 7d 2c 0a 23 69 66 64 65 66  helper },.#ifdef
33bc0 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
33bd0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20  HENTICATION.    
33be0 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65 72   { "sqlite3_user
33bf0 5f 61 75 74 68 65 6e 74 69 63 61 74 65 22 2c 20  _authenticate", 
33c00 74 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e  test_user_authen
33c10 74 69 63 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20  ticate, 0 },.   
33c20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73 65    { "sqlite3_use
33c30 72 5f 61 64 64 22 2c 20 20 20 20 20 20 20 20 20  r_add",         
33c40 20 74 65 73 74 5f 75 73 65 72 5f 61 64 64 2c 20   test_user_add, 
33c50 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20           0 },.  
33c60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 73     { "sqlite3_us
33c70 65 72 5f 63 68 61 6e 67 65 22 2c 20 20 20 20 20  er_change",     
33c80 20 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e    test_user_chan
33c90 67 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ge,       0 },. 
33ca0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
33cb0 73 65 72 5f 64 65 6c 65 74 65 22 2c 20 20 20 20  ser_delete",    
33cc0 20 20 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c     test_user_del
33cd0 65 74 65 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ete,       0 },.
33ce0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
33cf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
33d00 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20  _SCANSTATUS.    
33d10 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74   { "sqlite3_stmt
33d20 5f 73 63 61 6e 73 74 61 74 75 73 22 2c 20 20 20  _scanstatus",   
33d30 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 63      test_stmt_sc
33d40 61 6e 73 74 61 74 75 73 2c 20 20 20 30 20 7d 2c  anstatus,   0 },
33d50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33d60 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
33d70 5f 72 65 73 65 74 22 2c 20 74 65 73 74 5f 73 74  _reset", test_st
33d80 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
33d90 73 65 74 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64  set,   0 },.#end
33da0 69 66 0a 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  if..  };.  stati
33db0 63 20 69 6e 74 20 62 69 74 6d 61 73 6b 5f 73 69  c int bitmask_si
33dc0 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d  ze = sizeof(Bitm
33dd0 61 73 6b 29 2a 38 3b 0a 20 20 73 74 61 74 69 63  ask)*8;.  static
33de0 20 69 6e 74 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f   int longdouble_
33df0 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 4c 4f  size = sizeof(LO
33e00 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3b 0a  NGDOUBLE_TYPE);.
33e10 20 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72    int i;.  exter
33e20 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  n int sqlite3_sy
33e30 6e 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65  nc_count, sqlite
33e40 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
33e50 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
33e60 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
33e70 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
33e80 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65  int sqlite3_like
33e90 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
33ea0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65   int sqlite3_xfe
33eb0 72 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  ropt_count;.  ex
33ec0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
33ed0 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
33ee0 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
33ef0 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
33f00 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20  writedb_count;. 
33f10 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
33f20 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
33f30 5f 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49  _count;.#if SQLI
33f40 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65  TE_OS_WIN.  exte
33f50 72 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65  rn LONG volatile
33f60 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
33f70 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
33f80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65  SQLITE_DEBUG.  e
33f90 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
33fa0 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65  3WhereTrace;.  e
33fb0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
33fc0 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65  3OSTrace;.  exte
33fd0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61  rn int sqlite3Wa
33fe0 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23  lTrace;.#endif.#
33ff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
34000 54 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  T.#ifdef SQLITE_
34010 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78  ENABLE_FTS3.  ex
34020 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
34030 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72  _fts3_enable_par
34040 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66  entheses;.#endif
34050 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69  .#endif..  for(i
34060 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d  =0; i<sizeof(aCm
34070 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30  d)/sizeof(aCmd[0
34080 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63  ]); i++){.    Tc
34090 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  l_CreateCommand(
340a0 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e  interp, aCmd[i].
340b0 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78  zName, aCmd[i].x
340c0 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Proc, 0, 0);.  }
340d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
340e0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69  zeof(aObjCmd)/si
340f0 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29  zeof(aObjCmd[0])
34100 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
34110 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
34120 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64  (interp, aObjCmd
34130 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20  [i].zName, .    
34140 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78      aObjCmd[i].x
34150 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d  Proc, aObjCmd[i]
34160 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b  .clientData, 0);
34170 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  .  }.  Tcl_LinkV
34180 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34190 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22  te_search_count"
341a0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
341b0 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f  &sqlite3_search_
341c0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
341d0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
341e0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
341f0 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22  ite_found_count"
34200 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
34210 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63  &sqlite3_found_c
34220 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
34230 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
34240 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34250 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20  te_sort_count", 
34260 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
34270 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e  qlite3_sort_coun
34280 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
34290 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
342a0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
342b0 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20  _max_blobsize", 
342c0 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
342d0 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73  qlite3_max_blobs
342e0 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ize, TCL_LINK_IN
342f0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
34300 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
34310 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a  e_like_count", .
34320 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
34330 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74  lite3_like_count
34340 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
34350 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
34360 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69  nterp, "sqlite_i
34370 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c  nterrupt_count",
34380 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
34390 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
343a0 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  t_count, TCL_LIN
343b0 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69  K_INT);.  Tcl_Li
343c0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
343d0 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
343e0 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28  count", .      (
343f0 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
34400 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20  pen_file_count, 
34410 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
34420 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
34430 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72  erp, "sqlite_cur
34440 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20  rent_time", .   
34450 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
34460 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c  e3_current_time,
34470 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
34480 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
34490 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
344a0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
344b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
344c0 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69  G_STYLE.  Tcl_Li
344d0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
344e0 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d  qlite_hostid_num
344f0 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
34500 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64  )&sqlite3_hostid
34510 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  _num, TCL_LINK_I
34520 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63  NT);.#endif.  Tc
34530 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
34540 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f  , "sqlite3_xfero
34550 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  pt_count",.     
34560 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
34570 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20  _xferopt_count, 
34580 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
34590 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
345a0 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61  erp, "sqlite3_pa
345b0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
345c0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
345d0 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72  &sqlite3_pager_r
345e0 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  eaddb_count, TCL
345f0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
34600 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
34610 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
34620 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c  _writedb_count",
34630 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
34640 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
34650 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  tedb_count, TCL_
34660 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
34670 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
34680 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
34690 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20  writej_count",. 
346a0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
346b0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
346c0 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e  j_count, TCL_LIN
346d0 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20  K_INT);.#ifndef 
346e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
346f0 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  6.  Tcl_LinkVar(
34700 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e  interp, "unalign
34710 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
34720 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  r",.      (char*
34730 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69  )&unaligned_stri
34740 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f  ng_counter, TCL_
34750 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69  LINK_INT);.#endi
34760 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
34770 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63  _OMIT_UTF16.  Tc
34780 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
34790 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e  , "sqlite_last_n
347a0 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22  eeded_collation"
347b0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
347c0 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f  pzNeededCollatio
347d0 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  n, TCL_LINK_STRI
347e0 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44  NG|TCL_LINK_READ
347f0 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23  _ONLY);.#endif.#
34800 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
34810 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
34820 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f  nterp, "sqlite_o
34830 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28  s_type",.      (
34840 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f  char*)&sqlite3_o
34850 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b  s_type, TCL_LINK
34860 5f 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23  _LONG);.#endif.#
34870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
34880 54 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  T.  {.    static
34890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65   const char *que
348a0 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f  ry_plan = "*** O
348b0 42 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45  BSOLETE VARIABLE
348c0 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c   ***";.    Tcl_L
348d0 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
348e0 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61  sqlite_query_pla
348f0 6e 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72  n",.       (char
34900 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54  *)&query_plan, T
34910 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
34920 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
34930 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  Y);.  }.#endif.#
34940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
34950 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
34960 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
34970 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
34980 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
34990 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
349a0 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
349b0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
349c0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
349d0 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
349e0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
349f0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
34a00 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
34a10 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54  ITE_OMIT_WAL.  T
34a20 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
34a30 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74  p, "sqlite_wal_t
34a40 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
34a50 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54  ar*)&sqlite3WalT
34a60 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
34a70 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  NT);.#endif.#end
34a80 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
34a90 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
34aa0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
34ab0 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
34ac0 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
34ad0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
34ae0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
34af0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
34b00 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
34b10 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
34b20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
34b30 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
34b40 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
34b50 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
34b60 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
34b70 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
34b80 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34b90 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
34ba0 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
34bb0 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
34bc0 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
34bd0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
34be0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
34bf0 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
34c00 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
34c10 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
34c20 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
34c30 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
34c40 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
34c50 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
34c60 74 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  te_data_director
34c70 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  y",.      (char*
34c80 29 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  )&sqlite3_data_d
34c90 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49  irectory, TCL_LI
34ca0 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63  NK_STRING);.  Tc
34cb0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
34cc0 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22  , "bitmask_size"
34cd0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
34ce0 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43  bitmask_size, TC
34cf0 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c  L_LINK_INT|TCL_L
34d00 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
34d10 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
34d20 74 65 72 70 2c 20 22 6c 6f 6e 67 64 6f 75 62 6c  terp, "longdoubl
34d30 65 5f 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28  e_size",.      (
34d40 63 68 61 72 2a 29 26 6c 6f 6e 67 64 6f 75 62 6c  char*)&longdoubl
34d50 65 5f 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b  e_size, TCL_LINK
34d60 5f 49 4e 54 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45  _INT|TCL_LINK_RE
34d70 41 44 5f 4f 4e 4c 59 29 3b 0a 20 20 54 63 6c 5f  AD_ONLY);.  Tcl_
34d80 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
34d90 22 73 71 6c 69 74 65 5f 73 79 6e 63 5f 63 6f 75  "sqlite_sync_cou
34da0 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
34db0 2a 29 26 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  *)&sqlite3_sync_
34dc0 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
34dd0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
34de0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
34df0 69 74 65 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  ite_fullsync_cou
34e00 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  nt",.      (char
34e10 2a 29 26 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  *)&sqlite3_fulls
34e20 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  ync_count, TCL_L
34e30 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 20 64 65  INK_INT);.#if de
34e40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
34e50 42 4c 45 5f 46 54 53 33 29 20 26 26 20 64 65 66  BLE_FTS3) && def
34e60 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
34e70 29 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ).  Tcl_LinkVar(
34e80 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
34e90 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
34ea0 6e 74 68 65 73 65 73 22 2c 0a 20 20 20 20 20 20  ntheses",.      
34eb0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
34ec0 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
34ed0 6e 74 68 65 73 65 73 2c 20 54 43 4c 5f 4c 49 4e  ntheses, TCL_LIN
34ee0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20  K_INT);.#endif. 
34ef0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
34f00 7d 0a                                            }.